## Java and Python support
Visual System Integrator 2017.1 and onwards provides builtin bindings for Python and Java. A user can use Python and/or Java to call FPGA core directly or go through an intermediary C/C++ block. In addition, a Python/Java callback can be initiated directly from FPGA. Moreover, a mix/match between Python, Java and C/C++ can be used in a single system1
This enables the user to easily integrate their existing workflow, utilize existing language expertise and third-party libraries effortlessly. It can also be used to integrate the VSI output with another system using one of the external language.
For experimentation and/or research, it allows a system architect to keep well-tested and established parts of the system in C/C++/FPGA while allowing rapid prototyping using Python or Java.
### Enabling External Language Support
Any version beyond VSI 2017.1 already has external language support.
### Walkthrough for Python
- For the purpose of demonstration in this walkthrough, we will use a simple python function included in vsi_examples repository. Using git, clone the vsi_examples repository: `https://github.com/systemviewinc/vsi-examples.git`.
- Create a new project and work through the wizard to the end. Select any part/board as it won't matter since we're only going to be using the software for the walkthrough.
- Click `menu->flow->Create Platform`. Accept the prefilled default options and Press okay.
- Click `menu->flow->Create Context`. Change the dropdown to `Software` and enter name as `python_test`. Press okay.
- Open Context block properties by double clicking inside `python test` and scroll down to `Software Parameters->language`
- Select the target language you intend to use for the context. For this walkthrough, we will use `Python`
- Ensure that `-static` flag is NOT included in `C` or `C++` compile options. Remove it if you see it included.
- Set the python version in `Python Options` section to 2.7x. Press okay to close the properties dialog.
- Select `menu->Flow->Compile Platform`.
- Then create a system canvas by selecting `flow->create system`. Accept the prefilled defaults.
- Open the newly created system canvas and select `menu->Flow->Import Platform`
- Double click the `python_test` context to enter hierarchy.
- (Optionally) Verify that the correct language is available in the desired context in System Canvas.
- Add a new `VSI Software Wizard` block by right clicking and selecting `VSI Software Wizard`.
- Open newly added block properties by double-clicking it.
- Change the `Source Language` in `Source Parameters` to `Python`.
- Click browse beside `Source Directory` and browse to select source code directory `/example_1`.
- The `Python Function` dropdown box should be populated with multiple entries. Open and select `process_stream`.
- Change the direction of `Arg 2` in Arguments section to `output`. Press okay to close properties.
- Add a new `VSI Software Wizard` block by right clicking and selecting `VSI Software Wizard`.
- Open newly added block properties by double-clicking it.
- Click browse beside `Source Directory` and browse to select source code directory `/example_1`.
- The `C/C++ Function` dropdown box should be populated with multiple entries. Open and select `process_tcp1`.
- Change the direction of `Arg 2` in Arguments section to `output`. Press okay to close properties.
- Drag and connect each input to output so that two blocks are connected together. i.e sbOut of python block should be connected to in1 of C/C++ block and sbIn of python block should be connected to out1 of C/C++ block.
- Select `flow->Generate System`.
- Select `flow->Build Software Contexts` and then Select `Build`.
- Wait for the build to successfully complete.
- Browse to the directory `/vsi_auto_gen/sw/system_1` in a terminal.
- Run the system by using the following command `python python_test/python/python_test_main.py`
- The example will send 256 bytes of data through each block. A statement on console is printed every 100,000 iteration.
### Walkthrough for Java
- For the purpose of demonstration in this walkthrough, we will use a simple java function included in vsi_examples repository. Using git, clone the vsi_examples repository: `https://github.com/systemviewinc/vsi-examples.git`.
- Create a new project and work through the wizard to the end. Select any part/board as it won't matter since we're only going to be using the software for the walkthrough.
- Click `menu->flow->Create Platform`. Accept the prefilled default options and Press okay.
- Click `menu->flow->Create Context`. Change the dropdown to `Software` and enter name as `java_test`. Press okay.
- Open Context block properties by double clicking inside `java test` and scroll down to `Software Parameters->language`
- Select the target language you intend to use for the context. For this walkthrough, we will use `java`
- Ensure that `-static` flag is NOT included in `C` or `C++` compile options. Remove it if you see it included.
- Set the java version in `java Options` section to 2.7x. Press okay to close the properties dialog.
- Select `menu->Flow->Compile Platform`.
- Then create a system canvas by selecting `flow->create system`. Accept the prefilled defaults.
- Open the newly created system canvas and select `menu->Flow->Import Platform`
- Double click the `java_test` context to enter hierarchy.
- (Optionally) Verify that the correct language is available in the desired context in System Canvas.
- Add a new `VSI Software Wizard` block by right clicking and selecting `VSI Software Wizard`.
- Open newly added block properties by double-clicking it.
- Change the `Source Language` in `Source Parameters` to `java`.
- Click browse beside `Source Directory` and browse to select source code directory `/example_1`.
- The `Java Function` dropdown box should be populated with multiple entries. Open and select `process_stream`.
- Change the direction of `Arg 2` in Arguments section to `output`.
- Change size for each `arg 1` and `arg 2` to be 256 bytes. Press okay to close properties.
- Add a new `VSI Software Wizard` block by right clicking and selecting `VSI Software Wizard`.
- Open newly added block properties by double-clicking it.
- Click browse beside `Source Directory` and browse to select source code directory `/example_1`.
- The `C/C++ Function` dropdown box should be populated with multiple entries. Open and select `test_java`.
- Change the direction of `Arg 2` in Arguments section to `output`. Press okay to close properties.
- Drag and connect each input to output so that two blocks are connected together. i.e sbOut of java block should be connected to inc of C/C++ block and sbIn of java block should be connected to out of C/C++ block.
- Select `flow->Generate System`.
- Select `flow->Build Software Contexts` and then Select `Build`.
- Wait for the build to successfully complete.
- Browse to the directory `/vsi_auto_gen/sw/system_1` in a terminal.
- Run the system by using the following command `java -classpath build/java_test/java/java_test.jar java_test_main`
- The example will send 256 bytes of data through each block. A statement on console is printed every 100,000 iteration.
## Exercise
- Try modifying the test string in example code and verify that the printed statement changes.
- Modify the iteration cycle when a statement is printed to 1,000,000.
- Change the design to have another python/java block.
### Footnotes
1. A single context can only support a mix of one external language and C/C++. For example Java and C/C++ or Python and C/C++. In order to use both Java and C++, a logical partitioning of contexts, each supporting an external language has to be used. VSI Software Interconnect can be used to seamlessly connect the two context without any handwritten code.