From dcaed24267c221f62e806fe60d9cb760b80296e4 Mon Sep 17 00:00:00 2001 From: bbrzyski Date: Fri, 6 Sep 2024 11:51:13 +0200 Subject: [PATCH] Rewrite Getting started section of docs Make Getting started focus more on use of gui with simple example Internal-tag: [#65130] Signed-off-by: bbrzyski --- docs/source/getting_started.md | 304 +++++++++--------- docs/source/img/getting_started_project.png | Bin 0 -> 58644 bytes docs/source/img/kpm_buttons.png | Bin 0 -> 2880 bytes docs/source/img/save_graph_kpm.png | Bin 0 -> 26051 bytes docs/source/img/side_bar_kpm.png | Bin 0 -> 28440 bytes docs/source/index.md | 1 + docs/source/installation.md | 50 +++ examples/getting_started_demo/design.v | 0 .../getting_started_demo/kpm/dataflow.json | 221 +++++++++++++ .../kpm/specification.json | 224 +++++++++++++ examples/getting_started_demo/project.yml | 24 ++ .../verilogs/simple_core_1.v | 7 + .../verilogs/simple_core_2.v | 7 + topwrap/cli.py | 2 +- 14 files changed, 686 insertions(+), 154 deletions(-) create mode 100644 docs/source/img/getting_started_project.png create mode 100644 docs/source/img/kpm_buttons.png create mode 100644 docs/source/img/save_graph_kpm.png create mode 100644 docs/source/img/side_bar_kpm.png create mode 100644 docs/source/installation.md create mode 100644 examples/getting_started_demo/design.v create mode 100644 examples/getting_started_demo/kpm/dataflow.json create mode 100644 examples/getting_started_demo/kpm/specification.json create mode 100644 examples/getting_started_demo/project.yml create mode 100644 examples/getting_started_demo/verilogs/simple_core_1.v create mode 100644 examples/getting_started_demo/verilogs/simple_core_2.v diff --git a/docs/source/getting_started.md b/docs/source/getting_started.md index bfc5f246..1a2cb765 100644 --- a/docs/source/getting_started.md +++ b/docs/source/getting_started.md @@ -2,221 +2,219 @@ # Getting started -## Installation +Goal of this chapter is to show step by step how to create simple design with topwrap. -1. Install required system packages: +All necessary files to follow this guide are in `examples/getting_started_demo` directory. - Debian: - ```bash - apt install -y git g++ make python3 python3-pip antlr4 libantlr4-runtime-dev yosys npm - ``` +:::{admonition} Important +:class: attention +This is just an example, if you haven't installed the topwrap yet go to the [Installation chapter](installation.md) and make sure to install additional dependencies for `topwrap parse`. +::: + +## Design overview - Arch: - ```bash - pacman -Syu git gcc make python3 python-pip antlr4 antlr4-runtime yosys npm - ``` +The design we are going to create is visually represented below: - Fedora: - ```bash - dnf install git g++ make python3 python3-pip python3-devel antlr4 antlr4-cpp-runtime-devel yosys npm - ``` +```{kpm_iframe} +:spec: ../../examples/getting_started_demo/kpm/specification.json +:dataflow: ../../examples/getting_started_demo/kpm/dataflow.json +``` -2. Install the Topwrap package (It is highly recommended to run this step in a Python virtual environment, e.g. [venv](https://docs.python.org/3/library/venv.html)): +It consists of two cores: `simple_core_1` and `simple_core_2` that are connected to each other and to some external metanodes. - ```bash - pip install . - ``` +## Parsing verilog files + +First step in creating own designs is to parse verilog files into ip core description yamls that are understood by topwrap. + +In the `verilogs` directory you can find two verilog files which describe `simple_core_1` and `simple_core_2`. + +To generate ip core descriptions from these verilogs run: -:::{note} -To use `topwrap parse` command you also need to install optional dependencies: ```bash -pip install ".[topwrap-parse]" +topwrap parse verilogs/{simple_core_1.v,simple_core_2.v} ``` -On Arch-based distributions a symlink to antlr4 runtime library needs to created and an environment variable set: + +Topwrap will generate two files `gen_simple_core_1.yaml` and `gen_simple_core_2.yaml` that represent corresponding verilogs. + +## Building design with topwrap + +### Creating the design + +Generated ip core yamls can be loaded into GUI. + +1. Build and run gui server ```bash -ln -s /usr/share/java/antlr-complete.jar antlr4-complete.jar -ANTLR_COMPLETE_PATH=`pwd` pip install ".[topwrap-parse]" +topwrap kpm_build_server && topwrap kpm_run_server & ``` -On Fedora-based distributions symlinks need to be made inside `/usr/share/java` directory itself: + +2. Run gui client with the generated ip core yamls ```bash -sudo ln -s /usr/share/java/stringtemplate4/ST4.jar /usr/share/java/stringtemplate4.jar -sudo ln -s /usr/share/java/antlr4/antlr4.jar /usr/share/java/antlr4.jar -sudo ln -s /usr/share/java/antlr4/antlr4-runtime.jar /usr/share/java/antlr4-runtime.jar -sudo ln -s /usr/share/java/treelayout/org.abego.treelayout.core.jar /usr/share/java/treelayout.jar -pip install ".[topwrap-parse]" +topwrap kpm_client gen_simple_core_1.yaml gen_simple_core_2.yaml ``` -::: -(example-usage)= +Now when you connect to [http://127.0.0.1:5000](http://127.0.0.1:5000) there should be kpm gui. -## Example usage +Loaded ip cores can be found under IPcore section: -This section demonstrates the basic usage of Topwrap to generate IP wrappers and a top module. +```{image} img/side_bar_kpm.png +``` -1. Create {ref}`IP core description ` file for every IP Core you want to use or let {ref}`topwrap parse ` handle this for you. This file describes the ports, parameters and interfaces of an IP core. +With these IPcores and default metanodes you can easily create designs by dragging cores and connecting them. -As an example, Verilog module such as: +Let's make the design from the demo that was shown at the beginning of this guide. -```verilog -module ibuf ( - input wire clk, - input wire rst, - input wire a, - output reg z -); - // ... -endmodule +```{image} img/getting_started_project.png ``` -Needs this corresponding description: +:::{note} +You can change name of node by right clicking on it and selecting `rename`. +::: -```yaml -signals: - in: - - clk - - rst - - a - out: - - z +You can save the project to the [Design Description](description_files.md) format, which is used by topwrap to represent the created design. + +To do this select the graph button and select `Save file`. + +```{image} img/save_graph_kpm.png ``` -2. Create a {ref}`design description ` file where you can specify all instances of IP cores and connections between them (`project.yaml` in this example) +:::{note} +The difference between `Save file` and `Save graph file` lays in which format will be used for saving. -- Create instances of IP cores: +`Save file` will save the design description in yaml format which topwrap uses. -```yaml -ips: - vexriscv_instance: - file: ipcores/gen_VexRiscv.yaml - wb_ram_data_instance: - file: ipcores/gen_mem.yaml - wb_ram_instr_instance: - file: ipcores/gen_mem.yaml +`Save graph file` will save the design in graph json format which kpm uses. You should only choose this one if you have some specific custom layout of nodes in design and you want to save it. +::: -``` +### Generating verilog -`file` and `module` are mandatory fields providing the IP description file and the name of the HDL module as it appears in the source. +You can generate verilog from design created in previous section. -- (Optional) Set parameters for IP core instances: -```yaml -parameters: - wb_ram_data_instance: - depth: 0x1000 - memfile: '"top_sram.init"' - wb_ram_instr_instance: - depth: 0xA000 - memfile: '"bios.init"' +If you have the example running as described in previous section then on the top bar you should see these 4 buttons: + +```{image} img/kpm_buttons.png ``` -Note that string parameters have to be wrapped in single quotation marks like this: `'"string value"'`. +First one is for loading or saving designs. +Second is for toggling node browser. +Third one is for validating the design. +And the fourth is for running the design which will generate the verilog file in `/build` directory of the current example and run the design. -- Connect desired ports of the IP cores: +## Appendix: Command-line flow -```yaml -ports: - wb_ram_data_instance: - clk: [some_other_ip, clk_out] - rst: [reset_core, reset0] - wb_ram_instr_instance: - clk: [some_other_ip, clk_out] - rst: [reset_core, reset0] - vexriscv_instance: - softwareInterrupt: [some_other_ip, sw_interrupt] - ... -``` +### Creating the design -Connections only need to be written once, i.e. if A connects to B, then only a connection A: B has to be specified (B: A is redundant). +Manual creation of designs requires familiarity with [Design Description](description_files.md) format. -- Connect desired interfaces of the IP cores: +First let's include all the ip core files we will need in the `ips` section. ```yaml -interfaces: - vexriscv_instance: - iBusWishbone: [wb_ram_instr_instance, mem_bus] - dBusWishbone: [wb_ram_data_instance, mem_bus] +ips: + simple_core_1: + file: gen_simple_core_1.yaml + simple_core_2: + file: gen_simple_core_2.yaml ``` -- Specify external ports or interfaces of the top module and connect them with chosen IP cores' ports or interfaces: +Notice that here we also declare how to node will be named. +Ip core `gen_simple_core_1.yaml` will be named `simple_core_1` in gui. +Now we can start creating the design under the `design` section. +Our design doesn't have any parameters so we can skip this part and go straight into `ports` section. +There we define connections between ip cores. +In demo example there is only one connection - between `gen_simple_core_1` and `gen_simple_core_2`. +In our design it will look like below: ```yaml -ports: - vexriscv_instance: - timerInterrupt: ext_timer_interrupt +design: + ports: + simple_core_2: + a: + - simple_core_1 + - z +``` -... +Notice that we connect `input` to `output`. +All left to do are external connections to metanodes. +We declare them like this: +```yaml external: ports: + in: + - rst + - clk out: - - ext_timer_interrupt - interfaces: - ... + - Output_y + - Output_c ``` -3. Create a Core file template for FuseSoC, or use a default one bundled with Topwrap. - -You may want to modify the file to add dependencies, source files, or change the target board. -The file should be named `core.yaml.j2`. You can find an example template in `examples/hdmi` directory of the project. -If you don't create any template a default template bundled with Topwrap will be used (stored in `templates` directory). - -4. Place any additional source files in a directory (`sources` in this example). +Now connect them to ip cores. -5. Run Topwrap: - - ``` - python -m topwrap build --design project.yaml --sources sources - ``` - -### Example PWM design - -There's an example setup in `examples/pwm`. - -In order to generate the top module, run: - -``` -make generate +```yaml +design: + ports: + simple_core_1: + clk: clk + rst: rst + simple_core_2: + a: + - simple_core_1 + - z + c: Output_c + y: Output_y ``` -In order to generate bitstream, add Vivado to your path and run: +Final design: -``` -make +```yaml +ips: + simple_core_1: + file: gen_simple_core_1.yaml + simple_core_2: + file: gen_simple_core_2.yaml +design: + ports: + simple_core_1: + clk: clk + rst: rst + simple_core_2: + a: + - simple_core_1 + - z + c: Output_c + y: Output_y +external: + ports: + in: + - rst + - clk + out: + - Output_y + - Output_c ``` -The FPGA design utilizes an AXI-mapped PWM IP Core. -You can access its registers starting from address `0x4000000` (that's the base address of `AXI_GP0` on ZYNQ). -Each IP Core used in the project is declared in `ips` section in `project.yml` file. -`ports` section allows to connect individual ports of IP Cores, and `interfaces` is used analogously for connecting whole interfaces. -Finally, you can specify which ports will be used as external I/O in `external` section. +### Generating verilog -To connect the I/O signals to specific FPGA pins, you need proper mappings in a constraints file. See `zynq.xdc` used in the setup and modify it accordingly. - -```{image} img/pwm.png -``` +:::{info} +Topwrap uses [Amaranth](https://github.com/amaranth-lang/amaranth) for generating verilog top file. +::: -### Example HDMI design +To generate top file use `topwrap build` and provide the design. -There's an example setup stored in `examples/hdmi`. +Ensure you are in the `examples/getting_started_demo` directory and run: -You can generate bitstream for desired target: +```bash +topwrap build --design {design_name.yaml} +``` -> - Snickerdoodle Black: -> -> ``` -> make snickerdoodle -> ``` -> -> - Zynq Video Board: -> -> ``` -> make zvb -> ``` +Where the `{design_name.yaml}` is the design saved at the end of previous section. +The generated verilog file can be found in `/build` directory. -If you wish to generate HDL sources without running Vivado, you can use: +Notice that you will get warning: ``` -make generate +WARNING:root:You did not specify part number. 'None' will be used and thus your implementation may fail. ``` -You can find more information in README of the example setup. +It's because we didn't specify any part with `--part` flag since it's just a dummy example that is not for any specific FPGA chip. +For building your designs we recommend specifying the `--part`. diff --git a/docs/source/img/getting_started_project.png b/docs/source/img/getting_started_project.png new file mode 100644 index 0000000000000000000000000000000000000000..c672c92bea5c7276cc1df5532905a1adaee15224 GIT binary patch literal 58644 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%0A&J9aYL$%Y#dDyz|ZR} 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�(g5Jx_QAx8%o=f6A$|p>5gPedmuZoG1ut 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 Pi6I*cr1^7GuiO6v`7DA< literal 0 HcmV?d00001 diff --git a/docs/source/img/save_graph_kpm.png b/docs/source/img/save_graph_kpm.png new file mode 100644 index 0000000000000000000000000000000000000000..0ac5319bf574949e3bf6544323c541ca12d07f63 GIT binary patch literal 26051 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

fnxHEMJP|G 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 literal 0 HcmV?d00001 diff --git a/docs/source/index.md b/docs/source/index.md index db269cc7..bd287293 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -4,6 +4,7 @@ :caption: Documentation :maxdepth: 2 introduction +installation getting_started description_files usage diff --git a/docs/source/installation.md b/docs/source/installation.md new file mode 100644 index 00000000..d846671a --- /dev/null +++ b/docs/source/installation.md @@ -0,0 +1,50 @@ +(installation)= + +# Installation + +1. Install required system packages: + + Debian: + ```bash + apt install -y git g++ make python3 python3-pip antlr4 libantlr4-runtime-dev yosys npm + ``` + + Arch: + ```bash + pacman -Syu git gcc make python3 python-pip antlr4 antlr4-runtime yosys npm + ``` + + Fedora: + ```bash + dnf install git g++ make python3 python3-pip python3-devel antlr4 antlr4-cpp-runtime-devel yosys npm + ``` + +2. Install the Topwrap package (It is highly recommended to run this step in a Python virtual environment, e.g. [venv](https://docs.python.org/3/library/venv.html)): + + ```bash + python3 -m venv venv + source venv/bin/activate + pip install . + ``` + +:::{note} +To use `topwrap parse` command you also need to install optional dependencies: +```bash +pip install ".[topwrap-parse]" +``` +On Arch-based distributions a symlink to antlr4 runtime library needs to created and an environment variable set: +```bash +ln -s /usr/share/java/antlr-complete.jar antlr4-complete.jar +ANTLR_COMPLETE_PATH=`pwd` pip install ".[topwrap-parse]" +``` +On Fedora-based distributions symlinks need to be made inside `/usr/share/java` directory itself: +```bash +sudo ln -s /usr/share/java/stringtemplate4/ST4.jar /usr/share/java/stringtemplate4.jar +sudo ln -s /usr/share/java/antlr4/antlr4.jar /usr/share/java/antlr4.jar +sudo ln -s /usr/share/java/antlr4/antlr4-runtime.jar /usr/share/java/antlr4-runtime.jar +sudo ln -s /usr/share/java/treelayout/org.abego.treelayout.core.jar /usr/share/java/treelayout.jar +pip install ".[topwrap-parse]" +``` +::: + +If you want to contribute to the project please see the [Developer's setup guide](developers_guide/setup.md). diff --git a/examples/getting_started_demo/design.v b/examples/getting_started_demo/design.v new file mode 100644 index 00000000..e69de29b diff --git a/examples/getting_started_demo/kpm/dataflow.json b/examples/getting_started_demo/kpm/dataflow.json new file mode 100644 index 00000000..d78eaab4 --- /dev/null +++ b/examples/getting_started_demo/kpm/dataflow.json @@ -0,0 +1,221 @@ +{ + "version": "20240723.13", + "graphs": [ + { + "connections": [ + { + "from": "ni_17271731416381", + "id": "208584b0-fd63-4842-afa5-2f576c7ad76c", + "to": "ni_17271731416386" + }, + { + "from": "ni_172717314163812", + "id": "4a7548fb-0179-4553-a89c-85d69f06a271", + "to": "ni_17271731416380" + }, + { + "from": "ni_17271731416389", + "id": "07a93966-bb67-4866-9b91-848930b1e14f", + "to": "ni_17271731416382" + }, + { + "from": "ni_17271731416385", + "id": "85f40e97-9bee-4328-a37d-89489d98bbfa", + "to": "ni_172717314163818" + }, + { + "from": "ni_17271731416384", + "id": "a78a199d-3c74-455e-8039-6c69ca0493f8", + "to": "ni_172717314163815" + } + ], + "id": "172717314163833", + "nodes": [ + { + "enabledInterfaceGroups": [], + "id": "node_17271731416383", + "instanceName": "simple_core_1", + "interfaces": [ + { + "direction": "input", + "id": "ni_17271731416380", + "name": "clk", + "side": "left", + "sidePosition": 0 + }, + { + "direction": "input", + "id": "ni_17271731416382", + "name": "rst", + "side": "left", + "sidePosition": 1 + }, + { + "direction": "output", + "id": "ni_17271731416381", + "name": "z", + "side": "right", + "sidePosition": 0 + } + ], + "name": "gen_simple_core_1", + "position": { + "x": 75, + "y": 91 + }, + "properties": [], + "twoColumn": true, + "width": 200 + }, + { + "enabledInterfaceGroups": [], + "id": "node_17271731416387", + "instanceName": "simple_core_2", + "interfaces": [ + { + "direction": "input", + "id": "ni_17271731416386", + "name": "a", + "side": "left", + "sidePosition": 0 + }, + { + "direction": "output", + "id": "ni_17271731416384", + "name": "y", + "side": "right", + "sidePosition": 0 + }, + { + "direction": "output", + "id": "ni_17271731416385", + "name": "c", + "side": "right", + "sidePosition": 1 + } + ], + "name": "gen_simple_core_2", + "position": { + "x": 405, + "y": 90 + }, + "properties": [], + "twoColumn": true, + "width": 200 + }, + { + "enabledInterfaceGroups": [], + "id": "node_172717314163810", + "instanceName": "External Input", + "interfaces": [ + { + "direction": "output", + "id": "ni_17271731416389", + "name": "external", + "side": "right", + "sidePosition": 0 + } + ], + "name": "External Input", + "position": { + "x": -360, + "y": 135 + }, + "properties": [ + { + "id": "17271731416388", + "name": "External Name", + "value": "rst" + } + ], + "twoColumn": true, + "width": 200 + }, + { + "enabledInterfaceGroups": [], + "id": "node_172717314163813", + "instanceName": "External Input", + "interfaces": [ + { + "direction": "output", + "id": "ni_172717314163812", + "name": "external", + "side": "right", + "sidePosition": 0 + } + ], + "name": "External Input", + "position": { + "x": -345, + "y": -90 + }, + "properties": [ + { + "id": "172717314163811", + "name": "External Name", + "value": "clk" + } + ], + "twoColumn": true, + "width": 200 + }, + { + "enabledInterfaceGroups": [], + "id": "node_172717314163816", + "instanceName": "External Output", + "interfaces": [ + { + "direction": "input", + "id": "ni_172717314163815", + "name": "external", + "side": "left", + "sidePosition": 0 + } + ], + "name": "External Output", + "position": { + "x": 825, + "y": -45 + }, + "properties": [ + { + "id": "172717314163814", + "name": "External Name", + "value": "Output_y" + } + ], + "twoColumn": true, + "width": 200 + }, + { + "enabledInterfaceGroups": [], + "id": "node_172717314163819", + "instanceName": "External Output", + "interfaces": [ + { + "direction": "input", + "id": "ni_172717314163818", + "name": "external", + "side": "left", + "sidePosition": 0 + } + ], + "name": "External Output", + "position": { + "x": 840, + "y": 180 + }, + "properties": [ + { + "id": "172717314163817", + "name": "External Name", + "value": "Output_c" + } + ], + "twoColumn": true, + "width": 200 + } + ] + } + ] +} diff --git a/examples/getting_started_demo/kpm/specification.json b/examples/getting_started_demo/kpm/specification.json new file mode 100644 index 00000000..c4b4a93d --- /dev/null +++ b/examples/getting_started_demo/kpm/specification.json @@ -0,0 +1,224 @@ +{ + "version": "20240723.13", + "metadata": { + "allowLoopbacks": true, + "backgroundSize": 15, + "connectionStyle": "orthogonal", + "interfaces": { + "port": { + "interfaceColor": "#00ca7c", + "interfaceConnectionColor": "#ffffff", + "interfaceConnectionPattern": "solid" + } + }, + "layout": "CytoscapeEngine - grid", + "movementStep": 15, + "navbarItems": [ + { + "allowToRunInParallelWith": [ + "dataflow_run", + "custom_lint_files" + ], + "iconName": "Validate", + "name": "Validate", + "procedureName": "dataflow_validate", + "stopName": "Stop" + }, + { + "allowToRunInParallelWith": [ + "dataflow_validate", + "custom_lint_files" + ], + "iconName": "Run", + "name": "Run", + "procedureName": "dataflow_run", + "stopName": "Stop" + } + ], + "twoColumn": true + }, + "nodes": [ + { + "abstract": false, + "additionalData": "gen_simple_core_1.yaml", + "category": "IPcore", + "interfaces": [ + { + "direction": "input", + "maxConnectionsCount": -1, + "name": "rst", + "type": [ + "port" + ] + }, + { + "direction": "input", + "maxConnectionsCount": -1, + "name": "clk", + "type": [ + "port" + ] + }, + { + "direction": "output", + "maxConnectionsCount": -1, + "name": "z", + "type": [ + "port" + ] + } + ], + "layer": "gen_simple_core_1", + "name": "gen_simple_core_1" + }, + { + "abstract": false, + "additionalData": "gen_simple_core_2.yaml", + "category": "IPcore", + "interfaces": [ + { + "direction": "input", + "maxConnectionsCount": -1, + "name": "a", + "type": [ + "port" + ] + }, + { + "direction": "output", + "maxConnectionsCount": -1, + "name": "y", + "type": [ + "port" + ] + }, + { + "direction": "output", + "maxConnectionsCount": -1, + "name": "c", + "type": [ + "port" + ] + } + ], + "layer": "gen_simple_core_2", + "name": "gen_simple_core_2" + }, + { + "abstract": false, + "category": "Metanode", + "interfaces": [ + { + "direction": "input", + "maxConnectionsCount": -1, + "name": "external", + "type": [ + "port" + ] + } + ], + "layer": "External Output", + "name": "External Output", + "properties": [ + { + "default": "", + "name": "External Name", + "type": "text" + } + ] + }, + { + "abstract": false, + "category": "Metanode", + "interfaces": [ + { + "direction": "output", + "maxConnectionsCount": -1, + "name": "external", + "type": [ + "port" + ] + } + ], + "layer": "External Input", + "name": "External Input", + "properties": [ + { + "default": "", + "name": "External Name", + "type": "text" + } + ] + }, + { + "abstract": false, + "category": "Metanode", + "interfaces": [ + { + "direction": "inout", + "maxConnectionsCount": -1, + "name": "external", + "type": [ + "port" + ] + } + ], + "layer": "External Inout", + "name": "External Inout", + "properties": [ + { + "default": "", + "name": "External Name", + "type": "text" + } + ] + }, + { + "abstract": false, + "category": "Metanode", + "interfaces": [ + { + "direction": "output", + "maxConnectionsCount": -1, + "name": "constant", + "type": [ + "port" + ] + } + ], + "layer": "Constant", + "name": "Constant", + "properties": [ + { + "default": "0", + "name": "Constant Value", + "type": "text" + } + ] + }, + { + "abstract": false, + "category": "Metanode", + "interfaces": [ + { + "direction": "output", + "maxConnectionsCount": -1, + "name": "subgraph out", + "type": [ + "port" + ] + }, + { + "direction": "input", + "maxConnectionsCount": -1, + "name": "subgraph in", + "type": [ + "port" + ] + } + ], + "layer": "Subgraph port", + "name": "Subgraph port" + } + ] +} diff --git a/examples/getting_started_demo/project.yml b/examples/getting_started_demo/project.yml new file mode 100644 index 00000000..3de4d4c0 --- /dev/null +++ b/examples/getting_started_demo/project.yml @@ -0,0 +1,24 @@ +design: + ports: + simple_core_1: + clk: clk + rst: rst + simple_core_2: + a: + - simple_core_1 + - z + c: Output_c + y: Output_y +external: + ports: + in: + - rst + - clk + out: + - Output_y + - Output_c +ips: + simple_core_1: + file: gen_simple_core_1.yaml + simple_core_2: + file: gen_simple_core_2.yaml diff --git a/examples/getting_started_demo/verilogs/simple_core_1.v b/examples/getting_started_demo/verilogs/simple_core_1.v new file mode 100644 index 00000000..b65cca85 --- /dev/null +++ b/examples/getting_started_demo/verilogs/simple_core_1.v @@ -0,0 +1,7 @@ +module simple_core_1 ( + input wire clk, + input wire rst, + output reg z +); + +endmodule diff --git a/examples/getting_started_demo/verilogs/simple_core_2.v b/examples/getting_started_demo/verilogs/simple_core_2.v new file mode 100644 index 00000000..afd0c9f4 --- /dev/null +++ b/examples/getting_started_demo/verilogs/simple_core_2.v @@ -0,0 +1,7 @@ +module simple_core_2 ( + input wire a, + output wire y, + output wire c +); + +endmodule diff --git a/topwrap/cli.py b/topwrap/cli.py index ab2a37a4..75e4e7c3 100644 --- a/topwrap/cli.py +++ b/topwrap/cli.py @@ -71,7 +71,7 @@ def build_main( if part is None: logging.warning( - "You didn't specify part number. 'None' will be used" + "You didn't specify part number. 'None' will be used " "and thus your implementation may fail." )