<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://andromeda.df.lu.lv/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Leo</id>
	<title>DiLab - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://andromeda.df.lu.lv/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Leo"/>
	<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php/Special:Contributions/Leo"/>
	<updated>2026-07-08T04:11:28Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11317</id>
		<title>OpenLane 2</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11317"/>
		<updated>2026-07-03T20:27:18Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Usecase: SRAM integration for IHP-Open-PDK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
OpenLane versions 1 and 2 is the VLSI design flow management framework. &lt;br /&gt;
&lt;br /&gt;
However, it has been superseeded by [[LibreLane]] that is suggested for new designs.&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane. This may take 6GB and more of the disk space for every run.&lt;br /&gt;
&lt;br /&gt;
Usually my project is mapped to a cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I do the runs locally, possibly outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenROAD ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. &lt;br /&gt;
You may need to look for the report file:&lt;br /&gt;
 find runs/RUN_... -name &amp;quot;antenna.rpt&amp;quot;&lt;br /&gt;
This may find several reports. look for the latest one by OpenROAD:&lt;br /&gt;
 runs/RUN_.../34-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../37-odb-heuristicdiodeinsertion/3-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../35-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../38-openroad-repairantennas/2-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../42-openroad-checkantennas-1/reports/antenna.rpt&lt;br /&gt;
&lt;br /&gt;
Use the latest report by OpenROAD to open in the tool.&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration for SKY (unfinished) =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration for IHP-Open-PDK =&lt;br /&gt;
&lt;br /&gt;
This was tricky. &lt;br /&gt;
[https://www.dropbox.com/scl/fi/jm8g2u9ycb7xsnikelt60/readme_sram_ihp.pdf?rlkey=vjy3arvaovgtxju95jp01dhu4&amp;amp;raw=1 Here my notes (as a pdf file) describing the problems and fixes]&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;test_sram_ihp&amp;quot;,&lt;br /&gt;
    &amp;quot;PDK&amp;quot;: &amp;quot;ihp-sg13g2&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_TAP_ENDCAP_INSERTION&amp;quot;: false,&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
        &amp;quot;sram_inst VPWR VGND VDD! VSS!&amp;quot;,&lt;br /&gt;
        &amp;quot;sram_inst VPWR VGND VDDARRAY! VSS!&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;FP_PDN_CFG&amp;quot;: &amp;quot;dir::src/pdn_cfg.tcl&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_WRITE_LEF&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sg13g2_stdcell&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 800, 800],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [10, 10, 790, 790],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
        &amp;quot;dir::src/test_sram_ihp.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;VERILOG_FILES_BLACKBOX&amp;quot;: [&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_bb.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;EXTRA_LIBS&amp;quot;: [&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_typ_1p20V_25C.lib&amp;quot;,&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_slow_1p08V_125C.lib&amp;quot;,&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_fast_1p32V_m55C.lib&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
        &amp;quot;RM_IHPSG13_1P_256x32_c2_bm_bist&amp;quot;: {&lt;br /&gt;
            &amp;quot;gds&amp;quot;: [&lt;br /&gt;
                &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist.gds&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;lef&amp;quot;: [&lt;br /&gt;
                &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist.lef&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;instances&amp;quot;: {&lt;br /&gt;
                &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
                    &amp;quot;location&amp;quot;: [200, 200],&lt;br /&gt;
                    &amp;quot;orientation&amp;quot;: &amp;quot;N&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/test_sram_ihp.v ====&lt;br /&gt;
    module test_sram_ihp (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire men,         // Memory enable (active high)&lt;br /&gt;
        input wire wen,         // Write enable (active high)&lt;br /&gt;
        input wire ren,         // Read enable (active high)&lt;br /&gt;
        input wire [31:0] bm,   // 32-bit bit-mask for writing&lt;br /&gt;
        input wire [7:0] addr,  // 8 bits to address 256 words&lt;br /&gt;
        input wire [31:0] din,  // 32-bit data in&lt;br /&gt;
        output wire [31:0] dout // 32-bit data out&lt;br /&gt;
    );&lt;br /&gt;
 &lt;br /&gt;
        // Instantiating the IHP 256x32 1-Port BIST macro&lt;br /&gt;
        RM_IHPSG13_1P_256x32_c2_bm_bist sram_inst (&lt;br /&gt;
            // Standard Operation Ports&lt;br /&gt;
            .A_CLK  (clk),&lt;br /&gt;
            .A_MEN  (men),&lt;br /&gt;
            .A_WEN  (wen),&lt;br /&gt;
            .A_REN  (ren),&lt;br /&gt;
            .A_ADDR (addr),&lt;br /&gt;
            .A_DIN  (din),&lt;br /&gt;
            .A_DOUT (dout),&lt;br /&gt;
            .A_BM   (bm),&lt;br /&gt;
 &lt;br /&gt;
            // Mandatory Delay Pin&lt;br /&gt;
            .A_DLY  (1&amp;#039;b1), // Must be tied to 1&lt;br /&gt;
 &lt;br /&gt;
            // BIST Ports - Tied off to 0 to disable BIST mode&lt;br /&gt;
            .A_BIST_CLK  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_EN   (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_MEN  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_WEN  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_REN  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_ADDR (8&amp;#039;b0),&lt;br /&gt;
            .A_BIST_DIN  (32&amp;#039;b0),&lt;br /&gt;
            .A_BIST_BM   (32&amp;#039;b0)&lt;br /&gt;
        );&lt;br /&gt;
 &lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/pdn_cfg.tcl ====&lt;br /&gt;
    source $::env(SCRIPTS_DIR)/openroad/common/set_global_connections.tcl&lt;br /&gt;
    set_global_connections&lt;br /&gt;
 &lt;br /&gt;
    set secondary []&lt;br /&gt;
    foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {&lt;br /&gt;
        if { $vdd != $::env(VDD_NET)} {&lt;br /&gt;
            lappend secondary $vdd&lt;br /&gt;
 &lt;br /&gt;
            set db_net [[ord::get_db_block] findNet $vdd]&lt;br /&gt;
            if {$db_net == &amp;quot;NULL&amp;quot;} {&lt;br /&gt;
                set net [odb::dbNet_create [ord::get_db_block] $vdd]&lt;br /&gt;
                $net setSpecial&lt;br /&gt;
                $net setSigType &amp;quot;POWER&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
  &lt;br /&gt;
        if { $gnd != $::env(GND_NET)} {&lt;br /&gt;
            lappend secondary $gnd&lt;br /&gt;
 &lt;br /&gt;
            set db_net [[ord::get_db_block] findNet $gnd]&lt;br /&gt;
            if {$db_net == &amp;quot;NULL&amp;quot;} {&lt;br /&gt;
                set net [odb::dbNet_create [ord::get_db_block] $gnd]&lt;br /&gt;
                $net setSpecial&lt;br /&gt;
                $net setSigType &amp;quot;GROUND&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    set_voltage_domain -name CORE -power $::env(VDD_NET) -ground $::env(GND_NET) \&lt;br /&gt;
        -secondary_power $secondary&lt;br /&gt;
 &lt;br /&gt;
    if { $::env(FP_PDN_MULTILAYER) == 1 } {&lt;br /&gt;
        define_pdn_grid \&lt;br /&gt;
            -name stdcell_grid \&lt;br /&gt;
            -starts_with POWER \&lt;br /&gt;
            -voltage_domain CORE \&lt;br /&gt;
            -pins &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_VERTICAL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_VWIDTH) \&lt;br /&gt;
            -pitch $::env(FP_PDN_VPITCH) \&lt;br /&gt;
            -offset $::env(FP_PDN_VOFFSET) \&lt;br /&gt;
            -spacing $::env(FP_PDN_VSPACING) \&lt;br /&gt;
            -starts_with POWER -extend_to_core_ring&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_HORIZONTAL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_HWIDTH) \&lt;br /&gt;
            -pitch $::env(FP_PDN_HPITCH) \&lt;br /&gt;
            -offset $::env(FP_PDN_HOFFSET) \&lt;br /&gt;
            -spacing $::env(FP_PDN_HSPACING) \&lt;br /&gt;
            -starts_with POWER -extend_to_core_ring&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_connect \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layers &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot;&lt;br /&gt;
    } else {&lt;br /&gt;
        define_pdn_grid \&lt;br /&gt;
            -name stdcell_grid \&lt;br /&gt;
            -starts_with POWER \&lt;br /&gt;
            -voltage_domain CORE \&lt;br /&gt;
            -pins $::env(FP_PDN_VERTICAL_LAYER)&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_VERTICAL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_VWIDTH) \&lt;br /&gt;
            -pitch $::env(FP_PDN_VPITCH) \&lt;br /&gt;
            -offset $::env(FP_PDN_VOFFSET) \&lt;br /&gt;
            -spacing $::env(FP_PDN_VSPACING) \&lt;br /&gt;
            -starts_with POWER -extend_to_core_ring&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    # Adds the standard cell rails if enabled.&lt;br /&gt;
    if { $::env(FP_PDN_ENABLE_RAILS) == 1 } {&lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_RAIL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_RAIL_WIDTH) \&lt;br /&gt;
            -followpins \&lt;br /&gt;
            -starts_with POWER&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_connect \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layers &amp;quot;$::env(FP_PDN_RAIL_LAYER) $::env(FP_PDN_VERTICAL_LAYER)&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    # Adds the core ring if enabled.&lt;br /&gt;
    if { $::env(FP_PDN_CORE_RING) == 1 } {&lt;br /&gt;
        if { $::env(FP_PDN_MULTILAYER) == 1 } {&lt;br /&gt;
            add_pdn_ring \&lt;br /&gt;
                -grid stdcell_grid \&lt;br /&gt;
                -layers &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot; \&lt;br /&gt;
                -widths &amp;quot;$::env(FP_PDN_CORE_RING_VWIDTH) $::env(FP_PDN_CORE_RING_HWIDTH)&amp;quot; \&lt;br /&gt;
                -spacings &amp;quot;$::env(FP_PDN_CORE_RING_VSPACING) $::env(FP_PDN_CORE_RING_HSPACING)&amp;quot; \&lt;br /&gt;
                -core_offset &amp;quot;$::env(FP_PDN_CORE_RING_VOFFSET) $::env(FP_PDN_CORE_RING_HOFFSET)&amp;quot;&lt;br /&gt;
        } else {&lt;br /&gt;
            throw APPLICATION &amp;quot;FP_PDN_CORE_RING cannot be used when FP_PDN_MULTILAYER is set to false.&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    define_pdn_grid \&lt;br /&gt;
        -macro \&lt;br /&gt;
        -default \&lt;br /&gt;
        -name macro \&lt;br /&gt;
        -starts_with POWER \&lt;br /&gt;
        -halo &amp;quot;$::env(FP_PDN_HORIZONTAL_HALO) $::env(FP_PDN_VERTICAL_HALO)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    add_pdn_connect \&lt;br /&gt;
        -grid macro \&lt;br /&gt;
        -layers &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    add_pdn_connect \&lt;br /&gt;
        -grid macro \&lt;br /&gt;
        -layers &amp;quot;Metal4 TopMetal1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    add_pdn_connect \&lt;br /&gt;
        -grid macro \&lt;br /&gt;
        -layers &amp;quot;Metal4 TopMetal2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
The PDK sram files and some additional files go here.&lt;br /&gt;
&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.gds&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.lef&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.txt&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.v&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_fast_1p32V_m55C.lib&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_slow_1p08V_125C.lib&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_typ_1p20V_25C.lib&lt;br /&gt;
&lt;br /&gt;
This is a blackbox file, hiding the internals.&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_bb.v&lt;br /&gt;
&lt;br /&gt;
It has the following content, matching the sram interface:&lt;br /&gt;
&lt;br /&gt;
 (* blackbox *)&lt;br /&gt;
 module RM_IHPSG13_1P_256x32_c2_bm_bist (&lt;br /&gt;
    input wire A_CLK,&lt;br /&gt;
    input wire A_MEN,&lt;br /&gt;
    input wire A_WEN,&lt;br /&gt;
    input wire A_REN,&lt;br /&gt;
    input wire [7:0] A_ADDR,&lt;br /&gt;
    input wire [31:0] A_DIN,&lt;br /&gt;
    input wire A_DLY,&lt;br /&gt;
    output wire [31:0] A_DOUT,&lt;br /&gt;
    input wire [31:0] A_BM,&lt;br /&gt;
    input wire A_BIST_CLK,&lt;br /&gt;
    input wire A_BIST_EN,&lt;br /&gt;
    input wire A_BIST_MEN,&lt;br /&gt;
    input wire A_BIST_WEN,&lt;br /&gt;
    input wire A_BIST_REN,&lt;br /&gt;
    input wire [7:0] A_BIST_ADDR,&lt;br /&gt;
    input wire [31:0] A_BIST_DIN,&lt;br /&gt;
    input wire [31:0] A_BIST_BM&lt;br /&gt;
 );&lt;br /&gt;
 endmodule&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11316</id>
		<title>OpenLane 2</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11316"/>
		<updated>2026-07-03T20:25:37Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Sources: src/pdn_cfg.tcl */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
OpenLane versions 1 and 2 is the VLSI design flow management framework. &lt;br /&gt;
&lt;br /&gt;
However, it has been superseeded by [[LibreLane]] that is suggested for new designs.&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane. This may take 6GB and more of the disk space for every run.&lt;br /&gt;
&lt;br /&gt;
Usually my project is mapped to a cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I do the runs locally, possibly outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenROAD ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. &lt;br /&gt;
You may need to look for the report file:&lt;br /&gt;
 find runs/RUN_... -name &amp;quot;antenna.rpt&amp;quot;&lt;br /&gt;
This may find several reports. look for the latest one by OpenROAD:&lt;br /&gt;
 runs/RUN_.../34-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../37-odb-heuristicdiodeinsertion/3-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../35-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../38-openroad-repairantennas/2-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../42-openroad-checkantennas-1/reports/antenna.rpt&lt;br /&gt;
&lt;br /&gt;
Use the latest report by OpenROAD to open in the tool.&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration for SKY (unfinished) =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration for IHP-Open-PDK =&lt;br /&gt;
&lt;br /&gt;
This was tricky. &lt;br /&gt;
[https://www.dropbox.com/scl/fi/jm8g2u9ycb7xsnikelt60/readme_sram_ihp.pdf?rlkey=vjy3arvaovgtxju95jp01dhu4&amp;amp;raw=1 Here is a document describing the problems and fixes]&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;test_sram_ihp&amp;quot;,&lt;br /&gt;
    &amp;quot;PDK&amp;quot;: &amp;quot;ihp-sg13g2&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_TAP_ENDCAP_INSERTION&amp;quot;: false,&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
        &amp;quot;sram_inst VPWR VGND VDD! VSS!&amp;quot;,&lt;br /&gt;
        &amp;quot;sram_inst VPWR VGND VDDARRAY! VSS!&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;FP_PDN_CFG&amp;quot;: &amp;quot;dir::src/pdn_cfg.tcl&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_WRITE_LEF&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sg13g2_stdcell&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 800, 800],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [10, 10, 790, 790],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
        &amp;quot;dir::src/test_sram_ihp.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;VERILOG_FILES_BLACKBOX&amp;quot;: [&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_bb.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;EXTRA_LIBS&amp;quot;: [&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_typ_1p20V_25C.lib&amp;quot;,&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_slow_1p08V_125C.lib&amp;quot;,&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_fast_1p32V_m55C.lib&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
        &amp;quot;RM_IHPSG13_1P_256x32_c2_bm_bist&amp;quot;: {&lt;br /&gt;
            &amp;quot;gds&amp;quot;: [&lt;br /&gt;
                &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist.gds&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;lef&amp;quot;: [&lt;br /&gt;
                &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist.lef&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;instances&amp;quot;: {&lt;br /&gt;
                &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
                    &amp;quot;location&amp;quot;: [200, 200],&lt;br /&gt;
                    &amp;quot;orientation&amp;quot;: &amp;quot;N&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/test_sram_ihp.v ====&lt;br /&gt;
    module test_sram_ihp (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire men,         // Memory enable (active high)&lt;br /&gt;
        input wire wen,         // Write enable (active high)&lt;br /&gt;
        input wire ren,         // Read enable (active high)&lt;br /&gt;
        input wire [31:0] bm,   // 32-bit bit-mask for writing&lt;br /&gt;
        input wire [7:0] addr,  // 8 bits to address 256 words&lt;br /&gt;
        input wire [31:0] din,  // 32-bit data in&lt;br /&gt;
        output wire [31:0] dout // 32-bit data out&lt;br /&gt;
    );&lt;br /&gt;
 &lt;br /&gt;
        // Instantiating the IHP 256x32 1-Port BIST macro&lt;br /&gt;
        RM_IHPSG13_1P_256x32_c2_bm_bist sram_inst (&lt;br /&gt;
            // Standard Operation Ports&lt;br /&gt;
            .A_CLK  (clk),&lt;br /&gt;
            .A_MEN  (men),&lt;br /&gt;
            .A_WEN  (wen),&lt;br /&gt;
            .A_REN  (ren),&lt;br /&gt;
            .A_ADDR (addr),&lt;br /&gt;
            .A_DIN  (din),&lt;br /&gt;
            .A_DOUT (dout),&lt;br /&gt;
            .A_BM   (bm),&lt;br /&gt;
 &lt;br /&gt;
            // Mandatory Delay Pin&lt;br /&gt;
            .A_DLY  (1&amp;#039;b1), // Must be tied to 1&lt;br /&gt;
 &lt;br /&gt;
            // BIST Ports - Tied off to 0 to disable BIST mode&lt;br /&gt;
            .A_BIST_CLK  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_EN   (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_MEN  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_WEN  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_REN  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_ADDR (8&amp;#039;b0),&lt;br /&gt;
            .A_BIST_DIN  (32&amp;#039;b0),&lt;br /&gt;
            .A_BIST_BM   (32&amp;#039;b0)&lt;br /&gt;
        );&lt;br /&gt;
 &lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/pdn_cfg.tcl ====&lt;br /&gt;
    source $::env(SCRIPTS_DIR)/openroad/common/set_global_connections.tcl&lt;br /&gt;
    set_global_connections&lt;br /&gt;
 &lt;br /&gt;
    set secondary []&lt;br /&gt;
    foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {&lt;br /&gt;
        if { $vdd != $::env(VDD_NET)} {&lt;br /&gt;
            lappend secondary $vdd&lt;br /&gt;
 &lt;br /&gt;
            set db_net [[ord::get_db_block] findNet $vdd]&lt;br /&gt;
            if {$db_net == &amp;quot;NULL&amp;quot;} {&lt;br /&gt;
                set net [odb::dbNet_create [ord::get_db_block] $vdd]&lt;br /&gt;
                $net setSpecial&lt;br /&gt;
                $net setSigType &amp;quot;POWER&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
  &lt;br /&gt;
        if { $gnd != $::env(GND_NET)} {&lt;br /&gt;
            lappend secondary $gnd&lt;br /&gt;
 &lt;br /&gt;
            set db_net [[ord::get_db_block] findNet $gnd]&lt;br /&gt;
            if {$db_net == &amp;quot;NULL&amp;quot;} {&lt;br /&gt;
                set net [odb::dbNet_create [ord::get_db_block] $gnd]&lt;br /&gt;
                $net setSpecial&lt;br /&gt;
                $net setSigType &amp;quot;GROUND&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    set_voltage_domain -name CORE -power $::env(VDD_NET) -ground $::env(GND_NET) \&lt;br /&gt;
        -secondary_power $secondary&lt;br /&gt;
 &lt;br /&gt;
    if { $::env(FP_PDN_MULTILAYER) == 1 } {&lt;br /&gt;
        define_pdn_grid \&lt;br /&gt;
            -name stdcell_grid \&lt;br /&gt;
            -starts_with POWER \&lt;br /&gt;
            -voltage_domain CORE \&lt;br /&gt;
            -pins &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_VERTICAL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_VWIDTH) \&lt;br /&gt;
            -pitch $::env(FP_PDN_VPITCH) \&lt;br /&gt;
            -offset $::env(FP_PDN_VOFFSET) \&lt;br /&gt;
            -spacing $::env(FP_PDN_VSPACING) \&lt;br /&gt;
            -starts_with POWER -extend_to_core_ring&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_HORIZONTAL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_HWIDTH) \&lt;br /&gt;
            -pitch $::env(FP_PDN_HPITCH) \&lt;br /&gt;
            -offset $::env(FP_PDN_HOFFSET) \&lt;br /&gt;
            -spacing $::env(FP_PDN_HSPACING) \&lt;br /&gt;
            -starts_with POWER -extend_to_core_ring&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_connect \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layers &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot;&lt;br /&gt;
    } else {&lt;br /&gt;
        define_pdn_grid \&lt;br /&gt;
            -name stdcell_grid \&lt;br /&gt;
            -starts_with POWER \&lt;br /&gt;
            -voltage_domain CORE \&lt;br /&gt;
            -pins $::env(FP_PDN_VERTICAL_LAYER)&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_VERTICAL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_VWIDTH) \&lt;br /&gt;
            -pitch $::env(FP_PDN_VPITCH) \&lt;br /&gt;
            -offset $::env(FP_PDN_VOFFSET) \&lt;br /&gt;
            -spacing $::env(FP_PDN_VSPACING) \&lt;br /&gt;
            -starts_with POWER -extend_to_core_ring&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    # Adds the standard cell rails if enabled.&lt;br /&gt;
    if { $::env(FP_PDN_ENABLE_RAILS) == 1 } {&lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_RAIL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_RAIL_WIDTH) \&lt;br /&gt;
            -followpins \&lt;br /&gt;
            -starts_with POWER&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_connect \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layers &amp;quot;$::env(FP_PDN_RAIL_LAYER) $::env(FP_PDN_VERTICAL_LAYER)&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    # Adds the core ring if enabled.&lt;br /&gt;
    if { $::env(FP_PDN_CORE_RING) == 1 } {&lt;br /&gt;
        if { $::env(FP_PDN_MULTILAYER) == 1 } {&lt;br /&gt;
            add_pdn_ring \&lt;br /&gt;
                -grid stdcell_grid \&lt;br /&gt;
                -layers &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot; \&lt;br /&gt;
                -widths &amp;quot;$::env(FP_PDN_CORE_RING_VWIDTH) $::env(FP_PDN_CORE_RING_HWIDTH)&amp;quot; \&lt;br /&gt;
                -spacings &amp;quot;$::env(FP_PDN_CORE_RING_VSPACING) $::env(FP_PDN_CORE_RING_HSPACING)&amp;quot; \&lt;br /&gt;
                -core_offset &amp;quot;$::env(FP_PDN_CORE_RING_VOFFSET) $::env(FP_PDN_CORE_RING_HOFFSET)&amp;quot;&lt;br /&gt;
        } else {&lt;br /&gt;
            throw APPLICATION &amp;quot;FP_PDN_CORE_RING cannot be used when FP_PDN_MULTILAYER is set to false.&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    define_pdn_grid \&lt;br /&gt;
        -macro \&lt;br /&gt;
        -default \&lt;br /&gt;
        -name macro \&lt;br /&gt;
        -starts_with POWER \&lt;br /&gt;
        -halo &amp;quot;$::env(FP_PDN_HORIZONTAL_HALO) $::env(FP_PDN_VERTICAL_HALO)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    add_pdn_connect \&lt;br /&gt;
        -grid macro \&lt;br /&gt;
        -layers &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    add_pdn_connect \&lt;br /&gt;
        -grid macro \&lt;br /&gt;
        -layers &amp;quot;Metal4 TopMetal1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    add_pdn_connect \&lt;br /&gt;
        -grid macro \&lt;br /&gt;
        -layers &amp;quot;Metal4 TopMetal2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
The PDK sram files and some additional files go here.&lt;br /&gt;
&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.gds&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.lef&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.txt&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.v&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_fast_1p32V_m55C.lib&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_slow_1p08V_125C.lib&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_typ_1p20V_25C.lib&lt;br /&gt;
&lt;br /&gt;
This is a blackbox file, hiding the internals.&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_bb.v&lt;br /&gt;
&lt;br /&gt;
It has the following content, matching the sram interface:&lt;br /&gt;
&lt;br /&gt;
 (* blackbox *)&lt;br /&gt;
 module RM_IHPSG13_1P_256x32_c2_bm_bist (&lt;br /&gt;
    input wire A_CLK,&lt;br /&gt;
    input wire A_MEN,&lt;br /&gt;
    input wire A_WEN,&lt;br /&gt;
    input wire A_REN,&lt;br /&gt;
    input wire [7:0] A_ADDR,&lt;br /&gt;
    input wire [31:0] A_DIN,&lt;br /&gt;
    input wire A_DLY,&lt;br /&gt;
    output wire [31:0] A_DOUT,&lt;br /&gt;
    input wire [31:0] A_BM,&lt;br /&gt;
    input wire A_BIST_CLK,&lt;br /&gt;
    input wire A_BIST_EN,&lt;br /&gt;
    input wire A_BIST_MEN,&lt;br /&gt;
    input wire A_BIST_WEN,&lt;br /&gt;
    input wire A_BIST_REN,&lt;br /&gt;
    input wire [7:0] A_BIST_ADDR,&lt;br /&gt;
    input wire [31:0] A_BIST_DIN,&lt;br /&gt;
    input wire [31:0] A_BIST_BM&lt;br /&gt;
 );&lt;br /&gt;
 endmodule&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11315</id>
		<title>OpenLane 2</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11315"/>
		<updated>2026-07-03T20:25:01Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Usecase: SRAM integration for IHP-Open-PDK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
OpenLane versions 1 and 2 is the VLSI design flow management framework. &lt;br /&gt;
&lt;br /&gt;
However, it has been superseeded by [[LibreLane]] that is suggested for new designs.&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane. This may take 6GB and more of the disk space for every run.&lt;br /&gt;
&lt;br /&gt;
Usually my project is mapped to a cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I do the runs locally, possibly outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenROAD ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. &lt;br /&gt;
You may need to look for the report file:&lt;br /&gt;
 find runs/RUN_... -name &amp;quot;antenna.rpt&amp;quot;&lt;br /&gt;
This may find several reports. look for the latest one by OpenROAD:&lt;br /&gt;
 runs/RUN_.../34-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../37-odb-heuristicdiodeinsertion/3-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../35-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../38-openroad-repairantennas/2-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../42-openroad-checkantennas-1/reports/antenna.rpt&lt;br /&gt;
&lt;br /&gt;
Use the latest report by OpenROAD to open in the tool.&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration for SKY (unfinished) =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration for IHP-Open-PDK =&lt;br /&gt;
&lt;br /&gt;
This was tricky. &lt;br /&gt;
[https://www.dropbox.com/scl/fi/jm8g2u9ycb7xsnikelt60/readme_sram_ihp.pdf?rlkey=vjy3arvaovgtxju95jp01dhu4&amp;amp;raw=1 Here is a document describing the problems and fixes]&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;test_sram_ihp&amp;quot;,&lt;br /&gt;
    &amp;quot;PDK&amp;quot;: &amp;quot;ihp-sg13g2&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_TAP_ENDCAP_INSERTION&amp;quot;: false,&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
        &amp;quot;sram_inst VPWR VGND VDD! VSS!&amp;quot;,&lt;br /&gt;
        &amp;quot;sram_inst VPWR VGND VDDARRAY! VSS!&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;FP_PDN_CFG&amp;quot;: &amp;quot;dir::src/pdn_cfg.tcl&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_WRITE_LEF&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sg13g2_stdcell&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 800, 800],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [10, 10, 790, 790],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
        &amp;quot;dir::src/test_sram_ihp.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;VERILOG_FILES_BLACKBOX&amp;quot;: [&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_bb.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;EXTRA_LIBS&amp;quot;: [&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_typ_1p20V_25C.lib&amp;quot;,&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_slow_1p08V_125C.lib&amp;quot;,&lt;br /&gt;
        &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist_fast_1p32V_m55C.lib&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
        &amp;quot;RM_IHPSG13_1P_256x32_c2_bm_bist&amp;quot;: {&lt;br /&gt;
            &amp;quot;gds&amp;quot;: [&lt;br /&gt;
                &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist.gds&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;lef&amp;quot;: [&lt;br /&gt;
                &amp;quot;dir::macros/RM_IHPSG13_1P_256x32_c2_bm_bist.lef&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;instances&amp;quot;: {&lt;br /&gt;
                &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
                    &amp;quot;location&amp;quot;: [200, 200],&lt;br /&gt;
                    &amp;quot;orientation&amp;quot;: &amp;quot;N&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/test_sram_ihp.v ====&lt;br /&gt;
    module test_sram_ihp (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire men,         // Memory enable (active high)&lt;br /&gt;
        input wire wen,         // Write enable (active high)&lt;br /&gt;
        input wire ren,         // Read enable (active high)&lt;br /&gt;
        input wire [31:0] bm,   // 32-bit bit-mask for writing&lt;br /&gt;
        input wire [7:0] addr,  // 8 bits to address 256 words&lt;br /&gt;
        input wire [31:0] din,  // 32-bit data in&lt;br /&gt;
        output wire [31:0] dout // 32-bit data out&lt;br /&gt;
    );&lt;br /&gt;
 &lt;br /&gt;
        // Instantiating the IHP 256x32 1-Port BIST macro&lt;br /&gt;
        RM_IHPSG13_1P_256x32_c2_bm_bist sram_inst (&lt;br /&gt;
            // Standard Operation Ports&lt;br /&gt;
            .A_CLK  (clk),&lt;br /&gt;
            .A_MEN  (men),&lt;br /&gt;
            .A_WEN  (wen),&lt;br /&gt;
            .A_REN  (ren),&lt;br /&gt;
            .A_ADDR (addr),&lt;br /&gt;
            .A_DIN  (din),&lt;br /&gt;
            .A_DOUT (dout),&lt;br /&gt;
            .A_BM   (bm),&lt;br /&gt;
 &lt;br /&gt;
            // Mandatory Delay Pin&lt;br /&gt;
            .A_DLY  (1&amp;#039;b1), // Must be tied to 1&lt;br /&gt;
 &lt;br /&gt;
            // BIST Ports - Tied off to 0 to disable BIST mode&lt;br /&gt;
            .A_BIST_CLK  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_EN   (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_MEN  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_WEN  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_REN  (1&amp;#039;b0),&lt;br /&gt;
            .A_BIST_ADDR (8&amp;#039;b0),&lt;br /&gt;
            .A_BIST_DIN  (32&amp;#039;b0),&lt;br /&gt;
            .A_BIST_BM   (32&amp;#039;b0)&lt;br /&gt;
        );&lt;br /&gt;
 &lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/pdn_cfg.tcl ====&lt;br /&gt;
    source $::env(SCRIPTS_DIR)/openroad/common/set_global_connections.tcl&lt;br /&gt;
    set_global_connections&lt;br /&gt;
 &lt;br /&gt;
    set secondary []&lt;br /&gt;
    foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {&lt;br /&gt;
        if { $vdd != $::env(VDD_NET)} {&lt;br /&gt;
            lappend secondary $vdd&lt;br /&gt;
&lt;br /&gt;
            set db_net [[ord::get_db_block] findNet $vdd]&lt;br /&gt;
            if {$db_net == &amp;quot;NULL&amp;quot;} {&lt;br /&gt;
                set net [odb::dbNet_create [ord::get_db_block] $vdd]&lt;br /&gt;
                $net setSpecial&lt;br /&gt;
                $net setSigType &amp;quot;POWER&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if { $gnd != $::env(GND_NET)} {&lt;br /&gt;
            lappend secondary $gnd&lt;br /&gt;
&lt;br /&gt;
            set db_net [[ord::get_db_block] findNet $gnd]&lt;br /&gt;
            if {$db_net == &amp;quot;NULL&amp;quot;} {&lt;br /&gt;
                set net [odb::dbNet_create [ord::get_db_block] $gnd]&lt;br /&gt;
                $net setSpecial&lt;br /&gt;
                $net setSigType &amp;quot;GROUND&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    set_voltage_domain -name CORE -power $::env(VDD_NET) -ground $::env(GND_NET) \&lt;br /&gt;
        -secondary_power $secondary&lt;br /&gt;
 &lt;br /&gt;
    if { $::env(FP_PDN_MULTILAYER) == 1 } {&lt;br /&gt;
        define_pdn_grid \&lt;br /&gt;
            -name stdcell_grid \&lt;br /&gt;
            -starts_with POWER \&lt;br /&gt;
            -voltage_domain CORE \&lt;br /&gt;
            -pins &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_VERTICAL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_VWIDTH) \&lt;br /&gt;
            -pitch $::env(FP_PDN_VPITCH) \&lt;br /&gt;
            -offset $::env(FP_PDN_VOFFSET) \&lt;br /&gt;
            -spacing $::env(FP_PDN_VSPACING) \&lt;br /&gt;
            -starts_with POWER -extend_to_core_ring&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_HORIZONTAL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_HWIDTH) \&lt;br /&gt;
            -pitch $::env(FP_PDN_HPITCH) \&lt;br /&gt;
            -offset $::env(FP_PDN_HOFFSET) \&lt;br /&gt;
            -spacing $::env(FP_PDN_HSPACING) \&lt;br /&gt;
            -starts_with POWER -extend_to_core_ring&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_connect \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layers &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot;&lt;br /&gt;
    } else {&lt;br /&gt;
        define_pdn_grid \&lt;br /&gt;
            -name stdcell_grid \&lt;br /&gt;
            -starts_with POWER \&lt;br /&gt;
            -voltage_domain CORE \&lt;br /&gt;
            -pins $::env(FP_PDN_VERTICAL_LAYER)&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_VERTICAL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_VWIDTH) \&lt;br /&gt;
            -pitch $::env(FP_PDN_VPITCH) \&lt;br /&gt;
            -offset $::env(FP_PDN_VOFFSET) \&lt;br /&gt;
            -spacing $::env(FP_PDN_VSPACING) \&lt;br /&gt;
            -starts_with POWER -extend_to_core_ring&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    # Adds the standard cell rails if enabled.&lt;br /&gt;
    if { $::env(FP_PDN_ENABLE_RAILS) == 1 } {&lt;br /&gt;
        add_pdn_stripe \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layer $::env(FP_PDN_RAIL_LAYER) \&lt;br /&gt;
            -width $::env(FP_PDN_RAIL_WIDTH) \&lt;br /&gt;
            -followpins \&lt;br /&gt;
            -starts_with POWER&lt;br /&gt;
 &lt;br /&gt;
        add_pdn_connect \&lt;br /&gt;
            -grid stdcell_grid \&lt;br /&gt;
            -layers &amp;quot;$::env(FP_PDN_RAIL_LAYER) $::env(FP_PDN_VERTICAL_LAYER)&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    # Adds the core ring if enabled.&lt;br /&gt;
    if { $::env(FP_PDN_CORE_RING) == 1 } {&lt;br /&gt;
        if { $::env(FP_PDN_MULTILAYER) == 1 } {&lt;br /&gt;
            add_pdn_ring \&lt;br /&gt;
                -grid stdcell_grid \&lt;br /&gt;
                -layers &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot; \&lt;br /&gt;
                -widths &amp;quot;$::env(FP_PDN_CORE_RING_VWIDTH) $::env(FP_PDN_CORE_RING_HWIDTH)&amp;quot; \&lt;br /&gt;
                -spacings &amp;quot;$::env(FP_PDN_CORE_RING_VSPACING) $::env(FP_PDN_CORE_RING_HSPACING)&amp;quot; \&lt;br /&gt;
                -core_offset &amp;quot;$::env(FP_PDN_CORE_RING_VOFFSET) $::env(FP_PDN_CORE_RING_HOFFSET)&amp;quot;&lt;br /&gt;
        } else {&lt;br /&gt;
            throw APPLICATION &amp;quot;FP_PDN_CORE_RING cannot be used when FP_PDN_MULTILAYER is set to false.&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    define_pdn_grid \&lt;br /&gt;
        -macro \&lt;br /&gt;
        -default \&lt;br /&gt;
        -name macro \&lt;br /&gt;
        -starts_with POWER \&lt;br /&gt;
        -halo &amp;quot;$::env(FP_PDN_HORIZONTAL_HALO) $::env(FP_PDN_VERTICAL_HALO)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    add_pdn_connect \&lt;br /&gt;
        -grid macro \&lt;br /&gt;
        -layers &amp;quot;$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    add_pdn_connect \&lt;br /&gt;
        -grid macro \&lt;br /&gt;
        -layers &amp;quot;Metal4 TopMetal1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    add_pdn_connect \&lt;br /&gt;
        -grid macro \&lt;br /&gt;
        -layers &amp;quot;Metal4 TopMetal2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
The PDK sram files and some additional files go here.&lt;br /&gt;
&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.gds&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.lef&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.txt&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.v&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_fast_1p32V_m55C.lib&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_slow_1p08V_125C.lib&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_typ_1p20V_25C.lib&lt;br /&gt;
&lt;br /&gt;
This is a blackbox file, hiding the internals.&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_bb.v&lt;br /&gt;
&lt;br /&gt;
It has the following content, matching the sram interface:&lt;br /&gt;
&lt;br /&gt;
 (* blackbox *)&lt;br /&gt;
 module RM_IHPSG13_1P_256x32_c2_bm_bist (&lt;br /&gt;
    input wire A_CLK,&lt;br /&gt;
    input wire A_MEN,&lt;br /&gt;
    input wire A_WEN,&lt;br /&gt;
    input wire A_REN,&lt;br /&gt;
    input wire [7:0] A_ADDR,&lt;br /&gt;
    input wire [31:0] A_DIN,&lt;br /&gt;
    input wire A_DLY,&lt;br /&gt;
    output wire [31:0] A_DOUT,&lt;br /&gt;
    input wire [31:0] A_BM,&lt;br /&gt;
    input wire A_BIST_CLK,&lt;br /&gt;
    input wire A_BIST_EN,&lt;br /&gt;
    input wire A_BIST_MEN,&lt;br /&gt;
    input wire A_BIST_WEN,&lt;br /&gt;
    input wire A_BIST_REN,&lt;br /&gt;
    input wire [7:0] A_BIST_ADDR,&lt;br /&gt;
    input wire [31:0] A_BIST_DIN,&lt;br /&gt;
    input wire [31:0] A_BIST_BM&lt;br /&gt;
 );&lt;br /&gt;
 endmodule&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11314</id>
		<title>OpenLane 2</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11314"/>
		<updated>2026-07-03T20:18:53Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* OpenROAD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
OpenLane versions 1 and 2 is the VLSI design flow management framework. &lt;br /&gt;
&lt;br /&gt;
However, it has been superseeded by [[LibreLane]] that is suggested for new designs.&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane. This may take 6GB and more of the disk space for every run.&lt;br /&gt;
&lt;br /&gt;
Usually my project is mapped to a cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I do the runs locally, possibly outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenROAD ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. &lt;br /&gt;
You may need to look for the report file:&lt;br /&gt;
 find runs/RUN_... -name &amp;quot;antenna.rpt&amp;quot;&lt;br /&gt;
This may find several reports. look for the latest one by OpenROAD:&lt;br /&gt;
 runs/RUN_.../34-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../37-odb-heuristicdiodeinsertion/3-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../35-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../38-openroad-repairantennas/2-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../42-openroad-checkantennas-1/reports/antenna.rpt&lt;br /&gt;
&lt;br /&gt;
Use the latest report by OpenROAD to open in the tool.&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration for SKY (unfinished) =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration for IHP-Open-PDK =&lt;br /&gt;
&lt;br /&gt;
This was tricky. &lt;br /&gt;
[https://www.dropbox.com/scl/fi/jm8g2u9ycb7xsnikelt60/readme_sram_ihp.pdf?rlkey=vjy3arvaovgtxju95jp01dhu4&amp;amp;raw=1 Here is a document describing the problems and fixes]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
The PDK sram files and some additional files go here.&lt;br /&gt;
&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.gds&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.lef&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.txt&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist.v&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_fast_1p32V_m55C.lib&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_slow_1p08V_125C.lib&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_typ_1p20V_25C.lib&lt;br /&gt;
&lt;br /&gt;
This is a blackbox file, hiding the internals.&lt;br /&gt;
 RM_IHPSG13_1P_256x32_c2_bm_bist_bb.v&lt;br /&gt;
&lt;br /&gt;
It has the following content, matching the sram interface:&lt;br /&gt;
&lt;br /&gt;
 (* blackbox *)&lt;br /&gt;
 module RM_IHPSG13_1P_256x32_c2_bm_bist (&lt;br /&gt;
    input wire A_CLK,&lt;br /&gt;
    input wire A_MEN,&lt;br /&gt;
    input wire A_WEN,&lt;br /&gt;
    input wire A_REN,&lt;br /&gt;
    input wire [7:0] A_ADDR,&lt;br /&gt;
    input wire [31:0] A_DIN,&lt;br /&gt;
    input wire A_DLY,&lt;br /&gt;
    output wire [31:0] A_DOUT,&lt;br /&gt;
    input wire [31:0] A_BM,&lt;br /&gt;
    input wire A_BIST_CLK,&lt;br /&gt;
    input wire A_BIST_EN,&lt;br /&gt;
    input wire A_BIST_MEN,&lt;br /&gt;
    input wire A_BIST_WEN,&lt;br /&gt;
    input wire A_BIST_REN,&lt;br /&gt;
    input wire [7:0] A_BIST_ADDR,&lt;br /&gt;
    input wire [31:0] A_BIST_DIN,&lt;br /&gt;
    input wire [31:0] A_BIST_BM&lt;br /&gt;
 );&lt;br /&gt;
 endmodule&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11313</id>
		<title>OpenLane 2</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11313"/>
		<updated>2026-07-03T20:11:18Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Usecase: SRAM integration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
OpenLane versions 1 and 2 is the VLSI design flow management framework. &lt;br /&gt;
&lt;br /&gt;
However, it has been superseeded by [[LibreLane]] that is suggested for new designs.&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane. This may take 6GB and more of the disk space for every run.&lt;br /&gt;
&lt;br /&gt;
Usually my project is mapped to a cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I do the runs locally, possibly outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenROAD ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. &lt;br /&gt;
You may need to look for the report file:&lt;br /&gt;
 find runs/RUN_... -name &amp;quot;antenna.rpt&amp;quot;&lt;br /&gt;
This may find several reports. look for the latest one by OpenROAD:&lt;br /&gt;
 runs/RUN_.../34-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../37-odb-heuristicdiodeinsertion/3-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../35-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../38-openroad-repairantennas/2-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../42-openroad-checkantennas-1/reports/antenna.rpt&lt;br /&gt;
&lt;br /&gt;
Use the latest report by OpenROAD to open in the tool.&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=LibreLane&amp;diff=11312</id>
		<title>LibreLane</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=LibreLane&amp;diff=11312"/>
		<updated>2026-07-03T20:09:14Z</updated>

		<summary type="html">&lt;p&gt;Leo: Created page with &amp;quot;LibreLane is the successor of OpenLane V2, rewritten as python scripts for the VLSI design flow using open source tools.  == Setup LibreLane ==  [https://librelane.readthedocs...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;LibreLane is the successor of OpenLane V2, rewritten as python scripts for the VLSI design flow using open source tools.&lt;br /&gt;
&lt;br /&gt;
== Setup LibreLane ==&lt;br /&gt;
&lt;br /&gt;
[https://librelane.readthedocs.io/en/latest/getting_started/migrants/index.html Read this] if interested to migrate from OpenLane.&lt;br /&gt;
&lt;br /&gt;
This is a Nix based installation (preferred).&lt;br /&gt;
Clone the repository and run the nix shell. The first time will take time as everything is pulled in and set up.&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/librelane/librelane&lt;br /&gt;
 &lt;br /&gt;
 cd librelane&lt;br /&gt;
 nix-shell shell.nix&lt;br /&gt;
&lt;br /&gt;
If you run into python test errors, you may have to edit the default.nix, the line with &lt;br /&gt;
   doCheck = true;&lt;br /&gt;
to:&lt;br /&gt;
   doCheck = false;&lt;br /&gt;
&lt;br /&gt;
Run a test example to verify all works:&lt;br /&gt;
 mkdir my_designs&lt;br /&gt;
 cd my_designs/&lt;br /&gt;
 librelane --run-example spm&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11311</id>
		<title>OpenLane 2</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11311"/>
		<updated>2026-07-03T20:00:04Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* My local setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
OpenLane versions 1 and 2 is the VLSI design flow management framework. &lt;br /&gt;
&lt;br /&gt;
However, it has been superseeded by [[LibreLane]] that is suggested for new designs.&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane. This may take 6GB and more of the disk space for every run.&lt;br /&gt;
&lt;br /&gt;
Usually my project is mapped to a cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I do the runs locally, possibly outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenROAD ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. &lt;br /&gt;
You may need to look for the report file:&lt;br /&gt;
 find runs/RUN_... -name &amp;quot;antenna.rpt&amp;quot;&lt;br /&gt;
This may find several reports. look for the latest one by OpenROAD:&lt;br /&gt;
 runs/RUN_.../34-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../37-odb-heuristicdiodeinsertion/3-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../35-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../38-openroad-repairantennas/2-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../42-openroad-checkantennas-1/reports/antenna.rpt&lt;br /&gt;
&lt;br /&gt;
Use the latest report by OpenROAD to open in the tool.&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11310</id>
		<title>OpenLane 2</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11310"/>
		<updated>2026-07-03T19:57:24Z</updated>

		<summary type="html">&lt;p&gt;Leo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
OpenLane versions 1 and 2 is the VLSI design flow management framework. &lt;br /&gt;
&lt;br /&gt;
However, it has been superseeded by [[LibreLane]] that is suggested for new designs.&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenROAD ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. &lt;br /&gt;
You may need to look for the report file:&lt;br /&gt;
 find runs/RUN_... -name &amp;quot;antenna.rpt&amp;quot;&lt;br /&gt;
This may find several reports. look for the latest one by OpenROAD:&lt;br /&gt;
 runs/RUN_.../34-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../37-odb-heuristicdiodeinsertion/3-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../35-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../38-openroad-repairantennas/2-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../42-openroad-checkantennas-1/reports/antenna.rpt&lt;br /&gt;
&lt;br /&gt;
Use the latest report by OpenROAD to open in the tool.&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11309</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11309"/>
		<updated>2026-07-03T19:57:07Z</updated>

		<summary type="html">&lt;p&gt;Leo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
* [[LibreLane]] (superseeding OpenLane) has its own page here.&lt;br /&gt;
* [[OpenLane 2]] (going obsolete) has its own wiki page here&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - (obsolete) Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
* LibreLane - superseeds the OpenLane.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11308</id>
		<title>OpenLane 2</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=OpenLane_2&amp;diff=11308"/>
		<updated>2026-07-03T19:56:38Z</updated>

		<summary type="html">&lt;p&gt;Leo: Created page with &amp;quot;OpenLane versions 1 and 2 is the VLSI design flow management framework.   However, it has been superseeded by LibreLane that is suggested for new designs.  = Setup Openlin...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OpenLane versions 1 and 2 is the VLSI design flow management framework. &lt;br /&gt;
&lt;br /&gt;
However, it has been superseeded by [[LibreLane]] that is suggested for new designs.&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenROAD ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. &lt;br /&gt;
You may need to look for the report file:&lt;br /&gt;
 find runs/RUN_... -name &amp;quot;antenna.rpt&amp;quot;&lt;br /&gt;
This may find several reports. look for the latest one by OpenROAD:&lt;br /&gt;
 runs/RUN_.../34-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../37-odb-heuristicdiodeinsertion/3-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../35-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../38-openroad-repairantennas/2-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../42-openroad-checkantennas-1/reports/antenna.rpt&lt;br /&gt;
&lt;br /&gt;
Use the latest report by OpenROAD to open in the tool.&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11307</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11307"/>
		<updated>2026-07-03T19:54:09Z</updated>

		<summary type="html">&lt;p&gt;Leo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
* [[LibreLane]] (superseeding OpenLane) has its own page here.&lt;br /&gt;
* [[OpenLane 2]] (going obsolete) has its own wiki page here&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - (obsolete) Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
* LibreLane - superceeds the OpenLane.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11306</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11306"/>
		<updated>2026-07-03T19:49:49Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Open Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - (obsolete) Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
* LibreLane - superceeds the OpenLane.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenROAD ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. &lt;br /&gt;
You may need to look for the report file:&lt;br /&gt;
 find runs/RUN_... -name &amp;quot;antenna.rpt&amp;quot;&lt;br /&gt;
This may find several reports. look for the latest one by OpenROAD:&lt;br /&gt;
 runs/RUN_.../34-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../37-odb-heuristicdiodeinsertion/3-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../35-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../38-openroad-repairantennas/2-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../42-openroad-checkantennas-1/reports/antenna.rpt&lt;br /&gt;
&lt;br /&gt;
Use the latest report by OpenROAD to open in the tool.&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=Ubuntu_setup_for_a_class&amp;diff=11305</id>
		<title>Ubuntu setup for a class</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=Ubuntu_setup_for_a_class&amp;diff=11305"/>
		<updated>2026-07-03T18:05:36Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Python environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Ubuntu setup for my lab computers&lt;br /&gt;
&lt;br /&gt;
== All apt in one ==&lt;br /&gt;
&lt;br /&gt;
Note, that the downloaded apps and the extra commands are not included here. Read on for those.&lt;br /&gt;
 sudo apt-get install openssh-server build-essential git meld binutils gcc python3 python3-pip vlc audacious wine&lt;br /&gt;
 sudo apt-get install codeblocks octave octave-image&lt;br /&gt;
 sudo apt-get install openjdk-18-jdk  #&amp;lt;the-latest-version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download and install ==&lt;br /&gt;
&lt;br /&gt;
 sudo apt install software-properties-common apt-transport-https wget -y&lt;br /&gt;
&lt;br /&gt;
* Google Chrome&lt;br /&gt;
* Sublime Text&lt;br /&gt;
&lt;br /&gt;
* Visual Studio Code&lt;br /&gt;
 wget -O- https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor | sudo tee /usr/share/keyrings/vscode.gpg&lt;br /&gt;
 echo deb [arch=amd64 signed-by=/usr/share/keyrings/vscode.gpg] https://packages.microsoft.com/repos/vscode stable main | sudo tee /etc/apt/sources.list.d/vscode.list&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install code&lt;br /&gt;
&lt;br /&gt;
== Development tools ==&lt;br /&gt;
 sudo apt-get install build-essential subversion git meld&lt;br /&gt;
 sudo apt-get install binutils gcc &lt;br /&gt;
 sudo apt-get install gdebi-core&lt;br /&gt;
 sudo apt-get install codeblocks&lt;br /&gt;
 sudo apt-get install octave octave-image&lt;br /&gt;
 sudo apt-get install openjdk-18-jdk&lt;br /&gt;
 sudo apt-get install python3 python3-pip python3-numpy python3-scipy python3-matplotlib&lt;br /&gt;
&lt;br /&gt;
 sudo apt install libfuse2&lt;br /&gt;
&lt;br /&gt;
For older python2 Serial port compatibility you may need:&lt;br /&gt;
 sudo pip install &amp;quot;pySerial&amp;gt;=2.0,&amp;lt;=2.9999&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Network tools (optional)&lt;br /&gt;
 nmap arp-scan&lt;br /&gt;
&lt;br /&gt;
== Python environment ==&lt;br /&gt;
&lt;br /&gt;
The following packages should be installed in a python3 venv:&lt;br /&gt;
 pip3 install jupyter matplotlib pandas tqdm openpyxl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documents and Latex ==&lt;br /&gt;
&lt;br /&gt;
Latex tools:&lt;br /&gt;
 sudo apt-get install texlive texlive-latex-extra texlive-fonts-recommended texlive-fonts-extra texinfo&lt;br /&gt;
&lt;br /&gt;
PDF tools and pandoc:&lt;br /&gt;
 sudo apt-get install pdftk pandoc&lt;br /&gt;
&lt;br /&gt;
Annotating PDF documents (filling forms, etc)&lt;br /&gt;
 sudo apt-get install xournalpp&lt;br /&gt;
&lt;br /&gt;
== Multimedia ==&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install vlc audacity audacious&lt;br /&gt;
&lt;br /&gt;
== Windows environment ==&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install wine&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=Template:ProgrammersResorces&amp;diff=11304</id>
		<title>Template:ProgrammersResorces</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=Template:ProgrammersResorces&amp;diff=11304"/>
		<updated>2026-06-25T20:23:27Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Programmētāja resursi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Programmētāja resursi = &lt;br /&gt;
&lt;br /&gt;
* [http://selavo.lv/wiki/index.php/Linux_komandas Noderīgas Linux komandas]&lt;br /&gt;
* [http://bit.ly/bashbyex Bash by Example] @ibm/developerworks&lt;br /&gt;
* [http://tuxradar.com/content/how-linux-kernel-works Intro to Linux kernel]&lt;br /&gt;
&lt;br /&gt;
* [http://www.lysator.liu.se/c/bwk-tutor.html Programming in C: A Tutorial] (by Brian W. Kernighan)&lt;br /&gt;
* [https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html GCC and make] - par gcc kompilatoru no NTU&lt;br /&gt;
* [http://www.gnu.org/software/make/manual/make.html Gnu make] dokumentācija&lt;br /&gt;
* [https://www.gnu.org/software/make/manual/make.html#Makefile-Names makefile vai Makefile]?&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Tipiskas unix direktoriju hierarhijas] īss apraksts.&lt;br /&gt;
&lt;br /&gt;
* Sockets:&lt;br /&gt;
** [http://gnosis.cx/publish/programming/sockets.html Programming IP Sockets on Linux] (tutorial @ gnosis.cx)&lt;br /&gt;
** [http://www.linuxhowtos.org/C_C++/socket.htm Sockets Tutorial] @ Linux Howtos&lt;br /&gt;
** [http://en.wikipedia.org/wiki/Berkeley_sockets Berkeley sockets] (Wikipēdija)&lt;br /&gt;
&lt;br /&gt;
* http://www.hiraeth.com/alan/tutorials/courses/unixprog.html&lt;br /&gt;
* http://lkml.org/&lt;br /&gt;
* [http://tldp.org/LDP/lkmpg/2.6/html/index.html The Linux Kernel Module Programming Guide]&lt;br /&gt;
&lt;br /&gt;
* [https://nrecursions.blogspot.com/2014/08/mutex-tutorial-and-example.html Mutex tutorial and example]&lt;br /&gt;
&lt;br /&gt;
=== Programmēšanas analīzes rīki ===&lt;br /&gt;
* [http://pmd.sourceforge.net/pmd-5.2.1/ PMD] - scans source code and looks for bugs, dead code, suboptimal code, overcomplicated expressions, duplicate code.&lt;br /&gt;
&lt;br /&gt;
=== Linux veiktspējas analīze ===&lt;br /&gt;
* [http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html Top 20 Linux monitoring tools] @cyberciti&lt;br /&gt;
* [http://www.tecmint.com/command-line-tools-to-monitor-linux-performance/ 20 rīki Linux veikstpējas monitoringam] (IPTraf u.c.) @tecmint&lt;br /&gt;
* [http://www.cyberciti.biz/tips/how-do-i-find-out-linux-cpu-utilization.html CPU analīze]&lt;br /&gt;
* [http://www.cyberciti.biz/tips/linux-disk-performance-monitoring-howto.html Disku I/O analīze]&lt;br /&gt;
* [http://www.linuxprogrammingblog.com/io-profiling IO profiling] at Linux programming blog&lt;br /&gt;
* [https://www.linux.com/learn/tutorials/470979-who-and-what-is-on-my-network-probing-your-network-with-linux Tīkla analīze]&lt;br /&gt;
** Tīkla caurplūdes testi&lt;br /&gt;
 $ yes | pv | ssh user@example.com &amp;quot;cat &amp;gt; /dev/null&amp;quot;&lt;br /&gt;
      97,3MiB 0:01:36 [1,28MiB/s][         &amp;lt;=&amp;gt;    ]&lt;br /&gt;
&lt;br /&gt;
 $ mtr -rw -c 100  &amp;lt;server_ip&amp;gt;&lt;br /&gt;
      HOST: &amp;lt;myhost&amp;gt;     Loss%   Snt   Last   Avg  Best  Wrst StDev&lt;br /&gt;
      1.|-- _gateway      0.0%   100    0.7   0.6   0.3   2.4   0.2&lt;br /&gt;
      2.|-- &amp;lt;server_ip&amp;gt;   1.0%   100    1.0   4.3   0.9  26.6   5.7&lt;br /&gt;
&lt;br /&gt;
 $ iperf3 -s    # startē serveri vienā galā&lt;br /&gt;
      Server listening on 5201&lt;br /&gt;
 $ iperf3 -c &amp;lt;server_ip&amp;gt;    # startē klientu otrā galā&lt;br /&gt;
      Connecting to host &amp;lt;server_ip&amp;gt;, port 5201&lt;br /&gt;
      [  5] local 192.168.1.123 port 51846 connected to &amp;lt;server_ip&amp;gt; port 5201&lt;br /&gt;
      [ ID] Interval           Transfer     Bitrate         Retr  Cwnd&lt;br /&gt;
      [  5]   0.00-1.00   sec  1.42 MBytes  11.9 Mbits/sec    0   89.1 KBytes       &lt;br /&gt;
      [  5]   1.00-2.00   sec  1.62 MBytes  13.6 Mbits/sec    0    147 KBytes       &lt;br /&gt;
      ...&lt;br /&gt;
      [  5]   9.00-10.00  sec  2.30 MBytes  19.3 Mbits/sec    0    595 KBytes       &lt;br /&gt;
      - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
      [ ID] Interval           Transfer     Bitrate         Retr&lt;br /&gt;
      [  5]   0.00-10.00  sec  14.2 MBytes  11.9 Mbits/sec    0             sender&lt;br /&gt;
      [  5]   0.00-10.42  sec  11.6 MBytes  9.36 Mbits/sec                  receiver&lt;br /&gt;
&lt;br /&gt;
 $ nstat -az | grep -Ei &amp;quot;drop|overflow|retrans&amp;quot;&lt;br /&gt;
      TcpRetransSegs                  127923             0.0&lt;br /&gt;
      TcpExtLockDroppedIcmps          0                  0.0&lt;br /&gt;
      TcpExtListenDrops               1                  0.0&lt;br /&gt;
      TcpExtTCPLostRetransmit         11837              0.0&lt;br /&gt;
      ...&lt;br /&gt;
&lt;br /&gt;
 $ ethtool eth0&lt;br /&gt;
      Settings for eth0:&lt;br /&gt;
      Supported ports: [ TP ]&lt;br /&gt;
      Supported link modes:   10baseT/Half 10baseT/Full&lt;br /&gt;
                        100baseT/Half 100baseT/Full&lt;br /&gt;
                        1000baseT/Full&lt;br /&gt;
      ...&lt;br /&gt;
&lt;br /&gt;
 $ sudo ethtool -S eth0 | grep -E &amp;quot;errors|dropped|fifo|collision&amp;quot;&lt;br /&gt;
      collisions: 0&lt;br /&gt;
      rx_crc_errors: 0&lt;br /&gt;
      rx_missed_errors: 0&lt;br /&gt;
      tx_aborted_errors: 0&lt;br /&gt;
      tx_carrier_errors: 0&lt;br /&gt;
      ...&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;bashtop&amp;quot; rīks veiktspējas analīzei&lt;br /&gt;
&lt;br /&gt;
== Āķīgi uzdevumi un pieredze ==&lt;br /&gt;
* [https://www.geeksforgeeks.org/c-cpp-tricky-programs/ C/C++ Tricky Programs]&lt;br /&gt;
* [https://qr.ae/TiJLgg Computers are exact, precise, and logical machines, until they aren’t.]&lt;br /&gt;
* [https://adventofcode.com Advent of Code]&lt;br /&gt;
&lt;br /&gt;
== Atziņas ==&lt;br /&gt;
* [http://norvig.com/21-days.html Teach yourself programming in 10 years] by Peter Norvig&lt;br /&gt;
* [https://rhodecode.com/blog/code-review-learn-nasa-codes/ Code review: Learn how NASA codes (blog)], and [http://cacm.acm.org/magazines/2014/2/171689-mars-code/fulltext Mars Code (ACM article)]&lt;br /&gt;
* [http://www.catb.org/esr/faqs/things-every-hacker-once-knew/ Things Every Hacker Once Knew]&lt;br /&gt;
* [https://qr.ae/pG0Mez Kāpēc CR+LF?] - Par to kāpēc vēsturisku iemeslu dēļ Windows sistēmās teksta rindas beigās ir CR+LF, kamēr Unix sistēmā tikai LF&lt;br /&gt;
* [https://github.com/FabioLolix/LinuxTimeline/releases Linux Timeline] - Linux distributīvu vēstures diagramma.&lt;br /&gt;
 &lt;br /&gt;
* [https://youtu.be/mfv0V1SxbNA?si=VNmUNOkyzbG0du03 Linus ar Linus par Linux] un ne tikai, kamēr būvē datoru priekš Linus (2025).&lt;br /&gt;
&lt;br /&gt;
* [http://selavo.lv/kursi/lsp/Linux_Distribution_Timeline_v2024.png Linux Distribution Timeline] (2024) - liels attēls ar Linux distributīvu savstarpējo saikni un vēsturi.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=LU-LSP-b:MD3&amp;diff=11303</id>
		<title>LU-LSP-b:MD3</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=LU-LSP-b:MD3&amp;diff=11303"/>
		<updated>2026-06-22T07:14:14Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* MD3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
=MD_DIR=&lt;br /&gt;
&lt;br /&gt;
===Mērķi===&lt;br /&gt;
&lt;br /&gt;
* Direktorijas koka rekursīva apstaigāšana&lt;br /&gt;
* Failu parametru nolasīšana un analīze&lt;br /&gt;
* Darbs ar stat(), opendir(),readdir(),closedir()&lt;br /&gt;
* Hash tabulas pielietojumi&lt;br /&gt;
* MD5 pielietojums&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Uzdevums===&lt;br /&gt;
&lt;br /&gt;
Uzrakstīt programmu &amp;#039;&amp;#039;&amp;#039;md3&amp;#039;&amp;#039;&amp;#039;, kas apstaigā direktoriju koku un atrod tos failus kas ir duplikāti, respektīvi, atrodami vairākos eksemplāros. &lt;br /&gt;
&lt;br /&gt;
Apstaigāšana jāsāk no tās direktorijas, kurā programma izpildās (t.i. direktorijas ar nosaukumu &amp;quot;.&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Faili tiek uzskatīti par vienādiem, ja tiem ir vienāds izmērs un faila vārds, izņemot MD5 režīmā, kad failu vienādību nosaka MD5 vērtības.&lt;br /&gt;
&lt;br /&gt;
Saites (symbolic links, t.i. &amp;quot;vājās&amp;quot; saites) jāignorē. Divas vājās saites, vai arī fails un vājā saite uz to nav jāsalīdzina.&lt;br /&gt;
&lt;br /&gt;
Vārds un izmērs jāpārbauda vienmēr, izņemot MD5 režīmu. Papildus pārbaudes nosaka parametri:&lt;br /&gt;
 md3 -d      pārbauda arī faila satura izmaiņu datumu (&amp;#039;&amp;#039;st_mtime&amp;#039;&amp;#039;) sakritību&lt;br /&gt;
 md3 -m      aprēķina un salīdzina MD5 vērtību faila saturam (bez vārda un datuma). &lt;br /&gt;
 md3 -h      izvada palīga tekstu par parametriem&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Izdrukas formāts (uz &amp;#039;&amp;#039;stdout&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
 === date size filename1 [MD5]&lt;br /&gt;
 path1/filename1 &lt;br /&gt;
 path2/filename1 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 === date size filename2 [MD5]&lt;br /&gt;
 path1/filename2 &lt;br /&gt;
 path2/filename2 &lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Datuma formāts ir tāds pat kā  &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;: (yyyy-mm-dd hh:mm). Piemēram: 2010-09-25 21:45&lt;br /&gt;
&lt;br /&gt;
MD5 jādrukā tikai tad, ja pie programmas izsaukuma parametrs bija &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt;. &lt;br /&gt;
MD5 drukājams kā heksadecimālu simbolu virkne bez tukšumiem.&lt;br /&gt;
&lt;br /&gt;
Šajā gadījumā failu vienādību nosaka tikai MD5 sakritība, un izvads var nedaudz atšķirties - jo vienādiem failiem var atšķirties to vārdi un satura izmaiņu datumi. Datums izvadāms tikai vienam failam.&lt;br /&gt;
&lt;br /&gt;
 === date size filename1 [MD5]&lt;br /&gt;
 path1/filename1 &lt;br /&gt;
 path2/filename2 &lt;br /&gt;
 path3/filename3 &lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
===Jāiesniedz===&lt;br /&gt;
Darbs jāiesniedz kursa serverī, direktorijā &amp;#039;&amp;#039;&amp;#039;md_dir&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Jāiesniedz sekojoši faili:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;md_dir.c&amp;#039;&amp;#039;&amp;#039; - C programmas pirmkods.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Makefile&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;apraksts.pdf&amp;#039;&amp;#039;&amp;#039; īss apraksts un atbildes uz jautājumiem. nepieciešamības gadījumā dokumentā var iekļaut ekrānšāviņus.&lt;br /&gt;
&lt;br /&gt;
===Vērtējums===&lt;br /&gt;
&lt;br /&gt;
Uzdevums tiks vērtēts sekojoši:&lt;br /&gt;
# 60% - Korekta programmas darbība salīdzinot tikai failu vārdus un izmērus&lt;br /&gt;
# 10% - -d datuma salīdzināšanas opcijas realizācija&lt;br /&gt;
# 20% - -m opcijas realizācija&lt;br /&gt;
# 10% - -h realizācija&lt;br /&gt;
&lt;br /&gt;
===Piemēri===&lt;br /&gt;
&lt;br /&gt;
Darbinām md3, salīdzinām arī datumus, izvadam rezultātus log failā.&lt;br /&gt;
&lt;br /&gt;
 md3 -d &amp;gt; log&lt;br /&gt;
&lt;br /&gt;
Salīdzinām failus tikai pēc vārdiem un izmēriem&lt;br /&gt;
 md3&lt;br /&gt;
Salīdzinām failus pēc vārdiem un izmaiņu datumiem&lt;br /&gt;
 md3 -d&lt;br /&gt;
Salīdzinām failus pēc satura&lt;br /&gt;
 md3 -m&lt;br /&gt;
Salīdzinām failus pēc satura, vārdiem un datumiem. Izvadam tikai tos, kam visi vienādi.&lt;br /&gt;
 md3 -d -m&lt;br /&gt;
&lt;br /&gt;
===Derīga informācija===&lt;br /&gt;
&lt;br /&gt;
* [http://linux.die.net/man/2/stat stat()]&lt;br /&gt;
* [http://linux.die.net/man/3/opendir opendir()], [http://linux.die.net/man/3/readdir readdir()], [http://linux.die.net/man/3/closedir closedir()]&lt;br /&gt;
* [http://xml-lit.sourceforge.net/doc/indexs05.html Hash funkcijas un tabulas piemērs]&lt;br /&gt;
* [https://web.archive.org/web/20160425114142/https://userpages.umbc.edu/~mabzug1/cs/md5/md5.html MD5]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html MD5]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Drīkst lietot gatavu MD5 implementāciju, piemēram, no libcrytpo. Lai varetu izmantot &amp;quot;openssl/md5.h&amp;quot; jums jāinstallē:&lt;br /&gt;
 sudo apt-get install libssl-dev&lt;br /&gt;
Un saišu redaktoram jānorāda attiecīgā bibliotēka (-lcrypto):&lt;br /&gt;
 gcc -Wall -o md5 md5.c -lcrypto&lt;br /&gt;
&lt;br /&gt;
* Ieteikums: izstrādājiet programmatūru pakāpeniski. Piemēram, vispirms ielasiet un izdrukājiet datus. Tad pievienojiet datu analīzi un reģistrēšanu savās datu struktūrās. Tad pievienojiet datu analīzi lai tos sakārtotu izdrukai. Testējiet vispirms uz pareiziem datiem. tad uz kļūdainiem datiem.&lt;br /&gt;
&lt;br /&gt;
==J&amp;amp;A (jautājumi un atbildes)==&lt;br /&gt;
&lt;br /&gt;
====J: Uzdevums pārāk grūts, vai var pagarināt termiņu?====&lt;br /&gt;
&lt;br /&gt;
A: Noteiktais termiņš paliek spēkā. Iesaku risināt savlaicīgi, lai pietiek laika neparedzētu problēmu risināšanai.&lt;br /&gt;
&lt;br /&gt;
====J: Vai jāignorē gan &amp;quot;soft&amp;quot;, gan &amp;quot;hard&amp;quot; saites?====&lt;br /&gt;
&lt;br /&gt;
A: Vājās saites (soft links) jāignorē. Stingrās saites (hard links) nav jāignorē.&lt;br /&gt;
Lielākā daļa failu, ko mēs ikdienā redzam savās direktorijās ir cietās &lt;br /&gt;
saites uz failu i-node struktūrām. Tāpēc ignorējot arī stingrās saites mēs ignorētu &lt;br /&gt;
praktiski visus failus.&lt;br /&gt;
&lt;br /&gt;
====J: Vai drukājot ārā ceļu uz duplikāt-failu ir nepieciešams likt klāt &amp;quot;./&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
 === 2014-10-04 18:11 509 ATest.c&lt;br /&gt;
 ./my_dir4/ATest.c&lt;br /&gt;
 ./ATest.c&lt;br /&gt;
vai&lt;br /&gt;
 === 2014-10-04 18:11 509 ATest.c&lt;br /&gt;
 my_dir4/ATest.c&lt;br /&gt;
 ATest.c&lt;br /&gt;
&lt;br /&gt;
A: &amp;quot;./&amp;quot; priekšā nav jāliek, tātad pareizs ir otrais variants&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Uz [[LU-LSP-b | LSP kursa ]] sākuma lapu.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11302</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11302"/>
		<updated>2026-06-19T17:44:53Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* OpenRoad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenROAD ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. &lt;br /&gt;
You may need to look for the report file:&lt;br /&gt;
 find runs/RUN_... -name &amp;quot;antenna.rpt&amp;quot;&lt;br /&gt;
This may find several reports. look for the latest one by OpenROAD:&lt;br /&gt;
 runs/RUN_.../34-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../37-odb-heuristicdiodeinsertion/3-openroad-globalrouting/antenna.rpt&lt;br /&gt;
 runs/RUN_.../35-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../38-openroad-repairantennas/2-openroad-checkantennas/reports/antenna.rpt&lt;br /&gt;
 runs/RUN_.../42-openroad-checkantennas-1/reports/antenna.rpt&lt;br /&gt;
&lt;br /&gt;
Use the latest report by OpenROAD to open in the tool.&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11301</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11301"/>
		<updated>2026-06-19T17:35:35Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* OpenRoad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenRoad ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. This is typically located at:&lt;br /&gt;
 runs/RUN_.../reports/routing/antenna.rpt  (or an equivalent .json or .lyrdb file in the signoff/routing reports directory).&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11300</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11300"/>
		<updated>2026-06-19T17:34:57Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Expected results */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
==== OpenRoad ====&lt;br /&gt;
Now it is time to look at the generated layout.&lt;br /&gt;
&lt;br /&gt;
 # Force software-based OpenGL rendering&lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=1&lt;br /&gt;
 &lt;br /&gt;
 # Force Qt to use the X11 backend (bypassing native Wayland issues)&lt;br /&gt;
 export QT_QPA_PLATFORM=xcb &lt;br /&gt;
 &lt;br /&gt;
 openroad -gui&lt;br /&gt;
&lt;br /&gt;
Then from the TCL commands console at the bottom of the OpenROAD GUI open your new design:&lt;br /&gt;
  read_db runs/RUN_.../final/odb/neorv32_verilog_wrapper.odb&lt;br /&gt;
&lt;br /&gt;
There in the tool you can proceed to the Display Control panel on the left to hide standard cells and inspect the routing layers.&lt;br /&gt;
* Under the Visibility tab, uncheck Instances (or specifically StdCells) to hide the internal logic gates.&lt;br /&gt;
* Expand the Layers menu. Here, you can toggle individual routing layers (met1, met2, met3, met4, met5) and vias to visually trace the physical connections across the die.&lt;br /&gt;
&lt;br /&gt;
To jump directly to the physical wires that caused the antenna failures:&lt;br /&gt;
* In the top menu bar, navigate to Tools -&amp;gt; DRC Viewer.&lt;br /&gt;
* Click Load and navigate to the antenna report generated during your run. This is typically located at:&lt;br /&gt;
runs/RUN_.../reports/routing/antenna.rpt (or an equivalent .json or .lyrdb file in the signoff/routing reports directory).&lt;br /&gt;
* The DRC Viewer will open a list of the violations, if any.&lt;br /&gt;
* Click on any violation in the list. The main camera will instantly pan, zoom, and highlight the exact wire segment and layer where the charge accumulation risk occurs.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11299</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11299"/>
		<updated>2026-06-19T17:05:40Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Expected results */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
Now it is time to look at the generated layout.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11298</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11298"/>
		<updated>2026-06-19T17:05:19Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* config.json */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Expected results ====&lt;br /&gt;
If all goes well, after an hour or so you may see the final remarks of the design in the terminal before it finishes.&lt;br /&gt;
A few important bits there:&lt;br /&gt;
#. DRC &amp;amp; LVS (Passed ✅)&lt;br /&gt;
#** DRC (Design Rule Check): The geometry of your standard cells, power straps, and routing wires strictly obeys the Sky130 foundry&amp;#039;s physical manufacturing rules (minimum spacing, width, etc.).&lt;br /&gt;
#** LVS (Layout vs. Schematic): The final geometric layout perfectly matches your synthesized Verilog netlist. No unexpected shorts or open circuits were created during routing.&lt;br /&gt;
&lt;br /&gt;
#. Antenna Violations (Failed 𐄂 - 8 Violations)&lt;br /&gt;
#* During plasma etching in fabrication, long metal wires act like antennas, collecting electrostatic charge that can blow out the thin gate oxides of connected transistors.&lt;br /&gt;
#* OpenLane attempted to fix these automatically (since we enabled RUN_ANTENNA_REPAIR), usually by jumping to higher metal layers or inserting &amp;quot;tie-down&amp;quot; diodes near the gates.&lt;br /&gt;
#* 8 violations simply mean a few nets are still too long relative to their connected gate area. In a real tape-out, you would manually inspect these in the GUI and force diode insertion or add routing blockages.&lt;br /&gt;
&lt;br /&gt;
#. Max Slew &amp;amp; Max Cap Violations (Warnings)&lt;br /&gt;
#* These are electrical rule violations indicating that some signals are transitioning too slowly (slew) or driving too much load (capacitance).&lt;br /&gt;
#* Because we relied on OpenLane&amp;#039;s generic fallback constraints rather than providing a custom .sdc (Synopsys Design Constraints) file, the timing-driven routing and buffer insertion heuristics were not strictly optimized for your specific 25ns clock period across all extreme temperature/voltage corners.&lt;br /&gt;
#* For a functional test run, these are completely safe to ignore.&lt;br /&gt;
&lt;br /&gt;
Now it is time to look at the generated layout.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11297</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11297"/>
		<updated>2026-06-19T16:39:19Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* VHDL to Verilog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process. Move the Verilog file to your project sourde directory when done:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
    mv src/neorv32_verilog_wrapper.v &amp;lt;your-project-dir&amp;gt;/src/&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11296</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11296"/>
		<updated>2026-06-19T16:36:35Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* config.json */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11295</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11295"/>
		<updated>2026-06-19T16:36:05Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* config.json */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
    &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11294</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11294"/>
		<updated>2026-06-19T16:34:23Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Usecase: NeoRV32 MCU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/stnolting/neorv32 GitHub repo] - Original VHDL version&lt;br /&gt;
* [https://github.com/stnolting/neorv32-verilog Repo for the verilog version] - A wrapper and converter script for Verilog&lt;br /&gt;
&lt;br /&gt;
==== VHDL to Verilog ====&lt;br /&gt;
Openlane2 is using Yosis for synthesis, which natively supports Verilog. &lt;br /&gt;
Therefore we need to convert to a flat Verilog file. Therefore clone the second repository recursively:&lt;br /&gt;
    git clone --recursive -j8 git@github.com:stnolting/neorv32-verilog.git&lt;br /&gt;
    cd neorv32-verilog&lt;br /&gt;
&lt;br /&gt;
Before the convertion go to the VHDL file and enable/disable the features you want. &lt;br /&gt;
Consider agressively disabling and downsizing everything to the minimum at least for the first runs so that the tools (e.g. yosys) can handle such a massive flat file.&lt;br /&gt;
&lt;br /&gt;
    cd git.local/neorv32-verilog/src/&lt;br /&gt;
    edit* neorv32_verilog_wrapper.vhd&lt;br /&gt;
&lt;br /&gt;
Go towards the end of the file and change true and false appropriately. Look for lines below the:&lt;br /&gt;
 architecture neorv32_verilog_wrapper_rtl of neorv32_verilog_wrapper is&lt;br /&gt;
 begin&lt;br /&gt;
   ...&lt;br /&gt;
   generic map ( -- [note] add configuration options as required&lt;br /&gt;
&lt;br /&gt;
Consider the following:&lt;br /&gt;
* &amp;quot;false&amp;quot; every &amp;quot;true&amp;quot; except as below&lt;br /&gt;
    -- Internal Instruction memory (IMEM) --&lt;br /&gt;
    IMEM_EN             =&amp;gt; true,        -- implement processor-internal instruction memory&lt;br /&gt;
    IMEM_SIZE           =&amp;gt; 16*16,       -- size of processor-internal instruction memory in bytes&lt;br /&gt;
    -- Internal Data memory (DMEM) --&lt;br /&gt;
    DMEM_EN             =&amp;gt; true,        -- implement processor-internal data memory&lt;br /&gt;
    DMEM_SIZE           =&amp;gt; 8*32,        -- size of processor-internal data memory in bytes&lt;br /&gt;
    -- CPU Caches --&lt;br /&gt;
    ICACHE_EN           =&amp;gt; true,        -- implement instruction cache (i-cache)&lt;br /&gt;
    ICACHE_NUM_BLOCKS   =&amp;gt; 4,           -- i-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    DCACHE_EN           =&amp;gt; true,        -- implement data cache (d-cache)&lt;br /&gt;
    DCACHE_NUM_BLOCKS   =&amp;gt; 4,           -- d-cache: number of blocks (min 1), has to be a power of 2&lt;br /&gt;
    CACHE_BLOCK_SIZE    =&amp;gt; 64,          -- i-cache/d-cache: block size in bytes (min 4), has to be a power of 2&lt;br /&gt;
 ...&lt;br /&gt;
    IO_UART0_EN         =&amp;gt; true,        -- implement primary universal asynchronous receiver/transmitter (UART0)?&lt;br /&gt;
 ... &lt;br /&gt;
    IO_PWM_NUM          =&amp;gt; 0,           -- number of PWM channels to implement (0..32)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install the ghdl for conversion unless already installed, and start the conversion process:&lt;br /&gt;
    sudo apt-get install ghdl&lt;br /&gt;
    make check&lt;br /&gt;
    make convert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
Some comments about the config file:&lt;br /&gt;
* Make sure to edit the vhdl and enable/disable only the components that you need. Or the tools may crash even with extra stack size on such a large flat file.&lt;br /&gt;
* &amp;quot;RUN_LINTER&amp;quot;: false - othrvise here be errors on such a large flat file.&lt;br /&gt;
* You may need to specify a lot of size on the die:&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
* Alternatively let the tools decide the size:&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
    &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
&lt;br /&gt;
The config.json file:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11293</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11293"/>
		<updated>2026-06-19T16:07:52Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* config.json */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;br /&gt;
[https://github.com/stnolting/neorv32-verilog Repo for the verilog version]&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_verilog_wrapper&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_verilog_wrapper.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY_PCT&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;RUN_ANTENNA_REPAIR&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_HEURISTIC_DIODE_INSERTION&amp;quot;: true,&lt;br /&gt;
        &amp;quot;RUN_LINTER&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;_comment&amp;quot;: &lt;br /&gt;
        {&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: [0, 0, 1000, 1000],&lt;br /&gt;
        &amp;quot;CORE_AREA&amp;quot;: [15, 15, 985, 985]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11292</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11292"/>
		<updated>2026-06-19T07:24:45Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Usecase: NeoRV32 MCU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;br /&gt;
[https://github.com/stnolting/neorv32-verilog Repo for the verilog version]&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_top&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_top.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;RUN_CVC&amp;quot;: false&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11291</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11291"/>
		<updated>2026-06-19T07:24:26Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Usecase: NeoRV32 MCU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;br /&gt;
[https://github.com/stnolting/neorv32-verilog Repo for the verilog version]&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;neorv32_top&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::src/neorv32_top.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk_i&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 25.0,&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sky130A&amp;quot;,&lt;br /&gt;
        &amp;quot;STD_CELL_LIBRARY&amp;quot;: &amp;quot;sky130_fd_sc_hd&amp;quot;,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 35,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.40,&lt;br /&gt;
        &amp;quot;SYNTH_STRATEGY&amp;quot;: &amp;quot;AREA 0&amp;quot;,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vccd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&lt;br /&gt;
            &amp;quot;vssd1&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;RUN_CVC&amp;quot;: false&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11290</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11290"/>
		<updated>2026-06-19T07:00:59Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Usecase: RAM integration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: SRAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
 &lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
top_module.v&lt;br /&gt;
&lt;br /&gt;
 module top_module (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //     inout vccd1,&lt;br /&gt;
 //     inout vssd1,&lt;br /&gt;
 // `endif&lt;br /&gt;
     input clk, &lt;br /&gt;
     input rst_n, &lt;br /&gt;
     input req, &lt;br /&gt;
     input we, &lt;br /&gt;
     input [7:0] addr, &lt;br /&gt;
     input [31:0] data_in, &lt;br /&gt;
     output reg [31:0] data_out, &lt;br /&gt;
     output reg ready &lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
     wire [31:0] sram_dout; &lt;br /&gt;
     &lt;br /&gt;
     // SRAM macro instantiation&lt;br /&gt;
     sky130_sram_1kbyte_1rw1r_32x256_8 sram_inst (&lt;br /&gt;
 // `ifdef USE_POWER_PINS&lt;br /&gt;
 //         .vccd1(vccd1),&lt;br /&gt;
 //         .vssd1(vssd1),&lt;br /&gt;
 // `endif&lt;br /&gt;
         // Port 0: RW&lt;br /&gt;
         .clk0(clk),&lt;br /&gt;
         .csb0(~req),&lt;br /&gt;
         .web0(~we),&lt;br /&gt;
         .wmask0(4&amp;#039;b1111), // 4-bit mask set to high to write all 32 bits&lt;br /&gt;
         .addr0(addr),&lt;br /&gt;
         .din0(data_in),&lt;br /&gt;
         .dout0(sram_dout),&lt;br /&gt;
         &lt;br /&gt;
         // Port 1: R (Tied off as it is unused in this design)&lt;br /&gt;
         .clk1(1&amp;#039;b0),&lt;br /&gt;
         .csb1(1&amp;#039;b1),      // Active low, 1 disables the port&lt;br /&gt;
         .addr1(8&amp;#039;b0),&lt;br /&gt;
         .dout1()&lt;br /&gt;
     );&lt;br /&gt;
 &lt;br /&gt;
     always @(posedge clk or negedge rst_n) begin &lt;br /&gt;
         if (!rst_n) begin &lt;br /&gt;
             data_out &amp;lt;= 32&amp;#039;b0; &lt;br /&gt;
             ready &amp;lt;= 1&amp;#039;b0; &lt;br /&gt;
         end else begin &lt;br /&gt;
             ready &amp;lt;= req; &lt;br /&gt;
             if (req &amp;amp;&amp;amp; !we) begin &lt;br /&gt;
                 data_out &amp;lt;= sram_dout; &lt;br /&gt;
             end &lt;br /&gt;
         end &lt;br /&gt;
     end &lt;br /&gt;
 endmodule&lt;br /&gt;
&lt;br /&gt;
sram_macro.v&lt;br /&gt;
&lt;br /&gt;
    (* blackbox *)&lt;br /&gt;
    module sky130_sram_1kbyte_1rw1r_32x256_8 (&lt;br /&gt;
    `ifdef USE_POWER_PINS&lt;br /&gt;
        inout vccd1,&lt;br /&gt;
        inout vssd1,&lt;br /&gt;
    `endif&lt;br /&gt;
        // Port 0: RW&lt;br /&gt;
        input clk0,&lt;br /&gt;
        input csb0,&lt;br /&gt;
        input web0,&lt;br /&gt;
        input [3:0] wmask0,&lt;br /&gt;
        input [7:0] addr0,&lt;br /&gt;
        input [31:0] din0,&lt;br /&gt;
        output [31:0] dout0,&lt;br /&gt;
        &lt;br /&gt;
        // Port 1: R&lt;br /&gt;
        input clk1,&lt;br /&gt;
        input csb1,&lt;br /&gt;
        input [7:0] addr1,&lt;br /&gt;
        output [31:0] dout1&lt;br /&gt;
    );&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
Note that there is another directory &amp;quot;macro/&amp;quot; where the files from sram PDK are placed.&lt;br /&gt;
This folder has the following files:&lt;br /&gt;
&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8.v&lt;br /&gt;
    macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&lt;br /&gt;
&lt;br /&gt;
These have to be obtained from the PDK provider. &lt;br /&gt;
Here is more detailed documentation:&lt;br /&gt;
[https://armleo-openlane.readthedocs.io/en/merge-window-4/tutorials/openram.html Designing a chip with an OpenRAM (sky130)]&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11289</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11289"/>
		<updated>2026-06-19T06:50:39Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Usecase: RAM integration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
Note, this design may still have unresolved issues (FIXME).&lt;br /&gt;
The magic tool has some issues with the sram implementation, therefore there are a few workarounds in the config file to depend mostly on klayout for the final steps.&lt;br /&gt;
&lt;br /&gt;
==== config.json ====&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;top_module&amp;quot;,&lt;br /&gt;
    &amp;quot;VERILOG_FILES&amp;quot;: [&lt;br /&gt;
      &amp;quot;dir::src/top_module.v&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
    &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    &amp;quot;DIE_AREA&amp;quot;: [0.0, 0.0, 1000.0, 1000.0],&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
    &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
    &amp;quot;PDN_MACRO_CONNECTIONS&amp;quot;: [&lt;br /&gt;
      &amp;quot;sram_inst vccd1 vssd1 vccd1 vssd1&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;PRIMARY_GDSII_STREAMOUT_TOOL&amp;quot;: &amp;quot;klayout&amp;quot;,&lt;br /&gt;
    &amp;quot;RUN_KLAYOUT_XOR&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_STREAMOUT&amp;quot;: false,&lt;br /&gt;
    &amp;quot;RUN_MAGIC_DRC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_EXT_USE_GDS&amp;quot;: false,&lt;br /&gt;
    &amp;quot;MAGIC_INCLUDE_GDS_POINTERS&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;MACROS&amp;quot;: {&lt;br /&gt;
      &amp;quot;sky130_sram_1kbyte_1rw1r_32x256_8&amp;quot;: {&lt;br /&gt;
        &amp;quot;instances&amp;quot;: {&lt;br /&gt;
          &amp;quot;sram_inst&amp;quot;: {&lt;br /&gt;
            &amp;quot;location&amp;quot;: [200.0, 200.0],&lt;br /&gt;
            &amp;quot;orientation&amp;quot;: &amp;quot;R0&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;vh&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::src/sram_macro.v&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lef&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.lef&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;gds&amp;quot;: [&lt;br /&gt;
          &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8.gds&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;lib&amp;quot;: {&lt;br /&gt;
          &amp;quot;*&amp;quot;: [&lt;br /&gt;
            &amp;quot;dir::macro/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==== Sources: src/ ====&lt;br /&gt;
&lt;br /&gt;
==== Sources: macro/ ====&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11288</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11288"/>
		<updated>2026-06-19T06:46:03Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Usecase: Simple counter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Adder =&lt;br /&gt;
This is logic only, no registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (src/adder_16bit.v):&lt;br /&gt;
    `default_nettype none&lt;br /&gt;
    module adder_16bit (&lt;br /&gt;
        input  wire [15:0] a,&lt;br /&gt;
        input  wire [15:0] b,&lt;br /&gt;
        input  wire        cin,&lt;br /&gt;
        output wire [15:0] sum,&lt;br /&gt;
        output wire        cout&lt;br /&gt;
    );&lt;br /&gt;
        assign {cout, sum} = a + b + cin;&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter =&lt;br /&gt;
This design has a few registers&lt;br /&gt;
&lt;br /&gt;
config.json&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Verilog source (counter.v):&lt;br /&gt;
    module counter (&lt;br /&gt;
        input wire clk,&lt;br /&gt;
        input wire reset,&lt;br /&gt;
        output reg [15:0] count&lt;br /&gt;
    );&lt;br /&gt;
        always @(posedge clk or posedge reset) begin&lt;br /&gt;
            if (reset)&lt;br /&gt;
                count &amp;lt;= 16&amp;#039;b0;&lt;br /&gt;
            else&lt;br /&gt;
                count &amp;lt;= count + 1&amp;#039;b1;&lt;br /&gt;
        end&lt;br /&gt;
    endmodule&lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11287</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11287"/>
		<updated>2026-06-19T06:39:04Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* The config.json file */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
Here is a bit more with the die area:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;adder_16bit&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: &amp;quot;dir::src/adder_16bit.v&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_TREE_SYNTH&amp;quot;: false,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: null,&lt;br /&gt;
        &amp;quot;FP_SIZING&amp;quot;: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
        &amp;quot;DIE_AREA&amp;quot;: &amp;quot;0 0 100 100&amp;quot;,&lt;br /&gt;
        &amp;quot;PL_TARGET_DENSITY&amp;quot;: 0.65,&lt;br /&gt;
        &amp;quot;VDD_NETS&amp;quot;: [&amp;quot;vccd1&amp;quot;],&lt;br /&gt;
        &amp;quot;GND_NETS&amp;quot;: [&amp;quot;vssd1&amp;quot;],&lt;br /&gt;
        &amp;quot;DIODE_INSERTION_STRATEGY&amp;quot;: 4&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11286</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11286"/>
		<updated>2026-06-19T06:36:58Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* My local setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Setting up a new project =&lt;br /&gt;
A project is usually kept in one directory. It may contain:&lt;br /&gt;
* config.json file with the project options. Potentially you could have several configs, for different technologies, although probably berret to have a separate project for each.&lt;br /&gt;
* src/ directory with the Verilog or VHDL files&lt;br /&gt;
* runs/ directory with many intermediate and log files as populated by the openlane2 tool(s).&lt;br /&gt;
** The runs/ has a RUN&amp;lt;timestamp&amp;gt; folder for each openalne run. Each of those will have the following:&lt;br /&gt;
*** Folders from 01-... and up to 74-... or more with files according to the respective run steps&lt;br /&gt;
*** final/ directory with the final results, including the magic and klayout and gds files with the final layout, spice files, etc.&lt;br /&gt;
*** tmp - temporary directory.&lt;br /&gt;
*** flow, warning and error logs.&lt;br /&gt;
&lt;br /&gt;
== The config.json file ==&lt;br /&gt;
Technically other formats such as yaml are also supported, but lets stick to json.&lt;br /&gt;
Here is an example of a simple config.json file for SKY PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;met4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Here is another for IHP PDK:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;DESIGN_NAME&amp;quot;: &amp;quot;counter&amp;quot;,&lt;br /&gt;
        &amp;quot;VERILOG_FILES&amp;quot;: [&amp;quot;src/counter.v&amp;quot;],&lt;br /&gt;
        &amp;quot;PDK&amp;quot;: &amp;quot;sg13g2&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PORT&amp;quot;: &amp;quot;clk&amp;quot;,&lt;br /&gt;
        &amp;quot;CLOCK_PERIOD&amp;quot;: 10.0,&lt;br /&gt;
        &amp;quot;FP_CORE_UTIL&amp;quot;: 40,&lt;br /&gt;
        &amp;quot;RT_MAX_LAYER&amp;quot;: &amp;quot;Metal4&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11285</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11285"/>
		<updated>2026-06-19T06:22:55Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Open Technology PDKs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SKY 130 PDK&amp;#039;&amp;#039;&amp;#039; - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk &amp;#039;&amp;#039;&amp;#039;IHP SG13G2 PDK&amp;#039;&amp;#039;&amp;#039;] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
Other, less popular options:&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11284</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11284"/>
		<updated>2026-06-19T06:21:40Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Open Technology PDKs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* SKY 130 PDK - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk IHP SG13G2 PDK] &lt;br /&gt;
** This is a 130nm BiCMOS process from the Leibniz Institute for High Performance Microelectronics, which generally offers higher performance (faster transitions) than Sky130.&lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
* GlobalFoundries 180nm MCU (GF180MCU)&lt;br /&gt;
** A mature 180nm CMOS process with 5 layers of metal, widely used for analog and mixed-signal design. It is fully supported by Efabless for open-source shuttle programs.&lt;br /&gt;
&lt;br /&gt;
* ASAP7 (Arizona State Academic Process)&lt;br /&gt;
** A 7nm predictive PDK used exclusively for academic research and educational purposes. It is often used for evaluating next-generation PnR flows (e.g., using Synopsys tools).&lt;br /&gt;
    &lt;br /&gt;
* SCMOS (Scalable CMOS)&lt;br /&gt;
** An older &amp;quot;Lambda-based&amp;quot; design rule set used before modern open foundry efforts, helpful for learning layout concepts, though not used for modern, high-performance silicon fabrication.&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11283</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11283"/>
		<updated>2026-06-19T06:17:08Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Setup Openline2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* SKY 130 PDK - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk IHP PDK]&lt;br /&gt;
** Open Source PDK in 130nm BiCMOS, developed for Analog/Digital, Mixed Signal and RF ASIC Design &lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
9https://openlane2.readthedocs.io/en/latest/getting_started/installation_overview.html The advised path]&lt;br /&gt;
is to setup NIX environment and then run openline2 from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
== Install Nix ==&lt;br /&gt;
Set up the Nix environment:&lt;br /&gt;
 sudo apt-get install -y curl&lt;br /&gt;
 &lt;br /&gt;
 curl --proto &amp;#039;=https&amp;#039; --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm --extra-conf &amp;quot;&lt;br /&gt;
    extra-substituters = https://openlane.cachix.org&lt;br /&gt;
    extra-trusted-public-keys = openlane.cachix.org-1:qqdwh+QMNGmZAuyeQJTH9ErW57OWSvdtuwfBKdS254E=&lt;br /&gt;
 &amp;quot;&lt;br /&gt;
Make sure to close all terminals after you’re done with this step.&lt;br /&gt;
&lt;br /&gt;
=== If have Nix already ===&lt;br /&gt;
&lt;br /&gt;
 nix-env -f &amp;quot;&amp;lt;nixpkgs&amp;gt;&amp;quot; -iA cachix&lt;br /&gt;
 sudo env PATH=&amp;quot;$PATH&amp;quot; cachix use openlane&lt;br /&gt;
 sudo pkill nix-daemon&lt;br /&gt;
&lt;br /&gt;
== Install OpenLane 2 after Nix ==&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/efabless/openlane2&lt;br /&gt;
 nix-shell&lt;br /&gt;
 openlane --smoke-test&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
There are many other tools you could setup separately, just know that openlane2 expects and is sensitive to the versions of the tools, and may not work if your tool is older or newer.&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11282</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11282"/>
		<updated>2026-06-19T06:10:27Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* My local setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* SKY 130 PDK - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk IHP PDK]&lt;br /&gt;
** Open Source PDK in 130nm BiCMOS, developed for Analog/Digital, Mixed Signal and RF ASIC Design &lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
The advised path is to setup NIX envbironment and then run openline from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools (optional)&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11281</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11281"/>
		<updated>2026-06-19T06:10:02Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Setup Openline2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* SKY 130 PDK - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk IHP PDK]&lt;br /&gt;
** Open Source PDK in 130nm BiCMOS, developed for Analog/Digital, Mixed Signal and RF ASIC Design &lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
The advised path is to setup NIX envbironment and then run openline from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= My local setup =&lt;br /&gt;
This is how I use the Openlane2 tools after the setup.&lt;br /&gt;
&lt;br /&gt;
One important note is that they generate MANY intermediate and log files in the &amp;quot;runs&amp;quot; directory under your project, every time you run openlane.&lt;br /&gt;
Usually my project is mapped toa cloud drive such as Dropbox, and spamming it with tons of files may create confusion when receiving an email later that someone has deleted 2000+ files from your account. Therefore I save the runs locally, outside the project directory. &lt;br /&gt;
To achieve that, I run the following commands:&lt;br /&gt;
&lt;br /&gt;
    cd git.local/openlane2&lt;br /&gt;
    nix-shell&lt;br /&gt;
    openlane --smoke_test               # Sanity test for the tools&lt;br /&gt;
    cd your/project/&lt;br /&gt;
 &lt;br /&gt;
    run_openlane_local.sh config.json   # will save run logs under work.local/... (recommended)&lt;br /&gt;
        or&lt;br /&gt;
    opennlane config.json               # will save the run logs in the project directory work/... (cloud?!)&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11280</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11280"/>
		<updated>2026-06-19T06:04:10Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Tapeout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* SKY 130 PDK - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk IHP PDK]&lt;br /&gt;
** Open Source PDK in 130nm BiCMOS, developed for Analog/Digital, Mixed Signal and RF ASIC Design &lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
&lt;br /&gt;
[https://tinytapeout.com/ TinyTapeout: from idea/design to chip/PCB]&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
The advised path is to setup NIX envbironment and then run openline from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11279</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11279"/>
		<updated>2026-06-19T06:02:27Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Open Technology PDKs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* SKY 130 PDK - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk IHP PDK]&lt;br /&gt;
** Open Source PDK in 130nm BiCMOS, developed for Analog/Digital, Mixed Signal and RF ASIC Design &lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
== Tapeout ==&lt;br /&gt;
* [https://app.tinytapeout.com/calculator?tiles=1&amp;amp;pcbs=1&amp;amp;shuttle=chipfoundry TinyTapeout calculator]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
The advised path is to setup NIX envbironment and then run openline from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11278</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11278"/>
		<updated>2026-06-19T06:00:43Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Open Tools =&lt;br /&gt;
Essential OSS HW design tools&lt;br /&gt;
&lt;br /&gt;
* gtkwave - Waveform viewer&lt;br /&gt;
* iverilog - Icarus Verilog compiler&lt;br /&gt;
* Verilator - compile RTL to C++, faster simulations&lt;br /&gt;
* Yosys - RTL to gate level netlist&lt;br /&gt;
* SymbiFlow - Toolchain to FPGA&lt;br /&gt;
* Magic VLSI - transistor level layout design editor&lt;br /&gt;
* KLayout - viewer and editor of GDSII files&lt;br /&gt;
* OpenRoad - Automates floorplanning, placement, routing and timing.&lt;br /&gt;
* OpenLane - Automated design flow, from verilog to GDSII, uses the tools above.&lt;br /&gt;
&lt;br /&gt;
== Open Technology PDKs ==&lt;br /&gt;
Process development kits (PDK) available for OSS VLSI:&lt;br /&gt;
* SKY 130 PDK - Process Design Kit by Google and Efabless&lt;br /&gt;
** [https://github.com/google/skywater-pdk GitHub repo]&lt;br /&gt;
** [https://skywater-pdk.readthedocs.io/en/main/rules/device-details.html ReadTheDocs]&lt;br /&gt;
** [https://www.skywatertechnology.com/sky130-open-source-pdk/ Description at SkywaterTechnology, 2023]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ihp-microelectronics.com/services/research-and-prototyping-service/fast-design-enablement/open-source-pdk IHP PDK]&lt;br /&gt;
** Open Source PDK in 130nm BiCMOS, developed for Analog/Digital, Mixed Signal and RF ASIC Design &lt;br /&gt;
** [https://ihp-open-pdk-docs.readthedocs.io/en/latest/ ReadTheDocs]&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
The advised path is to setup NIX envbironment and then run openline from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11277</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11277"/>
		<updated>2026-06-19T05:40:43Z</updated>

		<summary type="html">&lt;p&gt;Leo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TocRight}}&lt;br /&gt;
Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
The advised path is to setup NIX envbironment and then run openline from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11276</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11276"/>
		<updated>2026-06-19T05:40:01Z</updated>

		<summary type="html">&lt;p&gt;Leo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open source VLSI design notes.&lt;br /&gt;
{{TOC_right}}&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
The advised path is to setup NIX envbironment and then run openline from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11275</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11275"/>
		<updated>2026-06-19T05:39:31Z</updated>

		<summary type="html">&lt;p&gt;Leo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open source VLSI design notes.&lt;br /&gt;
&lt;br /&gt;
From Verilog/VHDL to GDSII &lt;br /&gt;
for SKY or IHP technologies.&lt;br /&gt;
&lt;br /&gt;
= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
These notes assume the host has Linux, e.g. Ubuntu 24.04 set up. All tools will be running under it.&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Setup Openline2 =&lt;br /&gt;
The advised path is to setup NIX envbironment and then run openline from there, rather than using a dockerized version.&lt;br /&gt;
&lt;br /&gt;
= Usecase: Simple counter = &lt;br /&gt;
&lt;br /&gt;
= Usecase: RAM integration =&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
= Usecase: NeoRV32 MCU =&lt;br /&gt;
&lt;br /&gt;
NeoRV32 is an open source MCU with many peripheral options written in VHDL.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/stnolting/neorv32 GitHub repo]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=User:Leo&amp;diff=11274</id>
		<title>User:Leo</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=User:Leo&amp;diff=11274"/>
		<updated>2026-06-12T10:41:18Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Citas piezīmes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{LeoTwitter|Leo Seļāvo wiki (elomage@twitter)| &amp;#039;&amp;#039;&amp;quot;To invent you need a good imagination and a pile of junk.&amp;quot;&amp;#039;&amp;#039; (Thomas Edison)&amp;#039;&amp;#039; }}&lt;br /&gt;
{| &lt;br /&gt;
|bgcolor=&amp;quot;#f7f7f7&amp;quot; width=&amp;quot;16px&amp;quot;| &lt;br /&gt;
&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;|&lt;br /&gt;
== ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Kursi&amp;#039;&amp;#039;&amp;#039; &amp;lt;small&amp;gt;([[Datorikas_Fakultāte | LU DF]])&amp;lt;/small&amp;gt; ===&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
2025.g. rudens &lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
[[LU-DAR-b | DAR-b]], &lt;br /&gt;
[[LU-MOP-b | MOP-b]], &lt;br /&gt;
[[LU-DIP-b | DIP-b]],&lt;br /&gt;
[[LU-VIV-m | VIV-m]], &lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
2026.g. pavasaris &lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
[[LU-LSP-b | LSP-b]],&lt;br /&gt;
[[LU-DSP-b | DSP-b]],&lt;br /&gt;
[[LU-BST-b | BST-b]], &lt;br /&gt;
&amp;lt;!-- [[LU-BST-m | BST-m]], --&amp;gt;&lt;br /&gt;
[[LU-DIP-m | DIP-m]]&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Specseminars | Specsemināri]]:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
[[LU_Robotika]],&lt;br /&gt;
[[LU-KFS-s | KFS]],&lt;br /&gt;
&amp;lt;!--,&lt;br /&gt;
[[IOT-s]]&lt;br /&gt;
[[LU-pysem | PySem]]&lt;br /&gt;
[[LU-MLI-s | MLI (Garāža36)]] &lt;br /&gt;
[[LU-MOP-en | MOP-en]], &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
* 2025:   [[LU-LSP-b25 | LSP-b]], [[LU-DSP-b25 | DSP-b]], [[LU-BST-b25 | BST-b]], [[LU-BST-m25 | BST-m]], [[LU-DIP-m25 | DIP-m]], [[LU-DIP-b25 | DIP-b]], [[LU-DAR-b25 | DAR-b]], [[LU-MOP-b25 | MOP-b]], [[LU-VIV-m25 | VIV-m]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* 2024:   [[LU-LSP-b24 | LSP-b]], [[LU-DSP-b24 | DSP-b]], [[LU-BST-b24 | BST-b]], [[LU-BST-m24 | BST-m]], [[LU-DIP-m24 | DIP-m]], [[LU-DIP-b24 | DIP-b]], [[LU-DAR-b24 | DAR-b]], [[LU-MOP-b24 | MOP-b]], [[LU-VIV-m24 | VIV-m]]&lt;br /&gt;
* 2023:   [[LU-LSP-b23 | LSP-b]], [[LU-DSP-b23 | DSP-b]], [[LU-BST-b23 | BST-b]], [[LU-BST-m23 | BST-m]], [[LU-DIP-m23 | DIP-m]], &lt;br /&gt;
[[LU-DIP-b23 | DIP-b]], [[LU-DAR-b23 | DAR-b]], [[LU-MOP-b23 | MOP-b]], [[LU-MOP-en23 | MOP-en]], [[LU-VIV-m23 | VIV-m]], [[BITL_MCU | MCU-bitl-23]]&lt;br /&gt;
* 2022:   [[LU-LSP-b22 | LSP-b]], [[LU-DSP-b22 | DSP-b]], [[LU-BST-b22 | BST-b]], [[LU-BST-m22 | BST-m]], [[LU-DIP-m22 | DIP-m]], [[LU-DIP-b22 | DIP-b]], [[LU-MOP-b22 | MOP-b]], [[LU-MOP-en22 | MOP-en]], [[LU-VIV-m22 | VIV-m]], [[BITL_MCU | MCU-bitl-22]]&lt;br /&gt;
* 2021:   [[LU-LSP-b21 | LSP-b]], [[LU-DSP-b21 | DSP-b]], [[LU-BST-b21 | BST-b]], [[LU-BST-m21 | BST-m]], [[LU-DIP-b21 | DIP-b]],  [[LU-MOP-b21 | MOP-b]], [[LU-MOP-en21 | MOP-en]], [[LU-VIV-m21 | VIV-m]], [[MCU-bitl21 | BITL_MCU]] &lt;br /&gt;
* 2020:   [[LU-DSP-b20 | DSP-b]], [[LU-MOP-b20 | MOP-b]],  [[LU-BST-m20 | BST-m]], [[LU-OSK-b20 | OSK-b]], [[LU-DIP-b20 | DIP-b]],  [[LU-LSP-b20 | LSP-b]], [[LU-VIV-m20 | VIV-m]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Akadēmiskā_goda_sistēma | Akadēmiskā goda noteikumi]], [[Leo:Kursi | Kursu apraksti un arhīvs]]&lt;br /&gt;
&lt;br /&gt;
=== Mācību piezīmes ===&lt;br /&gt;
* [[Skola|Skolai]] - par [[Arduino]], Raspberry Pi, [[Raspberry_Pi_Pico | Pico]].&lt;br /&gt;
* [[Maģistra Darba Struktūra | Maģistra / Bakalaura / kvalifikācijas / publikācijas darba struktūra]]&lt;br /&gt;
* [[LU::open-projects | Studentu projektu tēmas]] kursa, bakalaura un maģistra darbiem&lt;br /&gt;
* [[LU::poster-howto | Ieteikumi plakāta prezentācijas]] veidošanā&lt;br /&gt;
* [[Publikāciju izvēle un prezentēšana]]&lt;br /&gt;
* [[Kā rakstīt labas publikācijas]]&lt;br /&gt;
* [[Pētniecība]] - ko tas nozīmē?&lt;br /&gt;
* [[Prasmes | Prasmes un programmatūras rīki]] kas noder datoriķiem&lt;br /&gt;
* [[Matematika datorikiem | Matemātika datoriķiem]] - ko ieteicams zināt un izprast&lt;br /&gt;
* [[AI]] - mākslīgais intelekts, piezīmes&lt;br /&gt;
&lt;br /&gt;
=== Citas piezīmes ===&lt;br /&gt;
* [[Choosing a computer]]&lt;br /&gt;
* [[Howto Ubuntu]] - Ubuntu un Linux piezīmes&lt;br /&gt;
* [[OS_X_for_Linux_people]] - Leo OSX piezīmes&lt;br /&gt;
* [[Sublime_Text_cheat_sheet]]&lt;br /&gt;
* [[Makerspace 3D and 2D]]&lt;br /&gt;
* [[Video_processing | Video apstrāde]] ar Linux.&lt;br /&gt;
* [[Python notes]]&lt;br /&gt;
* [[Programming haiku]] - my favorites&lt;br /&gt;
* [[IoT_Sensors]]&lt;br /&gt;
* [[FabLab]] - Kā iekārtot FabLab vai Maker Space&lt;br /&gt;
* [[VLSI]] - Opensource VLSI piezīmes&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[Leo:publications | Publikācijas un sadarbības projekti]]&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
* [[Notikumi]], jaunumi, pasākumi &amp;#039;&amp;#039;&amp;#039;saistībā ar DiLab&amp;#039;&amp;#039;&amp;#039; aktivitatēm&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[Jaunumi]] ārpus DiLab&amp;#039;&amp;#039;&amp;#039;, jaunākie sasniegumi datorinženierijā un robotikā&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Efektīva un organizēta sadarbība:&lt;br /&gt;
** [[Leo:piezīmes:grupu_darbs | Strādājot grupās]] ar kopējiem dokumentiem un failiem.&lt;br /&gt;
** [http://rogerdudler.github.io/git-guide/ Git] - versiju kontrole, vieglā instrukcija.&lt;br /&gt;
&lt;br /&gt;
* [[ref.lv | Piezīmes]] par projektu vadību, karjeru, industriju, biznesu...&lt;br /&gt;
* [[KFS]] - Kiberfizikālās sistēmas&lt;br /&gt;
&lt;br /&gt;
* [[Leo:other_notes | Ārpus DiLab piezīmes]]&lt;br /&gt;
** [[MakeRiga notes]]&lt;br /&gt;
** Datoru veiktspējas testi: [[Benchmarks-Leo]]&lt;br /&gt;
** [[User:Leo:shortcuts | Mediawiki shortcuts]]&lt;br /&gt;
&lt;br /&gt;
=== Starp citu ===&lt;br /&gt;
&lt;br /&gt;
* [[BSD licence latviski]]&lt;br /&gt;
* [http://www.dzoka.lv/files/linux/gnuvpl.htm GPL licences latviskojums]&lt;br /&gt;
&lt;br /&gt;
* [[Programmēšanas valoda LV]] (nenopietni)&lt;br /&gt;
&lt;br /&gt;
== Vaļasbrīžiem ==&lt;br /&gt;
&lt;br /&gt;
* [http://xkcd.com/730/ Advancētā elektronika...]&lt;br /&gt;
&lt;br /&gt;
* [https://fabiensanglard.net/postcard_pathtracer/ Ray-tracing uz vizītkartes]&lt;br /&gt;
&lt;br /&gt;
|bgcolor=&amp;quot;#f7f7f7&amp;quot; width=&amp;quot;16px&amp;quot;| &lt;br /&gt;
&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Kontaktinformācija / Contact Info ==&lt;br /&gt;
* Raiņa blvd. 19., 332.telpa., Rīga, LV-1586.&lt;br /&gt;
* Epasts: mansvards.uzvards @ gmail.com&lt;br /&gt;
* [[Leo:about | About Leo]], [http://selavo.lv/wiki/index.php/Leo_Selavo_CV CV in English], [http://selavo.lv/wiki/index.php/Leo_Se%C4%BC%C4%81vo_CV CV latviski]   &amp;lt;!-- [[Leo:bibtex | Bibtex]] --&amp;gt;&lt;br /&gt;
* [http://www.linkedin.com/in/leoselavo LinkedIn], [[Leo:video | Youtube]], [http://bit.ly/KF9vui Twitter], [http://www.youtube.com/watch?v=2M73PSLlWqs TEDx], [http://bit.ly/selavo-so StackOverflow]&lt;br /&gt;
* [http://scholar.google.com/citations?user=wCDg9EcAAAAJ&amp;amp;hl=en Google Scholar], [https://www.scopus.com/authid/detail.uri?authorId=17435557900 Scopus], [https://orcid.org/0000-0003-2858-7635 ORCID], [http://www.researchgate.net/profile/Leo_Selavo ResearchGate], [http://www.mendeley.com/profiles/leo-selavo/ Mendeley]&lt;br /&gt;
&lt;br /&gt;
== Jaunumi / News ==&lt;br /&gt;
* [[Ziņu_arhīvs]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;[http://bit.ly/tedxriga14Leo &amp;#039;&amp;#039;&amp;#039;Healthcare: from Pixels to Picture&amp;#039;&amp;#039;&amp;#039;]&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Contemporary &amp;#039;&amp;#039;&amp;#039;health care&amp;#039;&amp;#039;&amp;#039; typically is looking at &amp;#039;&amp;#039;&amp;#039;just a few pixels&amp;#039;&amp;#039;&amp;#039; of our vital signs and lives, and trying to extrapolate the appropriate treatment, often over several iterations. What we really need is a &amp;#039;&amp;#039;&amp;#039;full picture&amp;#039;&amp;#039;&amp;#039; of our health to provide individual and effective treatment and timely preventive actions. &amp;#039;&amp;#039;&amp;#039;Technology&amp;#039;&amp;#039;&amp;#039; of sensors, communication and data processing can help us today already. But can we help ourselves, dealing with the &amp;#039;&amp;#039;&amp;#039;privacy&amp;#039;&amp;#039;&amp;#039; issues?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In English ==&lt;br /&gt;
&lt;br /&gt;
* [[OS X for Linux people]] - adventures with MAC OS X system&lt;br /&gt;
* [[Howto Ubuntu]] (or linux) - installing, setting up and using various software in Ubuntu&lt;br /&gt;
** [[Latex on Ubuntu]]&lt;br /&gt;
&lt;br /&gt;
==== Electronics ====&lt;br /&gt;
* [[EagleCAD | EagleCAD notes]] - (Leo piezīmes) PC board CAD program, has a freeware license for a reasonable set of features. Although recently I would recommend [https://www.kicad.org/ KiCad EDA] as a good cross platform open source alternative for electronic and PCB design.&lt;br /&gt;
* [[LED notes]] - LED links and resistor guide&lt;br /&gt;
&lt;br /&gt;
==== Selected projects ==== &lt;br /&gt;
* [https://github.com/IECS/MansOS MansOS] - an operating system for embedded devices and sensor networks&lt;br /&gt;
* [[Leo:Blender | Blender notes]] - a great tool, also for video editing&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Archive&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [[Leo:research | Academic activities]]&lt;br /&gt;
* [[Leo:SW-notes | Miscellaneous software notes]], TI laptops, etc...&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
* Leo - [[Leo:music | Music and more]]&lt;br /&gt;
&lt;br /&gt;
* [[Atziņas]] un domu graudi / Reflections&lt;br /&gt;
&lt;br /&gt;
== Jaunumu arhīvs ==&lt;br /&gt;
* Sestais [http://bit.ly/viesentis6 Viedo sensoru seminārs] Latvijā, 12.12.2012.&lt;br /&gt;
* [http://bit.ly/RRKo05 Campus-Party 2012] - &amp;quot;the ultimate post-post-modern un-conference&amp;quot; Berlīnē. Bildes pa dienām: [http://bit.ly/cp2012-day1 1.], [http://bit.ly/cp2012-day2 2.], [http://bit.ly/cp2012-day3 3.], [http://bit.ly/cp2012-day4 4.], [http://bit.ly/cp2012-day5 5.], [http://bit.ly/cp2012-day6 6.]&lt;br /&gt;
&lt;br /&gt;
* [http://selavo.lv/viesentis/ Latvijas 4. viedo sensoru seminārs] 21.05.2012 15:00.&lt;br /&gt;
* Ar datoru vadāms automobilis, ar kuru mūsu komanda piedalījās [http://www.df.lu.lv/zinas/t/6695/ GCDC 2011 izaicinājumā].&lt;br /&gt;
* Viesentis (viedo sensoru) un kvantu skaitļošanas [http://selavo.lv/viesentis/ seminārs].&lt;br /&gt;
* [http://diena.lv/lat/politics/viedokli/aiza-starp-zinatni-un-biznesu-2011-01-29-1 Leo Dienai par aizu starp pētniekiem un uzņēmējiem]&lt;br /&gt;
* [http://selavo.lv/viesentis/ Viedo sensoru un biofotonikas seminārs] 20.10.2010 15:00 ASI.&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11273</id>
		<title>VLSI</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=VLSI&amp;diff=11273"/>
		<updated>2026-06-12T06:43:57Z</updated>

		<summary type="html">&lt;p&gt;Leo: Created page with &amp;quot;Open source VLSI design notes&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open source VLSI design notes&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=LU-VIV-m25&amp;diff=11272</id>
		<title>LU-VIV-m25</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=LU-VIV-m25&amp;diff=11272"/>
		<updated>2026-06-07T08:25:15Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* External projects / Ārējie projekti */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;īsceļi:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
[[#Kalendārs | Kalendārs]] | &lt;br /&gt;
[[#Uzdevumi | Uzdevumi]] | &lt;br /&gt;
[[#Resursi | Resursi]] |&lt;br /&gt;
{{TodayTomorrow}} (ja ir lekcija)&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LUDFKurss|Virtuālās vides un paplašinātā realitāte|VIV|DatZ7031|2DAT7038|maģistru un doktorantu|3051}}&lt;br /&gt;
[ Virtual environments and augmented reality ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
[[#MD1]] anketa pieejama tiešsaitē! Lūdzu aizpildīt.&lt;br /&gt;
&lt;br /&gt;
Prezentāciju laiku izvēles forma (doodle) nosūtīta kursa epastu grupai.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
== Par kursu ==&lt;br /&gt;
Kursa ietvaros studenti apskata virtuālās vides un paplašinātās realitātes sistēmas, pielietojumus un saistītās pētniecības problēmas. Lielākā kursa daļa ir jaunāko publikāciju lasīšana, referēšana un diskusijas. Tāpēc studentiem pēc iespējas ātri (MD1) jāizvēlas publikācijas kuras tie lasīs un recenzēs. Otra kursa daļa ir kursa projekts kura piedalās studenti individuāli vai grupās, atkarībā no projekta apjoma un tēmas. Projekta tēmas studenti ir aicināti izvēlēties paši, bet atsevišķas iespējas piedāvās arī pasniedzējs.&lt;br /&gt;
&lt;br /&gt;
Šis kurss ir semināra formā, tas nozīmē, ka jūsu līdzdalība ir būtisks piedevums ne tikai jums kā individuālam studentam, bet visu studentu apgūtajai vielai un kursa mērķu sasniegšanai.&lt;br /&gt;
&lt;br /&gt;
Daļēji šis kurss tiek piedāvāts angļu valodā, tāpēc daļa materiāla ir angliski.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Šis kurss pārsvarā &amp;#039;&amp;#039;&amp;#039;notiks virtuāli&amp;#039;&amp;#039;&amp;#039;, tas nozīmē, ka jums patstāvīgi jāseko vielai kalendārā un uzdevumiem, kā arī aktīvi jāiesaistās diskusijās tiešsaistē un jāiesniedz mājas darbi.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [[VIV kursa atsauksmes]] no iepriekšējiem gadiem. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Administratīvā informācija====&lt;br /&gt;
* Pasniedzējs: Leo Seļāvo &amp;#039;&amp;#039;(epasts: vards.uzvards @ gmail.com)&amp;#039;&amp;#039;&lt;br /&gt;
* Komunikācija notiek ar eStudiju ziņu foruma palīdzību, vai individuāli epastā.&lt;br /&gt;
&amp;lt;!-- * {{KursiGGroup|lu-viv-m}} --&amp;gt;&lt;br /&gt;
&amp;lt;!-- * Vērtējums = 40% mājas un praktiskie darbi, 10% dalība klasē, 20% KD1 un 30% KD2(eksāmens). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Darbu iesniegšana====&lt;br /&gt;
{{KursiMD|VIV|50%|10%|e-studijās}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
====Prezentācijas====&lt;br /&gt;
&lt;br /&gt;
Kursa ietvaros viens no būtiskiem uzdevumiem ir &amp;#039;&amp;#039;publikāciju izvēle un prezentēšana&amp;#039;&amp;#039;. Jums ir jāizvēlas kvalitatīvas publikācijas, žurnālu raksti, vai citi informācijas avoti, jāsaskaņo ar pasniedzēju, un jāprezentē kursā. Sīkāk par to, [[Publikāciju izvēle un prezentēšana | kā izvēlēties publikācijas un tās prezentēt lasiet šeit]].&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kalendārs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Pieteikšanās &amp;#039;&amp;#039;&amp;#039;prezentāciju laikiem&amp;#039;&amp;#039;&amp;#039; - tiks izveidota elektroniska aptauja (Doodle.com). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=4&lt;br /&gt;
|-&lt;br /&gt;
! Datums, nedēļa &lt;br /&gt;
! Kursa saturs un prezentācijas&lt;br /&gt;
! Uzdevumi&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
==== 04.09.2025.====&lt;br /&gt;
| &lt;br /&gt;
Ievads virtuālajās vidēs un to piemēri un pielietojumi. &lt;br /&gt;
* Lasīt: [http://archive.ncsa.illinois.edu/Cyberia/VETopLevels/VR.Overview.html Par virtuālām vidēm un to vēsturi]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Kursa materiāli:&lt;br /&gt;
* [http://www.ted.com/talks/ray_kurzweil_on_how_technology_will_transform_us.html Ray Kurzweil on how technology will transform us] (TED talks)&lt;br /&gt;
&lt;br /&gt;
Google Glass:&lt;br /&gt;
* [http://www.ted.com/talks/sergey_brin_why_google_glass.html Why Google Glass?] Sergey Brin on TED.com&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Paziņots [[#MD0]]&amp;#039;&amp;#039;&amp;#039; mājas darbs - Virtual classroom.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Paziņots [[#MD1]]&amp;#039;&amp;#039;&amp;#039; mājas darbs - Publication selection. / Publikāciju izvēle. Kursa gaitā katram studentam būs jārecenzē vismaz divas publikācijas. Tās vēlams sākumā izvēlēties saskaņā ar savām interesēm, protams, kontekstā ar virtuālajām vidēm. Būs jāgatavo arī [[#Prezentācijas]] par izvēlētajām publikācijām.&lt;br /&gt;
** Ievadīt elektroniski, sekojot [https://docs.google.com/forms/d/184I7bNhIOvlEjHPQb9hprRJ06IeKSsmCYQ-w7Fwsp6c saitei uz MD1].&lt;br /&gt;
&amp;lt;!-- * [https://www.dropbox.com/s/yxw5m9r4poffwkm/VR1_leo.pdf?dl=1 VR intro] --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 11.09.2025.====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
Virtual environments and augmented reality, applications.&lt;br /&gt;
[https://www.dropbox.com/scl/fi/pk26qfn27mkuuva4tz91z/VR1_2024.pdf?rlkey=wwwmzhwv6n72xbc6wkwuk8hqf&amp;amp;dl=0 (Slides)]&lt;br /&gt;
----&lt;br /&gt;
Kursa materiāli:&lt;br /&gt;
* [http://www.ted.com/talks/blaise_aguera.html Microsoft kartes un augmentētā realitāte] (TED video). &lt;br /&gt;
* [http://www.ted.com/talks/stephen_lawler_tours_microsoft_virtual_earth.html Microsoft Virtual Earth] (TED video)&lt;br /&gt;
* Sixth Sense: MIT augmentētas vides projekts&lt;br /&gt;
** [http://www.pranavmistry.com/projects/sixthsense/ portāls un publikācijas]&lt;br /&gt;
** [http://www.ted.com/talks/pattie_maes_demos_the_sixth_sense.html SixthSense demo, Patie Maes at TED]&lt;br /&gt;
** [http://www.youtube.com/watch?v=vcBIUsQEE3E Pranav Mistry demo] (on youtube)&lt;br /&gt;
&lt;br /&gt;
Second Life:&lt;br /&gt;
* [https://youtu.be/lHXXsEtE3b4 Second Life, where anything is possible]: Philip Rosedale on TED.com&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Izdarīt prezentāciju laiku izvēli&amp;#039;&amp;#039;&amp;#039;, [https://estudijas.lu.lv/course/view.php?id=3051 eStudijās]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Paziņots&amp;#039;&amp;#039;&amp;#039; [[#MD2]] mājas darbs - explore [http://secondlife.com/ SecondLife]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 18.09.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
* -&lt;br /&gt;
* -&lt;br /&gt;
* -&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Virtual worlds and architectures.&lt;br /&gt;
&lt;br /&gt;
* What is [https://en.wikipedia.org/wiki/Systems_architecture Systems Architecture]&lt;br /&gt;
* Exercise: create a systems architecture for Virtual classroom&lt;br /&gt;
* Discussion about the selected publications and presentations&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Kursa materiāli:&lt;br /&gt;
* [http://www.computer.org/csdl/mags/ic/2011/05/mic2011050011.html Virtual World Architectures] - IEEE Internet Computing, September/October 2011 (Vol. 15, No. 5) pp. 11-14 [http://www.computer.org/csdl/mags/ic/2011/05/mic2011050011.pdf (pdf)]&lt;br /&gt;
&lt;br /&gt;
* Bruno, Fabio &amp;amp; Lagudi, Antonio &amp;amp; Barbieri, Loris &amp;amp; Muzzupappa, Maurizio &amp;amp; Mangeruga, Marino &amp;amp; Cozza, Marco &amp;amp; Cozza, Alessandro &amp;amp; Ritacco, Gerardo &amp;amp; Peluso, Raffaele. (2018). Virtual Reality Technologies for the Exploitation of Underwater Cultural Heritage. 10.3390/books978-3-03842-685-1/11. [https://www.researchgate.net/publication/323167591_Virtual_Reality_Technologies_for_the_Exploitation_of_Underwater_Cultural_Heritage/download (pdf)]&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš [[#MD1]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Paziņots&amp;#039;&amp;#039;&amp;#039; [[#MD3]] mājas darbs - izpētīt LambdaMoo &lt;br /&gt;
** [https://www.cc.gatech.edu/classes/cs8113e_99_winter/lambda.html How to log into LambdaMOO] (Hint: telnet lambda.moo.mud.org 8888)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 25.09.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Paula |Izglītojošās virtuālās realitātes pieejamība bērniem COVID-19 pandēmijas laikā|Marijn Mado,Géraldine Fauville, Hanseul Jun, Elise Most, Carlyn Strang, and Jeremy N. Bailenson|Accessibility of Educational Virtual Reality for Children During the COVID-19 Pandemic|https://www.researchgate.net/publication/359456504_Accessibility_of_educational_virtual_reality_for_children_during_the_COVID-19_pandemic}}	&lt;br /&gt;
&lt;br /&gt;
{{Prez|Jēkabs |Enhancing Learning in Augmented Reality (AR): A Deep Learning Framework for Predicting Memory Retention in AR Environments|Onyeka J. Nwobodo , Godlove Suila , Kamil Wereszczyński ,  Krzysztof A. Cyran|International Conference on Computational Science 2025|https://www.iccs-meeting.org/archive/iccs2025/papers/159120090.pdf}}	&lt;br /&gt;
&lt;br /&gt;
{{Prez|Karīna |Understanding the Impact of Animation Technology in Virtual Reality: A Systematic Literature Review|Hashim, M. E. A., Albakry, N. S., Mustafa, W. A., Grahita, B., Md Ghani, M., Hanafi, H. F., … Ana Ugap, C.|International Journal of Advanced Research in Computational Thinking and Data Science|https://doi.org/10.37934/ctds.1.1.5365a}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Video: augmented reality&lt;br /&gt;
* [https://www.ted.com/talks/meron_gribetz_a_glimpse_of_the_future_through_an_augmented_reality_headset MetaVision talk] at TED&lt;br /&gt;
* Jinha Lee - [http://www.ted.com/talks/jinha_lee_a_tool_that_lets_you_touch_pixels.html Reach into the computer and grab a pixel]&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* Termiņš: &amp;#039;&amp;#039;&amp;#039;Prezentāciju laiku izvēlei (eStudijās)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#MD2]] and [[#MD3]] Termiņš&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;!-- * &amp;#039;&amp;#039;&amp;#039;Paziņots [[#MD4]]&amp;#039;&amp;#039;&amp;#039; --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 02.10.2025.====&lt;br /&gt;
|&lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Jēkabs |A Comparison of Visual Attention Guiding Approaches for 360° Image-Based VR Tours|Jan Oliver Wallgrün*, Mahda M. Bagher ,Pejman Sajjadi, Alexander Klippel|2020 IEEE Conference on Virtual Reality and 3D User Interfaces (VR)|https://d1wqtxts1xzle7.cloudfront.net/65606458/A_Comparison_of_Visual_Attention_Guiding_Approaches_for_360_Image_Based_VR_Tours-libre.pdf?1612462990=&amp;amp;response-content-disposition=inline%3B+filename%3DA_Comparison_of_Visual_Attention_Guiding.pdf&amp;amp;Expires=1757582194&amp;amp;Signature=NhmmLBBSrB9EHe~E5UmtdJT6CaooHS~1uffyLTWGE7LcSugwT-UqrHB5DfEo75DUBKIcZJO0PotGiITgkQcDnXQ3bxYNalUSHO77BjgxZUCheufFgTfVkbGCzSEjn5pjoBmGej0NXLI2w8h3fByijQBNpcSV7tljIxZcgJE-sERYcbyvXjLPpgVNdfe-6U2h4NoRzVIGK5Ee0YSAJuqjY2QPXOz54M2DiSdZi4T~1vLig51rNKRmyk8IbF~SGFBz9V2IcVVg2khMILzIerhlUCCExxxa0XpFkrRLc0KpzgKRPU2mghR7FgJ3AT0zV54xKq2Kz1BPLNkRopBOM0n~qQ__&amp;amp;Key-Pair-Id=APKAJLOHF5GGSLRBV4ZA}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Jevgēnijs |Social viewing in cinematic virtual reality: a design space for social movie applications|Sylvia Rothe, Alexander Schmidt, Mario Montagud, Daniel Buschek &amp;amp; Heinrich Hußmann|Virtual Reality|https://doi.org/10.1007/s10055-020-00472-4}}	&lt;br /&gt;
&lt;br /&gt;
{{Prez|Līva |Using Virtual Reality and Head-Mounted Displays to Increase Performance in Rowing Workouts|Sebastian Arndt, Andrew Perkis, Jan-Niklas Voigt-Antons|MMSports&amp;#039;18: Proceedings of the 1st International Workshop on Multimedia Content Analysis in Sports|https://dl.acm.org/doi/10.1145/3265845.3265848}}	&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
* SL &amp;amp; Lambda My diskusija&lt;br /&gt;
* Blender Demo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Augmented reality examples&lt;br /&gt;
* [https://www.ted.com/talks/alex_kipman_the_dawn_of_the_age_of_holograms A vision of future with holograms] (by Alex Kipman at TED - the inventor of Kinect and HoloLens.&lt;br /&gt;
&lt;br /&gt;
Papildus:&lt;br /&gt;
* [http://www.vividlyapp.com/ Vividly app] - Walk through buildings before they are built (A VR startup from LV).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
[[#MD4]] &amp;#039;&amp;#039;&amp;#039;Paziņots&amp;#039;&amp;#039;&amp;#039;. Izstrādāt modeli ar Blender 3D. Ir atrodamas gana daudz pamācības par darbu ar [[#Blender 3D]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 09.10.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Valērija |VRSketchIn: Exploring the Design Space of Pen and Tablet Interaction for 3D Sketching in Virtual Reality|Tobias Drey, Jan Gugenheimer, Julian Karlbauer, Maximilian Milo, Enrico Rukzio|Conference on Human Factors in Computing Systems - Proceedings|https://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.inst.100/institut/Papers/Prof_Rukzio/2020/VRSketchIn_Tobias_Drey.pdf}}	&lt;br /&gt;
&lt;br /&gt;
{{Prez|Paula |Advantages of using 3D virtual reality based training in persons with Parkinson’s disease: a parallel study|Jigna Patel, Gerard Fluet, Qinyin Qiu, Mathew Yarossi, Alma Merians, Eugene Tunik &amp;amp; Sergei Adamovich |Journal of NeuroEngineering and Rehabilitation|https://jneuroengrehab.biomedcentral.com/articles/10.1186/s12984-019-0601-1}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Artūrs Ā.|Recent Developments and Future Directions of Wearable Skin Biosignal Sensors|Dohyung Kim, JinKi Min|Advanced Sensor Research|https://www.researchgate.net/publication/378179919_Recent_Developments_and_Future_Directions_of_Wearable_Skin_Biosignal_Sensors}}	&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Papildus:&lt;br /&gt;
* [https://medium.com/@LeapMotion/what-makes-a-spoon-a-spoon-form-and-function-in-vr-industrial-design-fb35914d3618 What Makes a Spoon a Spoon? Form and Function in VR Industrial Design] - what happens when form no longer follows function?&lt;br /&gt;
&lt;br /&gt;
* From Oculus Connect VR conferences:&lt;br /&gt;
** [https://youtu.be/AtyE5qOB4gw?t=565 Michael Abrash on future of VR] at Oculus Connect 3&lt;br /&gt;
** [https://youtu.be/7YIGT13bdXw Michael Abrash opening keynote] at Oculus Connect 6&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** [https://youtu.be/RS-9g9kx8jw?t=12m17s Mark Zuckerberg showing a demo with Oculus in VR]&lt;br /&gt;
** [https://youtu.be/RS-9g9kx8jw?t=1h26m53s Oculus Research directions] by Michael Abrash&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#MD4]] Checkpoint&amp;#039;&amp;#039;&amp;#039;: Install [https://www.blender.org/ Blender software] on the platform of your choice. Make a 3D model of a building. Consider making one that could be 3D printed. Turn in the blender file (md4.blend) and a rendered imege of the object in a pdf file.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#MD5]] Paziņots&amp;#039;&amp;#039;&amp;#039;: Izvēlēties projekta tēmu un sagatavot projekta pieteikumu.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 16.10.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Haralds |Chess Piece Recognition Using Oriented Chamfer Matching with a Comparison to CNN|Xie et al.|2018 IEEE Winter Conference on Applications of Computer Vision|https://ieeexplore.ieee.org/abstract/document/8354325}}	&lt;br /&gt;
&lt;br /&gt;
{{Prez|Jevgēnijs |Fitted avatars: automatic skeleton adjustment for self-avatars in virtual reality|Jose Luis Ponton, Víctor Ceballos, Lesly Acosta, Alejandro Ríos, Eva Monclús &amp;amp; Nuria Pelechano|Virtual Reality|https://doi.org/10.1007/s10055-023-00821-z}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Niklāvs |Towards an articulated avatar in VR: Improving body and hand tracking using only depth cameras|Yuanjie Wu, Yu Wang, Sungchul Jung, Simon Hoermann, Robert W. Lindeman|-|https://doi.org/10.1016/j.entcom.2019.100303}}	&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
VR applications&lt;br /&gt;
* [http://www.techrepublic.com/article/nasa-shows-the-world-its-20-year-vr-experiment-to-train-astronauts/ NASA un kosmonautu trenniņa VR eksperiments 20 gadu garumā]&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#MD4]] Termiņš&amp;#039;&amp;#039;&amp;#039; (Full design in Blender)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 23.10.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Artūrs Ā.|How LLMs are Shaping the Future of Virtual Reality|Süeda Özkaya, Santiago Berrezueta-Guzman, Stefan Wagner|arXiv.org preprint archive|https://arxiv.org/abs/2508.00737}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Artūrs K.|AI-enabled prediction of sim racing performance using telemetry data|Fazilat Hojaji, Adam J. Toth, John M. Joyce, Mark J. Campbell|Computers in Human Behavior Reports|https://doi.org/10.1016/j.chbr.2024.100414}}	&lt;br /&gt;
&lt;br /&gt;
{{Prez|Līva |How LLMs are Shaping the Future of Virtual Reality|Sueda ¨ Ozkaya ¨ , Santiago Berrezueta-Guzman , Stefan Wagner|arXiv|https://arxiv.org/abs/2508.00737}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Augmented Reality (AR) applications&lt;br /&gt;
* [https://hbr.org/2017/11/a-managers-guide-to-augmented-reality Paplašinātā realitāte katrā darba vietā] - Harvard Business review.&lt;br /&gt;
* [https://www.youtube.com/watch?v=ecavbpCuvkI&amp;amp;ab_channel=TheNewYorkTimes The Displaced] - a 360 movie&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#MD5]] Termiņš&amp;#039;&amp;#039;&amp;#039; - Projekta pieteikums&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 30.10.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Edijs |A multi-scale analysis of basketball throw in virtual reality for tracking perceptual-motor expertise|Pooya Soltani, Antoine H. P. Morice|Scandinavian Journal of Medicine &amp;amp; Science in Sports Volume 33, Issue 2|https://onlinelibrary.wiley.com/doi/full/10.1111/sms.14250}}	&lt;br /&gt;
&lt;br /&gt;
{{Prez|Vairis |guitARhero: Interactive Augmented Reality Guitar Tutorials|Lucchas Ribeiro Skreinig, Denis Kalkofen, Ana Stanescu, Peter Mohr, Frank Heyen, Shohei Mori, Michael SedlmairDieter Schmalstieg, Alexander Plopski|IEEE Transactions on Visualization and Computer Graphics (TVCG), 2023|https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;amp;arnumber=10268399}}	&lt;br /&gt;
&lt;br /&gt;
{{Prez|Rūdolfs |How to VizSki: Visualizing Captured Skier Motion in a VR Ski Training Simulator|Erwin Wu, Florian Perteneder, Hideki Koike, Takayuki Nozawa|The 17th International Conference on Virtual-Reality Continuum and its Applications in Industry|https://www.researchgate.net/publication/337267034_How_to_VizSki_Visualizing_Captured_Skier_Motion_in_a_VR_Ski_Training_Simulator}}	&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Microsoft Hololens project:&lt;br /&gt;
* [https://www.youtube.com/watch?v=ihKUoZxNClA Hololens review] - by a private party&lt;br /&gt;
* [https://youtu.be/ZiNsjslN1o4 Hololens WEMO Operator System] - business applications&lt;br /&gt;
* [https://youtu.be/XhEqq2QjqGw Microsoft HoloLens: HoloTour] - virtual tourism&lt;br /&gt;
&lt;br /&gt;
[https://news.microsoft.com/source/features/digital-transformation/with-their-hololens-2-project-microsoft-and-volkswagen-collaborate-to-put-augmented-reality-glasses-in-motion/ How Hololens And Microsoft Teams Can Design a Car in Real Time]&lt;br /&gt;
&lt;br /&gt;
Nākamais MD - kā jūs lietotu MS Hololens?&lt;br /&gt;
| &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Paziņots [[#MD7]]&amp;#039;&amp;#039;&amp;#039; - Microsoft Hololens application&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 06.11.2025.====&lt;br /&gt;
|&lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Ieva |VR-GS: A Physical Dynamics-Aware Interactive Gaussian Splatting System in Virtual Reality|Jiang, Ying and Yu, Chang and Xie, Tianyi and Li, Xuan and Feng, Yutao and Wang, Huamin and Li, Minchen and Lau, Henry and Gao, Feng and Yang, Yin and Jiang, Chenfanfu|Association for Computing Machinery, SIGGRAPH &amp;#039;24: ACM SIGGRAPH 2024 Conference Papers|https://dl.acm.org/doi/abs/10.1145/3641519.3657448}}	&lt;br /&gt;
&lt;br /&gt;
{{Prez|Artūrs K.|Immersive Mixed Reality for Manufacturing Training|Gonzalez-Franco Mar , Pizarro Rodrigo , Cermeron Julio , Li Katie , Thorn Jacob , Hutabarat Windo , Tiwari Ashutosh , Bermell-Garcia Pablo|Frontiers in Robotics and AI|https://www.frontiersin.org/journals/robotics-and-ai/articles/10.3389/frobt.2017.00003/full}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Ārija |Comparative Analysis of Interactive Modalities for Intuitive Endovascular Interventions|Wu, Di and Li, Zhen and Ansari, Mohammad Hasan Dad and Ha, Xuan Thao and Ourak, Mouloud and Dankelman, Jenny and Menciassi, Arianna and De Momi, Elena and Poorten, Emmanuel Vander|IEEE Transactions on Visualization and Computer Graphics|https://ieeexplore.ieee.org/abstract/document/10423176}}	&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Papildus: VR for healthcare&lt;br /&gt;
* [https://www.medgadget.com/2017/10/qualcomms-new-virtual-reality-app-teaches-diagnose-stroke.html Think F.A.S.T. VR saves lives and improves stroke training] by Qualcomm, ([https://www.youtube.com/watch?v=ttxlOknA5z8 video])&lt;br /&gt;
* [https://www.medgadget.com/2017/09/beyond-gaming-osso-vr-already-transforming-surgical-training.html VR for surgical training] by OSSO VR at Medgadget, ([https://youtu.be/bqra7wslwCM video])&lt;br /&gt;
** [https://www.youtube.com/watch?v=0tZ4kaNkX6w OSSO VR presentation] at Nvidia emerging companies summit.&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#MD7]] Termiņš&amp;#039;&amp;#039;&amp;#039; - Microsoft Hololens pielietojums&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#MD8]] Paziņots&amp;#039;&amp;#039;&amp;#039; - [https://godotengine.org/ GoDot] (bija Unity 3D)&lt;br /&gt;
&lt;br /&gt;
* Lasīt: [https://sunstrikestudios.com/en/godot_vs_unity_in_2025 GoDot vs. Unity]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 13.11.2025.====&lt;br /&gt;
|&lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Vairis |TVCalib: Camera Calibration for Sports Field Registration in Soccer|Jonas Theiner, Ralph Ewerth|IEEE/CVF Winter Conference on Applications of Computer Vision|https://openaccess.thecvf.com/content/WACV2023/papers/Theiner_TVCalib_Camera_Calibration_for_Sports_Field_Registration_in_Soccer_WACV_2023_paper.pdf}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Edijs |Perception of Visual Variables on Virtual Wall-Sized Tiled Displays in Immersive Environments|Dongyun Han, Anastasia Bezerianos, Petra Isenberg, Isaac Cho|EEE Transactions on Visualization and Computer Graphics, 2025, 31 (5), pp.3045-3055|https://arxiv.org/abs/2501.10338}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Rūdolfs |Synthetic silviculture: multi-scale modeling of plant ecosystems|Miłosz Makowski, Torsten Hädrich, Jan Scheffczyk, Dominik L. Michels|ACM Transactions on Graphics|https://www.researchgate.net/publication/334438882_Synthetic_silviculture_multi-scale_modeling_of_plant_ecosystems}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Projektu diskusija.&lt;br /&gt;
----&lt;br /&gt;
Papildus: [https://youtu.be/BGRY14znFxY A week in VR] - how did it go? &lt;br /&gt;
| &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#MD8]] Checkpoint&amp;#039;&amp;#039;&amp;#039; -  [https://godotengine.org/ GoDot] (bija Unity 3D) - uzstādīts un testēts.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 20.11.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Valērija Januševa|Virtual Reality Games for People Using Wheelchairs|Kathrin Gerling, Patrick Dickinson, Kieran Hicks, Liam Mason, Adalberto L. Simeone, Katta Spiel|Conference on Human Factors in Computing Systems - Proceedings|https://repository.lincoln.ac.uk/articles/conference_contribution/Virtual_Reality_Games_for_People_Using_Wheelchairs/25176935?file=44458532}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Haralds Upītis|An Automatic Calorie Estimation System of Food Images on a Smartphone|Okamoto and Yanai|Association for Computing Machinery|https://dl.acm.org/doi/abs/10.1145/2986035.2986040}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Niklāvs Mežeckis|Designing a VR game for public speaking based on speakers features: a case study|Meriem El-Yamri, Alejandro Romero-Hernandez, Manuel Gonzalez-Riojo &amp;amp; Borja Manero||https://link.springer.com/article/10.1186/s40561-019-0094-1}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Projektu diskusija.&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 27.11.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Oskars |Speedwidget: Designing second screens for supporting the F1 viewing experience|Johanna Utle |The University of Bergen|https://bora.uib.no/bora-xmlui/handle/11250/3206322}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Karīna Meldere|Time Travel to the Past of Bosnia and Herzegovina through Virtual and Augmented Reality|Selma Rizvic, Dušanka Boškovic, Vensada Okanovic, Ivona Ivkovic Kihic and Irfan Prazina and Bojan Mijatovic |Applied Sciences|https://doi.org/10.3390/app11083711}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Sergejs |Sketch2Anim: Towards Transferring Sketch Storyboards into 3D Animation|Zhong, Lei and Guo, Chuan and Xie, Yiming and Wang, Jiawei and Li, Changjian|ACM Trans. Graph.|https://doi.org/10.1145/3731167}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Projektu diskusija.&lt;br /&gt;
| &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#MD8]] Termiņš&amp;#039;&amp;#039;&amp;#039; -  [https://godotengine.org/ GoDot] (bija Unity 3D)&lt;br /&gt;
&lt;br /&gt;
Termiņš pagarināts par 1 nedēļu.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 04.12.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Ieva (&amp;#039;&amp;#039;Pārcelts&amp;#039;&amp;#039;) |A review of cybersickness in head‑mounted displays: raising attention to individual susceptibility|Tian, N., Lopes, P. &amp;amp; Boulic, R.|Springer, Volume 26, pages 1409–1441, 2022|https://link.springer.com/article/10.1007/s10055-022-00638-2}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Prez|Brigita |A Survey On Measuring Presence in Mixed Reality|Tanh Quang Tran, Tobias Langlotz, Holger Regenbrecht|Conference: CHI 2024, ACM Conference on Human Factors in Computing SystemsAt: Honolulu, Hawaiʻi|https://dl.acm.org/doi/10.1145/3613904.3642383?utm_source=chatgpt.com}}	&lt;br /&gt;
&lt;br /&gt;
{{Prez|Oskars |Rear-Seat Productivity in Virtual Reality: Investigating VR Interaction in the Confined Space of a Car |Jingyi Li , Ceenu George, Andrea Ngao, Kai Holländer, Stefan Mayer, un Andreas Butz|Multimodal Technologies and Interactionn - Special Issue: Interface and Experience Design for Future Mobility |https://www.mdpi.com/2414-4088/5/4/15}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Papildus:&lt;br /&gt;
* [https://www.hackster.io/mjrobot/vision-language-models-vlm-at-the-edge-9c6656 Vision-Language Models (VLM) at the Edge] on Raspberry Pi 5&lt;br /&gt;
* [http://www.medgadget.com/2016/12/knee-anesthetic-injection-virtual-reality-trainer-featured-aahks.html Knee Anesthetic Injection Virtual Reality Trainer]&lt;br /&gt;
| &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Paziņots [[#MD6]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 11.12.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Brigita |Enhancing social functioning using multi-user, immersive virtual reality|D. J. Holt1,2,4, N. R. DeTore1,2,4, B.Aideyan1,3, L. Utter1,2, L.Vinke1, D. S. Johnson1, J. Zimmerman1, K. N. Dokholyan1 &amp;amp; A. Burke1,2|Scientific Reports volume 15, Article number: 2790 (2025) |https://www.nature.com/articles/s41598-024-84954-4}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Ārija |A wirelessly programmable, skin-integrated thermo-haptic stimulator system for virtual reality|Kim, Jae-Hwan and Vázquez-Guardado, Abraham and Luan, Haiwen and Kim, Jin-Tae and Yang, Da and Zhang, Haohui and Chang, Jan-Kai and Yoo, Seonggwang and Park, Chanho and Wei, Yuanting and Christiansen, Zach and Kim, Seungyeob and Avila, Raudel and Kim, Jong and Lee, Young and Shin, Hee-Sup and Zhou, Mingyu and Jeon, Sung and Baek, Janice and Rogers, John|Proceedings of the National Academy of Sciences of the United States of America|https://www.researchgate.net/publication/380732173_A_wirelessly_programmable_skin-integrated_thermo-haptic_stimulator_system_for_virtual_reality}}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Ieva |A review of cybersickness in head‑mounted displays: raising attention to individual susceptibility|Tian, N., Lopes, P. &amp;amp; Boulic, R.|Springer, Volume 26, pages 1409–1441, 2022|https://link.springer.com/article/10.1007/s10055-022-00638-2}}&lt;br /&gt;
&lt;br /&gt;
Projektu diskusija.&lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 18.12.2025.====&lt;br /&gt;
| &lt;br /&gt;
Studentu prezentācijas:&lt;br /&gt;
&lt;br /&gt;
{{Prez|Sergejs |An Empirical Evaluation of AI-Powered Non-Player Characters’ Perceived Realism and Performance in Virtual Reality Environments| Mikko Korkiakoski, Saeid Sheikhi, Jesper Nyman, Jussi Saariniemi, Kalle Tapio, Panos Kostakos| |https://arxiv.org/pdf/2507.10469 }}&lt;br /&gt;
&lt;br /&gt;
{{Prez|Ieva |VR-GS: A Physical Dynamics-Aware Interactive Gaussian Splatting System in Virtual Reality|Jiang, Ying and Yu, Chang and Xie, Tianyi and Li, Xuan and Feng, Yutao and Wang, Huamin and Li, Minchen and Lau, Henry and Gao, Feng and Yang, Yin and Jiang, Chenfanfu|Association for Computing Machinery, SIGGRAPH &amp;#039;24: ACM SIGGRAPH 2024 Conference Papers|https://dl.acm.org/doi/abs/10.1145/3641519.3657448}}&lt;br /&gt;
&lt;br /&gt;
* -&lt;br /&gt;
&lt;br /&gt;
Projektu diskusija.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Papildus:&lt;br /&gt;
* Keynote at Vision Summit 2025 ([https://www.youtube.com/watch?v=UI0SZwO7orE&amp;amp;t=34s video])&lt;br /&gt;
&amp;lt;!-- 2016 ([https://www.youtube.com/watch?v=ThpvQ9AwzrI&amp;amp;t=3977s video]) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [https://www.ted.com/talks/johnny_lee_demos_wii_remote_hacks Jonny Lee: Free or cheap Wii Remote hacks]&lt;br /&gt;
* [https://www.ted.com/talks/jinha_lee_a_tool_that_lets_you_touch_pixels Jinha Lee: A tool that lets you touch pixels]&lt;br /&gt;
* [https://www.ted.com/talks/aaron_koblin Aaron Koblin: Visualizing ourselves ... with crowd-sourced data]&lt;br /&gt;
* [https://www.ted.com/talks/chris_milk_how_virtual_reality_can_create_the_ultimate_empathy_machine Chris Milk: How virtual reality can create the ultimate empathy machine]&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#MD6]] Termiņš&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;RE1&amp;#039;&amp;#039;&amp;#039; &amp;amp; &amp;#039;&amp;#039;&amp;#039;RE2&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 15.01.2026.====&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Eksāmens&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
10:30&lt;br /&gt;
&amp;lt;!-- Vieta: Tiešsaiste, Zoom --&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Final exam - file submission. Please include the following, as appropriate for your project. Please compress all files in one package as a ZIP file and name &amp;#039;&amp;#039;&amp;#039;VIV_EKS_Name_Lastname.zip&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
# VIV_EKS_Name_Lastname.pdf - &amp;#039;&amp;#039;&amp;#039;Essay&amp;#039;&amp;#039;&amp;#039;, describing the project and including the list of participants. Include an external reference to the demo as appropriate.&lt;br /&gt;
# VIV_PLA_Name_Lastname.pdf -  &amp;#039;&amp;#039;&amp;#039;Poster&amp;#039;&amp;#039;&amp;#039; in PDF, PNG or JPEG format.&lt;br /&gt;
#* [[LU::poster-howto | A few hints about making a good poster]]&lt;br /&gt;
# VIV_3D_Name_Lastname.zip - &amp;#039;&amp;#039;&amp;#039;3D models&amp;#039;&amp;#039;&amp;#039; (Sketchup, Blender,...) as appropriate.&lt;br /&gt;
# Any other files relevant to the project. &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eksāmena forma ir plakāta par izstrādāto projektu prezentācija.&lt;br /&gt;
&lt;br /&gt;
Elektroniski &amp;#039;&amp;#039;&amp;#039;iesniedzami e-studijās&amp;#039;&amp;#039;&amp;#039; (EXAM_files):&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Plakāts&amp;#039;&amp;#039;&amp;#039; PDF formā. Faila vārds: VIV_PLA_Vards_Uzvards.pdf&lt;br /&gt;
#* [[LU::poster-howto | Ieteikumi plakāta prezentācijas]] veidošanā&lt;br /&gt;
# Saite uz lejup-lādējamu &amp;#039;&amp;#039;&amp;#039;Blender&amp;#039;&amp;#039;&amp;#039; modeli, ja tas ietilpst projektā. faila vārds: VIV_3D_Vards_Uzvards_objekts... &lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Attēls&amp;#039;&amp;#039;&amp;#039; ar 3D modeli (JPG vai PNG), ja tas ietilpst projektā. faila vārds: VIV_PIC_Vards_Uzvards_objekts.jpg&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Apraksts&amp;#039;&amp;#039;&amp;#039;, esseja par projektu. Vēlams ierobežot uz 3 lapām. Formāts: PDF. Faila vārds: VIV_EKS_Vards_Uzvards.pdf&lt;br /&gt;
#* Aprakstā iekļaut saites uz demonstrējamo materiālu, vai portālu, ja tāds ir.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Uzdevumi ==&lt;br /&gt;
&lt;br /&gt;
=== Prezentācijas ===&lt;br /&gt;
Katram studentam jāveic divas prezentācijas pēc izvēlētajiem rakstiem [[#MD1]].&lt;br /&gt;
&lt;br /&gt;
Abu prezentāciju laiki tiek saskaņoti kopējā sarakstā (estudijās), un eventuāli ierakstīti šī wiki kalendārā.&lt;br /&gt;
&lt;br /&gt;
Gatavojoties prezentācijai, jāsagatavo slaidi, kas jāiesniedz pasniedzējam vismaz 3 dienas pirms prezentācijas.&lt;br /&gt;
&lt;br /&gt;
=== Mājas darbi ===&lt;br /&gt;
&lt;br /&gt;
====MD0====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A virtual classroom&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Consider a virtual classroom where students participate in a course such as this one, while being physically distant, yet being able to study, learn and gain knowledge, have discussions, work on assignments and tests in a meaningful way.&lt;br /&gt;
&lt;br /&gt;
Answer the following questions:&lt;br /&gt;
&lt;br /&gt;
Describe the class setup, the tools and the learning methods used.&lt;br /&gt;
Consider what technologies are necessary to implement this.&lt;br /&gt;
Describe a scenario where a class is taking place in such a virtual classroom.&lt;br /&gt;
Outline, what could be implemented right now, e.g. for our class, and what is still in the future due to the lack of technologies or other factors.&lt;br /&gt;
The submission should be in a PDF file, written in English or Latvian. One or two pages would be a good size for the submission.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====MD1====&lt;br /&gt;
Izvēlēties divas publikācijas referātam. Katrs students kursā prezentē divus referātus par publikācijām virtuālās un paplašinātas realitātes laukos. MD1 ietvaros katram studentam jāsameklē divas publikācijas par attiecīgajām tēmām:&lt;br /&gt;
* publikācijas autori un virsraksts;&lt;br /&gt;
* avots (konference);&lt;br /&gt;
* tēma;&lt;br /&gt;
* saite&lt;br /&gt;
&lt;br /&gt;
Izvēle jāreģistrē elektroniski - &lt;br /&gt;
[http://goo.gl/forms/RvJzK1iOw5 šajā anketā].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====MD2====&lt;br /&gt;
Izvērtēt [http://www.ingress.com/ Ingress] virtuālo vidi. Iesniegt aprakstu (1 lpp).&lt;br /&gt;
Izvērtējot pievērst uzmanību sekojošiem jautājumiem:&lt;br /&gt;
* Kas ir labs un kas slikts šajā vidē&lt;br /&gt;
* Kādi ir potenciālie pielietojumi ārpus pašas spēles (t.sk. vides izstrādātājiem)&lt;br /&gt;
* Vai vidē ir kas nevēlams, lieks, uzlabojams?&lt;br /&gt;
* Ar ko būtu vēlams vidi paplašināt&lt;br /&gt;
&lt;br /&gt;
Piezīmes: &lt;br /&gt;
* Ingress nepieciešams Android telefons vai planšete. Ja kādam tas nav pieejams, apvienojieties grupās, kur vismaz vienam ir iespēja darbināt spēli.&lt;br /&gt;
* Apraksti jāsagatavo individuāli (norādot grupas sastāvu, ja izvērtēšana veikta grupā) arī tad, ja vidi mēģinājāt vairāki kopā.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====MD2====&lt;br /&gt;
Izvērtēt [http://secondlife.com/ SecondLife] virtuālo vidi. Iesniegt aprakstu (1 lpp).&lt;br /&gt;
Izvērtējot pievērst uzmanību sekojošiem jautājumiem:&lt;br /&gt;
* Kas ir labs un kas slikts šajā vidē&lt;br /&gt;
* Kādi ir potenciālie pielietojumi ārpus pašas spēles (t.sk. vides izstrādātājiem)&lt;br /&gt;
* Vai vidē ir kas nevēlams, lieks, uzlabojams?&lt;br /&gt;
* Ar ko būtu vēlams vidi paplašināt&lt;br /&gt;
&lt;br /&gt;
====MD3====&lt;br /&gt;
Izvērtēt [http://en.wikipedia.org/wiki/LambdaMOO LambdaMoo] tekstuālo virtuālo vidi un uzrakstīt salīdzinājuma eseju (ar Second Life) uz vienas lapas.&lt;br /&gt;
* Ja nav iespējas piekļūt LambdaMOO serverim, izlasiet [http://aaactive.com/ygm/ygmpdf/ygm.pdf šo aprakstu], tai skaitā sekciju &amp;quot;Basics&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jautājumi salīdzinošās analīzes anketai:&lt;br /&gt;
* Kas ir labs un kas slikts šajā vidē&lt;br /&gt;
* Kādi ir potenciālie pielietojumi&lt;br /&gt;
* Vai vidē ir kas nevēlams, lieks?&lt;br /&gt;
* Ar ko būtu vēlams vidi paplašināt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====MD4====&lt;br /&gt;
&lt;br /&gt;
The purpose if this exercise is to explore the [https://www.blender.org/ 3D modelling tool Blender] that could be used for 3D model editing in the virtual worlds.&lt;br /&gt;
&lt;br /&gt;
The task is to create a 3D design as discussed in the class, e.g. of a building. There are no strict requirements for the complexity of the design, but consider creating something that is not trivial.&lt;br /&gt;
&lt;br /&gt;
Consider to make the design such that it could be 3D printed. This is not mandatory, but could be considered as an additional challenge for those that are already familiar with Blender.&lt;br /&gt;
&lt;br /&gt;
Submit the blender file (md4.blend) of the design. Also, submit a PDF file that contains rendering the image.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Review of the article [http://www.computer.org/csdl/mags/ic/2011/05/mic2011050011.html Virtual World Architectures] - IEEE Internet Computing raksts, September/October 2011 (Vol. 15, No. 5) pp. 11-14 [http://www.computer.org/csdl/mags/ic/2011/05/mic2011050011.pdf (pdf)]&lt;br /&gt;
&lt;br /&gt;
The paper review has to answer the following questions:&lt;br /&gt;
* The summary of the ideas in the paper&lt;br /&gt;
* The strengths of the paper&lt;br /&gt;
* The weaknesses of the paper&lt;br /&gt;
* Suggestions for the improvement of the paper&lt;br /&gt;
&lt;br /&gt;
The submission format is a PDF document&lt;br /&gt;
&lt;br /&gt;
====MD4.1====&lt;br /&gt;
Aprakstīt vizuālās virtuālās valodas vides specifikāciju un implementāciju:&lt;br /&gt;
# Aprakstīt specifikāciju. Tai skaitā īpašības, parametrus, iespējas, ierobežojumus.&lt;br /&gt;
# Aprakstīt tehniskās implementācijas vadlīnijas. Kādas tehnoloģijas ir nepieciešamas projekta realizācijai.&lt;br /&gt;
# Izvēlēties projekta nosaukumu&lt;br /&gt;
# izvēlēties domēna vārdu (nav jārezervē!)&lt;br /&gt;
Risinājumu iesniegt PDF formātā, elektroniski.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====MD5====&lt;br /&gt;
Uzrakstīt kursa projekta pieteikumu. Apjoms 1-2 lapas PDF formātā. Aprakstīt sekojošo: &lt;br /&gt;
* Dalībnieki.&lt;br /&gt;
* Par ko ir projekts, motivācija, vīzija. Saistītie risinājumi, un ar ko jūsējais būs atšķirīgs vai pat labāks.&lt;br /&gt;
* Sagaidāmais rezultāts, kā paredzēts realizēt.&lt;br /&gt;
* Risinājums, pieeja problēmai.&lt;br /&gt;
* Plāns, uzdevumi, iestrādes.&lt;br /&gt;
&lt;br /&gt;
Kursa projekts realizējams vai nu individuāli, vai nelielās studentu grupās, atkarībā no sarežģītības.&lt;br /&gt;
Tēmas ieteicams studentiem izdomāt pašīem, gan balstoties uz apgūto materiālu, gan savām interesēm.&lt;br /&gt;
&lt;br /&gt;
Ir svarīgi, lai tēma rezonētu ar studentu interesēm. Piemēram, ja studentam interesē arhitektūra, tad projekts varētu būt saistīts ar kādas celtnes 3D modeli un sistēmu kas ļauj to apskatīt vai izstaigāt, plus vēl kāda īpašība kas padarītu šo darbu netriviālu. Vai arī mobilā lietotne ar AR elementiem, kas ļautu ar kameru skatīties uz celtnēm un piedāvātu papildus informāciju, kas pārklāta attēlam par konkrēto objektu vai tā detaļām.&lt;br /&gt;
&lt;br /&gt;
Alternatīva tēma ir izveidot 3D modeli kādai svarīgai celtnei (Vec)Rīgā, un iesūtīt modeli Blender formātā. Kādreiz šīs ēkas arī centāmies reģistrēt ar Google Earth, bet tas vairs nav aktuāli.&lt;br /&gt;
&lt;br /&gt;
Pēc MD5 iesniegšanas tēmas tiek izvērtētas un komunicējot ar pasniedzēju pielāgotas tā lai būtu gan piemērotākas kursam, gan arī sasniedzamas, gan netriviālas.&lt;br /&gt;
&lt;br /&gt;
====MD6====&lt;br /&gt;
(&amp;#039;&amp;#039;&amp;#039;RE1&amp;#039;&amp;#039;&amp;#039; &amp;amp; &amp;#039;&amp;#039;&amp;#039;RE2&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
Iesniegt &amp;#039;&amp;#039;&amp;#039;2 recenzijas&amp;#039;&amp;#039;&amp;#039; jūsu kursa sākumā izvēlētajiem rakstiem.&lt;br /&gt;
* Atbildēt esejas formā uz sekojošiem jautājumiem:&lt;br /&gt;
*# Jūsu pieredze raksta tēmā: Eksperts; Zinošs; Tēma pazīstama; Tēma iepriekš nezināma.&lt;br /&gt;
*# Īss raksta kopsavilkums&lt;br /&gt;
*# Autoru devums un raksta labās īpašības&lt;br /&gt;
*# Raksta vājās vietas&lt;br /&gt;
*# Komentāri par to, kā rakstu varētu uzlabot vai papildināt.&lt;br /&gt;
* Formāts: PDF. Katra recenzija atsevišķā PDF failā&lt;br /&gt;
* Failu vārdi: VIV_REC1_Vards_Uzvards.pdf&lt;br /&gt;
* Iesūtīt eStudijās sadaļās &amp;#039;&amp;#039;&amp;#039;RE1&amp;#039;&amp;#039;&amp;#039; un &amp;#039;&amp;#039;&amp;#039;RE2&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;!-- * Iesūtīt vienā epastā pasniedzējam. Subj: &amp;quot;VIV REC Vards Uzvards&amp;quot;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====MD7====&lt;br /&gt;
&lt;br /&gt;
Write a proposal about the project that is using Microsoft Hololens in a novel, constructive way. Use the course videos and materials available on Internet for inspiration and technical specifications. Include the following in the proposal:&lt;br /&gt;
&lt;br /&gt;
* Concept, idea, motivation.&lt;br /&gt;
* Draft for the technical solution, including the resources needed, such as, application, framework, server or cloud solution, 3D input devices like Hydra.&lt;br /&gt;
* Estimate the complexity for implementing this project, e.g. the team size, roles and time required.&lt;br /&gt;
&lt;br /&gt;
Submit as a PDF document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Iesniegt aprakstu Microsoft Hololens pielietojumam. Tai skaitā:&lt;br /&gt;
* Konceptuālā ideja&lt;br /&gt;
* Tehniskā risinājuma uzmetums. Nepieciešamie resursi, piemēram, lietotne, 3D ievada manipulators Hydra, serveris, mākoņ-risinājums...&lt;br /&gt;
* Novērtējums sarežģītībai, komandas dalībnieki un aptuveni nepieciešamais laiks lai to realizētu.&lt;br /&gt;
Iesūtīt kā PDF dokumentu VIV_MD7_Vards_Uzvards.pdf&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====MD8====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Introduction to 3D (game) engines, such as Unity 3D, Unreal, and GoDot.&lt;br /&gt;
&lt;br /&gt;
This year we use [https://godotengine.org/ GoDot] (previously used Unity 3D).&lt;br /&gt;
&lt;br /&gt;
The purpose of this homework is an introduction to 3D game engine framework for VR environment and software design.&lt;br /&gt;
* Download and install the selected framework.&lt;br /&gt;
* Import your blender model from the earlier homework to the Unity environment.&lt;br /&gt;
* Enable the user/player to be walking around and possibly through the imported building.&lt;br /&gt;
* Improve the environment with other assets.&lt;br /&gt;
* Add at least one active object such as moving car or a working traffic light to your model.&lt;br /&gt;
* Compile and package your application.&lt;br /&gt;
* Create a description document that describes your application, the interface, has at least 2 screenshots and the link where to download your application and submit as a PDF document for MD8 in e-Studijas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources for GoDot:&lt;br /&gt;
* [https://godotengine.org/ GoDot Engine]&lt;br /&gt;
* [https://docs.godotengine.org/en/stable/community/tutorials.html GoDot tutorials]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources for Unity 3D:&lt;br /&gt;
* [https://unity3d.com/get-unity/download Download link for Unity3D]&lt;br /&gt;
* [https://learn.unity.com/ Unity Learn] - projects, courses, tutorials.&lt;br /&gt;
* [https://unity3d.com/learning-c-sharp-in-unity-for-beginners Coding in C# in Unity for beginners]&lt;br /&gt;
&lt;br /&gt;
= Resursi =&lt;br /&gt;
&lt;br /&gt;
* [[Publikāciju izvēle un prezentēšana]]&lt;br /&gt;
* Grāmata: [http://www.intechopen.com/books/show/title/augmented-reality Augmented Reality] (InTech open)&lt;br /&gt;
* [http://www.kzero.co.uk/blog/ KZero blog] - virtuālās pasaules, analīze.&lt;br /&gt;
* [https://www.researchgate.net/post/A_good_read_about_Virtual_environments What to read about virtual environments] @ ResearchGate&lt;br /&gt;
&lt;br /&gt;
== Blender 3D ==&lt;br /&gt;
* [https://youtube.com/playlist?list=PL32WMyFDbfNn4an_LAG1ubo59f54UktrQ Pamācības kā lietot Blender 3D] latviešu valodā. Taisam ziemassvētku apsveikumu.&lt;br /&gt;
* [https://youtu.be/5hgnzc7SV8c Blendera pasaulē] - īsfilma, ko radījuši jaunieši Latvijā ar Blender 3D rīku&lt;br /&gt;
&lt;br /&gt;
== In the news ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.medgadget.com/2020/12/vrx-a-medgadget-book-interview-with-author-dr-brennan-spiegel.html VRx] in medicine, interview with Brennan Spiegel&lt;br /&gt;
::  &amp;lt;small&amp;gt;In his book, VRx: How Virtual Therapeutics Will Revolutionize Medicine, Dr. Brennan Spiegel, a gastroenterologist and Director of Health Services Research at Cedars-Sinai Medical Center in Los Angeles, goes into detail about how virtual reality is playing an increasing role in therapeutic medicine. &amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://www.3dfocus.co.uk/category/3d-news-2/augmented-reality Augmented Reality] @ 3D news&lt;br /&gt;
* [[VIV-News]]&lt;br /&gt;
&lt;br /&gt;
== Preparing the presentation / Ieteikumi prezentāciju veidošanā ==&lt;br /&gt;
&lt;br /&gt;
Please plan the presentation time accordingly. You should probably have one slide per minute or less.&lt;br /&gt;
&lt;br /&gt;
Do a dry run before the presentation. Practice.&lt;br /&gt;
&lt;br /&gt;
Make the presentation so that it tells the story as visually as you can, rather than having loads of text on the slides.&lt;br /&gt;
&lt;br /&gt;
The presentations should follow a plan along these guidelines:&lt;br /&gt;
* Related work, other solutions, what was missing&lt;br /&gt;
* The current solution from the paper, approach&lt;br /&gt;
* Analysis, experimental setup, experiments, results&lt;br /&gt;
* Discussion&lt;br /&gt;
* Conclusion&lt;br /&gt;
* Prompts or ideas for in-class discussion after the paper presentation&lt;br /&gt;
&lt;br /&gt;
Other sources and guidelines:&lt;br /&gt;
* http://www.presentationzen.com/presentationzen/2007/03/a_few_weeks_ago.html&lt;br /&gt;
* http://www.presentationzen.com/&lt;br /&gt;
&lt;br /&gt;
* MIT Course: [https://www.youtube.com/watch?v=Unzc731iCUY&amp;amp;ab_channel=MITOpenCourseWare How to Speak by Patrick Winston (video] and [https://ocw.mit.edu/how_to_speak course)]&lt;br /&gt;
&lt;br /&gt;
== Other courses and resources / Kursi un resursi ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lua.org/pil/contents.html Programming in Lua]&lt;br /&gt;
&lt;br /&gt;
== Previous projects / Iepriekšējie projekti ==&lt;br /&gt;
* [[Virtuālā Rīga]] 3D modeļi Vecrīgā un Rīgā, ko veidojuši kursa studenti.&lt;br /&gt;
&lt;br /&gt;
* [https://www.roblox.com/games/4578938968/Verman-Park Vermanes darzs] - course project (in Roblox)&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=WX-m3PkUwTY Ģeolokācijas spēle]&lt;br /&gt;
&lt;br /&gt;
* 3D ekrāns ar rotējošu LED matricu [https://www.dropbox.com/s/qtf912vpj0jg7s4/IMG_8347a_rotejosais_ekrans.JPG?dl=0 (bilde)]&lt;br /&gt;
* &amp;quot;Ķiveres&amp;quot; ekrāna perimetra paplašināšana ar LED lentām lai papildinātu klātbūtnes efektu video materiālam uz ekrāna.&lt;br /&gt;
* Virtuāla karte un navigācija, ko vada ar realitātē izvietotiem QR kodiem. Realizācija LU ēkā.&lt;br /&gt;
* &amp;quot;Socicon&amp;quot; - Sociāla vide internetā, kur komunikācija notiek tikai ar attēliem.&lt;br /&gt;
&lt;br /&gt;
== External projects / Ārējie projekti ==&lt;br /&gt;
* [https://youtu.be/zq_FO69WFzA?si=T8lZT6lmYnsTnqwC Everyday Experiments] by SPACE10&lt;br /&gt;
&lt;br /&gt;
* CAVE = Cave automatic virtual environment [http://en.wikipedia.org/wiki/Cave_automatic_virtual_environment (Wikipedia)] &lt;br /&gt;
* Virtuālās alas (CAVE) un liela formāta, modulāri displeji ([[VR_Displays | atsevišķa lapa]])&lt;br /&gt;
&lt;br /&gt;
* [https://viterbischool.usc.edu/news/2024/02/international-conference-on-holodecks-five-key-takeaways/ Holodeck-i]&lt;br /&gt;
&lt;br /&gt;
* [https://www.computer.org/csdl/magazine/cg/2013/03/mcg2013030012/13rRUwhpBGA Building Virtual Worlds Carrying on the Legacy of Randy Pausch&amp;#039;s &amp;quot;Head Fake&amp;quot;] @ CMU&lt;br /&gt;
&lt;br /&gt;
* [http://www.theverge.com/2015/9/17/9333633/usc-institute-for-creative-technologies-virtual-reality-lab Inside USC’s crazy experimental VR lab]&lt;br /&gt;
* [https://www.vividlyapp.com/ Vividly - VR for architecture], [http://www.archipreneur.com/how-virtual-space-will-revolutionize-architecture-with-gunita-kulikovska/ (article)] - made in Latvia.&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=oI7kLrpoqMs Augmentētā klinšu kāpšana]&lt;br /&gt;
&lt;br /&gt;
* [https://www.quora.com/What-is-the-new-Apple-U1-chip-and-why-is-it-important Apple U1 chip enabling UWB for localization]&lt;br /&gt;
&lt;br /&gt;
=== Roblox, virtual environments ===&lt;br /&gt;
* [https://www.roblox.com/library/1255724589/The-Freedom-Monument-of-Riga The Freedom Monument], Riga, Latvia&lt;br /&gt;
* [https://www.roblox.com/games/4578938968/Verman-Park Vermanes darzs] - course project&lt;br /&gt;
&lt;br /&gt;
=== Game development / Spēļu izstrāde ===&lt;br /&gt;
* [https://www.youtube.com/watch?v=w1M4b6PneFk Subnautica 2 briesmoņu izstrāde]&lt;br /&gt;
&lt;br /&gt;
== Prezentācijas un video ==&lt;br /&gt;
&lt;br /&gt;
* Jinha Lee - [https://www.ted.com/talks/jinha_lee_reach_into_the_computer_and_grab_a_pixel?subtitle=en Reach into the computer and grab a pixel]&lt;br /&gt;
&lt;br /&gt;
* About Sixth Sense from MIT by:&lt;br /&gt;
** [https://www.ted.com/talks/pattie_maes_pranav_mistry_meet_the_sixthsense_interaction?subtitle=en Patie Maes]&lt;br /&gt;
** [http://www.youtube.com/watch?v=vcBIUsQEE3E Pranav Mistry]&lt;br /&gt;
&lt;br /&gt;
* Sergey Brin about [https://www.ted.com/talks/sergey_brin_why_google_glass?subtitle=en Why Google Glass]&lt;br /&gt;
&lt;br /&gt;
* Eric Berlow and Sean Gourley: [https://www.ted.com/talks/eric_berlow_and_sean_gourley_mapping_ideas_worth_spreading?subtitle=en Mapping ideas worth spreading]&lt;br /&gt;
&lt;br /&gt;
== Applications / Pielietojumi ==&lt;br /&gt;
&lt;br /&gt;
* [https://actu.epfl.ch/news/explore-the-universe-with-virtual-reality/ Explore the Universe with VR] with EPFL. [https://youtu.be/lq3fW7Z8p2c (Video)]&lt;br /&gt;
* [https://www.medgadget.com/2021/10/visual-content-to-treat-amblyopia-interview-with-scott-xiao-ceo-at-luminopia.html Amblyopia (lazy eye) treatement with VR]&lt;br /&gt;
* [http://www.medgadget.com/2016/09/treating-pain-virtual-reality-interview-appliedvr-ceo-matthew-stoudt.html AppliedVR] pielietojumi sāpju mazināšanas terapijā&lt;br /&gt;
* [https://www.medgadget.com/2017/07/stanford-neurosurgery-department-taking-full-advantage-virtual-reality.html Neiroķirurgi Stenfordas universitātē lieto VR]&lt;br /&gt;
&lt;br /&gt;
Exergames:&lt;br /&gt;
* [https://www.youtube.com/watch?v=HEOKxPiGiBg&amp;amp;ab_channel=VRTrailers%26Clips FitXR for VR headsets] (Oculus, Playstation)&lt;br /&gt;
* [https://ringfitadventure.nintendo.com/ Ring Fit Adventure] for TV (Nintendo)&lt;br /&gt;
&lt;br /&gt;
== Potential project themes / Iespējamās kursa projektu tēmas ==&lt;br /&gt;
&lt;br /&gt;
Iedomājieties skolu, kurā katrs priekšmets ir pasaule virtuālajā realitātē. Tas dotu alternatīvu mācību pieeju, skolēni varētu ne tikai lasīt par priekšmetu, bet burtiski spert soli tajā iekšā, lai redzētu un manipulētu ar tēmas objektiem un principiem no iekšienes. Piemēri šādiem priekšmetiem: astronomija, ķīmija, bioloģija, tēlotāja māksla,...&lt;br /&gt;
&lt;br /&gt;
Virtuālā Rīga&lt;br /&gt;
* Rīgas arhitektūras objektu digitāla uzņemšana un integrēšana Rīgas 3D modelī.&lt;br /&gt;
&lt;br /&gt;
Projekts [http://roblox.com Roblox] vidē&lt;br /&gt;
* Roblox ir 3D spēļu izstrādes vide kas iekļauj gan 3D vides dizainu gan arī iespēju papildināt to ar funkcionalitāti programmēšanas valodā Lua.&lt;br /&gt;
&lt;br /&gt;
Arhitektūra un VR (sadarbībā ar uzņēmumu):  &lt;br /&gt;
# Analītiku pievienošana uz integrēta Vr modeļa, tā varētu būt skaņa, gaisma, energoefektivitātes dati real-time attainojumā utt&lt;br /&gt;
# Interakcijas/ ievades iekārtu testēšana, navigācijas izstrāde iespējams dažādos līmeņos - ar &amp;quot;remote control&amp;quot;, &amp;quot;game console&amp;quot;, &amp;quot;gesture based with Leap Motion&amp;quot;.&lt;br /&gt;
#* Iespēja iezīmēt objektus un mainīt to materialitāti, izkārtojumu. Izmaiņu sinhronizācija - kaut kas tiek mainīts VR vidē un izmainās 2D vidē, piemēram plāns.&lt;br /&gt;
# Saziņa vairāku lietotāju integrācija VR objektā; lietotāju saskarnes funkcionalitāte (frontend | backend).&lt;br /&gt;
&lt;br /&gt;
== Competitions / Konkursi ==&lt;br /&gt;
&lt;br /&gt;
* [https://archhive.beebreeders.com/ Archhive]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=LU-BST-b&amp;diff=11271</id>
		<title>LU-BST-b</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=LU-BST-b&amp;diff=11271"/>
		<updated>2026-05-20T13:04:20Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* xx.06.26 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Īssaites:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
[[#Kalendārs | Kalendārs]] | &lt;br /&gt;
[[#Uzdevumi | Uzdevumi]] | &lt;br /&gt;
[[#Resursi | Resursi]] | &lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
{{TodayTomorrow}} (ja ir lekcija)&lt;br /&gt;
&lt;br /&gt;
{{LUDFKurss|Bezvadu Sensoru Tīkli|BST|DatZB043|2DAT3253}}&lt;br /&gt;
* Pasniedzējs: [[User:Leo | Leo Seļāvo]]&lt;br /&gt;
&lt;br /&gt;
====Kursa mērķis un uzdevumi====&lt;br /&gt;
Iepazīties ar bezvadu sensoru tīklu sistēmu darbības un projektēšanas principiem un pielietojumiem.&lt;br /&gt;
* Apgūt sensoru un iegulto sistēmu pamata tehnoloģijas un pielietojumus lietu internetā. &lt;br /&gt;
* Izstrādāt arhitektūru un komunikāciju protokolus bezvadu sensoru sistēmām. &lt;br /&gt;
* Programmēt iegultās sistēmas BST pielietojumam. &lt;br /&gt;
* Analizēt sensoru lasījumus un izdarīt secinājumus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Ievadlekcijas video&amp;#039;&amp;#039;&amp;#039;:&amp;lt;/big&amp;gt; [https://youtu.be/nwPxnED1M34 No sensoriem līdz stāstam]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Vērtējums kursā ====&lt;br /&gt;
* 30% Praktiskie darbi PD&lt;br /&gt;
* 20% Mājas darbi MD&lt;br /&gt;
* 20% Kontroldarbs KD&lt;br /&gt;
* 30% Projekta prezentācija un demo eksāmenā EKS + PROJ&lt;br /&gt;
&lt;br /&gt;
==== Mājas darbi ====&lt;br /&gt;
* Iesniedzami e-studijās&lt;br /&gt;
* Termiņš 30min pirms lekcijas sākuma, vai arī kā MD nosacījumos.&lt;br /&gt;
** Kavēts termiņš nozīmē -50% no vērtējuma. Pēc nedēļas darbs var tikt nepieņemts.&lt;br /&gt;
&lt;br /&gt;
==== Vidus semestra aptauja ====&lt;br /&gt;
* [https://docs.google.com/document/d/1XpUX_ZRIGsMSBrZpuO7KhmUn-x2emV3B/edit Aptauja]&lt;br /&gt;
&lt;br /&gt;
=Kalendārs=&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=4 style = &amp;#039;border-color: #ddd; background-color: #fdfff2;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
! Datums&lt;br /&gt;
! Tēma, saturs&lt;br /&gt;
! Uzdevumi&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
====4.02.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Ievadlekcija&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bezvadu sensoru tīklu pielietojumi un pamatproblēmas. BST kursa forma un prasības.&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/4iazzqk2ykmumsq/00_intro.pdf?raw=1 Ievads BST - slaidi]&lt;br /&gt;
* [https://www.dropbox.com/s/u5fnw7uku1ua1sf/00_Intro_IoT.pdf?raw=1 Ievads IoT - slaidi]&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD1 | PD1]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====11.02.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Bezvadu sakaru sistēmas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Radio spektrs un ISM josla. Komunikācijas protokoli un modulācija.&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/jujvdabdj03szif/L02_Wireless_systems.pdf?raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD2 | PD2]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====18.02.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Radio komunikāciju realitātes&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/scl/fi/fgqnlfpo7xurz5mm5atwj/03_radio-realities.pdf?rlkey=x54t0itxkbyuu0705ejoi3vry&amp;amp;st=mcy8s1hc&amp;amp;raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD3 | PD3]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====25.02.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Iegultās sistēmas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Sensoru mezgla uzbūve.&lt;br /&gt;
&lt;br /&gt;
[[BST-b_HW | Lekcijas pieraksti]]&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/kzcd4mr8mirh2i9/L03_motes.pdf?raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD4 | PD4]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====4.03.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;MAC protokoli sensoru tīklos&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/le4f7sywa528lnb/L05_Harvard_mac.pdf?raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD5 | PD5]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====11.03.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;(&amp;#039;&amp;#039;Attālināti&amp;#039;&amp;#039;) &amp;#039;&amp;#039;&amp;#039;KD0: Maršrutizācijas protokoli&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/u1y7n2www1y7vgu/L06_Routing.pdf?raw=1 Maršrutizācija. Slaidi]&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Uzdots: [[#MD_Routing|MD_Routing]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====18.03.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Laika sinhronizācija&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/8dmwkihq3gq4gls/L07_Timesync.pdf?raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD6 | PD6 Multihop]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====25.03.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Lokalizācija&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* [http://selavo.lv/kursi/bst/09_localization.pdf Slaidi]&lt;br /&gt;
&lt;br /&gt;
Diskusijas par projektiem&lt;br /&gt;
|&lt;br /&gt;
Sensoru datu analīze, Jupyter notebook&lt;br /&gt;
* [https://jupyter.org Jupyter]&lt;br /&gt;
* [https://anaconda.org/anaconda/python Anaconda Python]&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====8.04.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Programmēšanas abstrakcijas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Komponenšu orientēta programmēšana. Skriptēta un enkapsulēta programmēšana. TinyOS, MansOS un SEAL.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lasāmviela&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://www.dropbox.com/s/xwnr2aterigjp7q/05_component-programming.pdf?raw=1 Komponenšu orientēta programmēšana, TinyOS]&lt;br /&gt;
* [https://www.dropbox.com/s/jalyp6jxv7b2ja6/12_prog-abstractions.pdf?raw=1 Programmēšanas abstrakcijas BST, Mate]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Iesniegt: [[#MD_Routing|MD_Routing]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Uzdots: [[#MD_Proj|MD_Proj]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====15.04.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;KD1&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Vidus semestra kontroldarbs KD1. Pieejams eStudijās.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====22.04.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Projektu tēmas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Diskusija par projektu tēmām.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Use case&amp;quot; - par projektiem infekcijas risku mazināšanai.&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====29.04.26====&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Datu vizualizācija un analīze&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Datu vizualizācija un analīze.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====6.05.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Datu analīze, prakse&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lasāmviela&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://www.anaconda.com/ Anaconda platforma] datu zinātnei.&lt;br /&gt;
* [https://jupyter.org/ Jupyter Notebook] - vide mazām programmām Python un datu analīzei.&lt;br /&gt;
* [https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/ Jupyter triki]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6480280/ Wireless Sensor Networks for Big Data Systems]&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš: [[#MD_Proj|MD_Proj]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Projektu statuss&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====13.05.26====&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Drošība un privātums&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* [https://www.dropbox.com/scl/fi/5xkeow5yuaxobewhwrntr/13_security-privacy_v2.pdf?rlkey=w6papger2tw2to9l3kk7w344y&amp;amp;st=1sxvon1n&amp;amp;dl=1 Slaidi]&lt;br /&gt;
* Videolekcija e-studijās.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lasāmviela&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://cert.lv/lv CERT.lv] - IT drošības incidentu novēršanas institūcija Latvijā.&lt;br /&gt;
* [https://www.thalesgroup.com/en/markets/digital-identity-and-security/iot/magazine/internet-threats IoT Security Issues in 2021: a Business Perspective]&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Projekta statusa ziņojumi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====20.05.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Enerģijas ieguve no vides&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/lro0ncpw570neej/15_energy-harvesting.pdf?raw=1 Slaidi]&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Projekta statusa ziņojumi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====27.05.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Kopsavilkums&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/qf5yd5toylks4zf/L99_Summary.pdf?raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Projektu statusa ziņojumi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====17.06.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Eksāmens&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eksāmena sākums: 14:30&lt;br /&gt;
Eksāmena vieta: 312. aud.&lt;br /&gt;
&lt;br /&gt;
Eksāmena (projekta) rezultāti iesūtāmi e-studijās kā PROJ, tai skaitā:&lt;br /&gt;
* apraksts.pdf - apraksts: problēma, risinājumi, jūsu risinājums, rezultāti un pieredze izstrādājot un testējot projektu. Fails PDF formātā.&lt;br /&gt;
* plakāts.pdf - plakāts par projektu. Fails PDF formātā.&lt;br /&gt;
* Saite uz demonstrācijas video, ja tāds ir.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Eksāmens&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Iesniegt projekta rezultātus e-studijās.&lt;br /&gt;
* Prezentācija klātienē.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- TESTBED&lt;br /&gt;
=====================================&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;BST Testbed&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
EDI BST [[#Testbed | Testbed apraksts un lietojums]].&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Uzdots: [[#MD_Testbed|MD_Testbed-P1]] - Testbed P1 uzdevums&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
=====================================&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Testbed&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Testbed prakse&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
=====================================&lt;br /&gt;
* Termiņš: [https://doodle.com/poll/627utpttbvqiypue?utm_source=poll&amp;amp;utm_medium=link Pieteikt grupas MD_Testbed uzdevumiem]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš: [[#MD_Testbed|MD_Testbed-P1]] - Testbed P1 uzdevums&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš: [[#MD_Testbed|MD_Testbed]] - Visi uzdevumi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Uzdevumi =&lt;br /&gt;
== Praktiskie darbi ==&lt;br /&gt;
Praktiskajos darbos būs lietojama [https://github.com/edi-riga/MansOS/wiki MansOS operētājsistēma].&lt;br /&gt;
* Īss apraksts un pamācības pieejamas [https://github.com/edi-riga/MansOS/wiki MansOS wiki].&lt;br /&gt;
&amp;lt;!--https://github.com/IECS/MansOS--&amp;gt;&lt;br /&gt;
Praktisko darbu risinājumi iesūtāmi e-studijās.&lt;br /&gt;
&lt;br /&gt;
===PD1===&lt;br /&gt;
&amp;quot;SOS&amp;quot; morzes ābecē izvadīts uz motes LED&lt;br /&gt;
* E-studijās iesūtīt C programmas kodu.&lt;br /&gt;
&lt;br /&gt;
===PD2===&lt;br /&gt;
Hello World -&amp;gt; no motes uz termināla&lt;br /&gt;
&lt;br /&gt;
===PD3===&lt;br /&gt;
Gaismas sensora lasījums uz termināla&lt;br /&gt;
&lt;br /&gt;
===PD4===&lt;br /&gt;
Darbs grupā pa divi.&lt;br /&gt;
&lt;br /&gt;
Gaismas sensora lasījums pārraidīts ar radio un saņemts uz citas motes un izvadīts uz termināla.&lt;br /&gt;
&lt;br /&gt;
Risinājumam jābūt noturīgam pret citiem raidītājiem šajā pašā radio kanālā. Jāparāda tikai sava risinājuma sūtītās ziņas.&lt;br /&gt;
&lt;br /&gt;
Iesūtīt pirmkodu, kā arī failu apraksts.pdf ar testu rezultātiem un to aprakstu.&lt;br /&gt;
&lt;br /&gt;
===PD5===&lt;br /&gt;
Darbs grupā pa divi.&lt;br /&gt;
&lt;br /&gt;
Noteikt radio raidīšanas attālumu TmoteSky motēm.&lt;br /&gt;
* Izveidot raidītāja programmu un uztvērēja programmu. &lt;br /&gt;
* Pārvietot motes dažādos attālumos un novērtēt, cik datu pakas tiek saņemtas.&lt;br /&gt;
* Izvērtēt, kāda ietekme ir motes savstarpējai orientācijai starp raidītāju un uztvērēju.&lt;br /&gt;
* Aprakstīt rezultātus un iesniegt PDF dokumentā apraksts.pdf, e-studijās, kā PD5.&lt;br /&gt;
&lt;br /&gt;
===PD6===&lt;br /&gt;
Darbs grupā pa diviem vai trijiem studentiem.&lt;br /&gt;
&lt;br /&gt;
Realizēt &amp;quot;Multihop&amp;quot; tīklu ar TmoteSky motēm.&lt;br /&gt;
* Izveidot programmatūru trīs dažādu sensoru mezglu tipiem, attiecīgos pirmkoda failos:&lt;br /&gt;
*# sensor.c - Sensors - nolasa gaismas sensora vērtību un nosūta pa radio Releja tipa motei.&lt;br /&gt;
*# relay.c - Relejs - mote, kas saņem datus no sensoriem un pārsūta tālāk citām motēm (Relejiem un Vārtejām).&lt;br /&gt;
*# gateway.c - Vārteja - mote, kas saņem radio datus un pārsūta tos uz seriālo portu (USB).&lt;br /&gt;
&lt;br /&gt;
* Katram mezglam (motei) ir unikāls ID. Izdomāt, kā to panākt.&lt;br /&gt;
* Tīklā jābūt vismaz vienam relejam, bet var būt vairāki, lai realizētu garāku komunikācijas ķēdi.&lt;br /&gt;
* Tīklā var būt vairāki Sensoru mezgli. &lt;br /&gt;
* Tīklā ir tikai viena vārteja.&lt;br /&gt;
* Relejam jāignorē tās ziņas, ko tas jau ir kādreiz sūtījis. Šo var realizēt ar motes identifikatora un/vai ziņas kārtas numura iekļaušanu sūtāmajā datu pakā. Tad, piemēram, mote var ignorēt vecākas datu pakas nekā pēdējā, ko tā ir sūtījusi.&lt;br /&gt;
* Vārtejai katra datu paka jānosūta pa USB tikai vienreiz. Ja tā, piemēram, saņem to pašu datu paku atkārtoti, piemēram, no cita Releja, tai tā jāignorē.&lt;br /&gt;
&lt;br /&gt;
* Aprakstīt rezultātus un iesniegt PDF dokumentā apraksts.pdf, e-studijās, kā PD6. Iesniegt arī programmatūras kodu.&lt;br /&gt;
&lt;br /&gt;
==Mājas darbi==&lt;br /&gt;
===MD_Routing===&lt;br /&gt;
Izstrādāt un aprakstīt maršrutizācijas algoritmu, kas atbilst prasībām &lt;br /&gt;
[https://www.dropbox.com/s/yakqcy9e8322tbf/BST_routing_MD.pdf?raw=1 šajos slaidos]&lt;br /&gt;
&lt;br /&gt;
* Aprakstīt izveidoto maršrutizācijas protokolu.&lt;br /&gt;
* Aprakstīt protokola veiktspējas novērtējumu.&lt;br /&gt;
* Sniegt piemēru, kā tas darbojas slaidos dotajā situācijā.&lt;br /&gt;
* Risinājumu iesniegt PDF dokumentā, e-studijās.&lt;br /&gt;
&lt;br /&gt;
===MD1===&lt;br /&gt;
[[#PD5 | PD5]] rezultāti - Izvērtēt sensoru mezglu komunikāciju veiktspēju atkarībā no distances.&lt;br /&gt;
&lt;br /&gt;
Gadījumā, ja jums neizdevās savākt savus datus, tad analīzei var lietot šos, ar attiecīgu atsauci:&lt;br /&gt;
* [https://www.dropbox.com/s/gd434p1wkgcq9gz/merijumi_veldre_kniss.xlsx?dl=1 | Dati1 (excel)] (Rainers, Juris)&lt;br /&gt;
* [https://www.dropbox.com/s/h679d2y84svixs1/BST_PD05_DATA_Audris.zip?dl=1 | Dati2 (zip)] (Audris, Madara)&lt;br /&gt;
&lt;br /&gt;
===MD3===&lt;br /&gt;
Izstrādāt un aprakstīt virtuālas mašīnas valodu bezvadu sensoru mezgliem, līdzīgi kā &lt;br /&gt;
[https://www.dropbox.com/s/pw8hl4zbsbgek65/L09b_prog-abstractions.pdf?raw=1 Mate lekcijas slaidos]. &lt;br /&gt;
&lt;br /&gt;
Aprakstā jāiekļauj: &lt;br /&gt;
* Valodas komandas, arhitektūra, pieņēmumi&lt;br /&gt;
* Komandu kodējums (pa bitiem), komandu tipi vai klases.&lt;br /&gt;
* Divi piemēri programmām, kas kodēti jūsu valodā.&lt;br /&gt;
* Ar ko jūsu risinājums atšķiras no Mate un kādos gadījumos tam ir priekšrocības.&lt;br /&gt;
&lt;br /&gt;
===MD_Proj===&lt;br /&gt;
====Kursa projekta pieteikums====&lt;br /&gt;
&lt;br /&gt;
=====Īss apraksts=====&lt;br /&gt;
&lt;br /&gt;
Izstrādāt projekta pieteikumu, kurā aprakstīt:&lt;br /&gt;
* Problēmu, ko risināsiet ar bezvadu sensoru tīklu palīdzību&lt;br /&gt;
* Motivāciju, kāpēc problēma jārisina&lt;br /&gt;
* Esošos risinājumus šai problēmai vai līdzīgām problēmām&lt;br /&gt;
* Kas nepieciešams jūsu risinājumam: tehnoloģijas, aparatūra&lt;br /&gt;
* Termiņi katrai nedēļai: kas tiks veikts līdz šiem termiņiem projekta izstrādes gaitā.&lt;br /&gt;
&lt;br /&gt;
Aprakstu organizēt kā slaidus, lai ērti prezentēt. Iesniegt aprakstu PDF formātā.&lt;br /&gt;
&lt;br /&gt;
=====Sīkāks apraksts=====&lt;br /&gt;
&lt;br /&gt;
Šoreiz nekas nav jāprogrammē. Bet gan jāuzraksta sava kursa projekta īss apraksts kā slaidu prezentācija un jāiesniedz PDF formātā.&lt;br /&gt;
Kursa projekta pieteikumu būs iespējams prezentēt lekcijas laikā, lai pārrunātu ar kolēģiem. &lt;br /&gt;
&lt;br /&gt;
Obligātās dokumenta nodaļas:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Projekta tēma&amp;#039;&amp;#039;&amp;#039;. Kas ir Jūsu projekts, ko Jūs izstrādāsiet. Šeit var pietikt ar vienu vai dažiem teikumiem&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Projekta komanda&amp;#039;&amp;#039;&amp;#039;, īpaši ja nepieciešams vairāk par vienu dalībnieku. Kas piedalās, kādas lomas katrs izpilda (kurš ko programmēs, kurš projektēs, kurš testēs utt)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Motivācija&amp;#039;&amp;#039;&amp;#039;. Kāpēc Jūs šādu projektu taisāt. Kāds no tā varētu būt labums Jums un pārējiem apkārtējiem cilvēkiem, dabai.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Jūsu pieeja un arhitektūra&amp;#039;&amp;#039;&amp;#039;. Kā realizēsiet projektu. Kāda būs izmantotā aparatūra. Kāda programmatūra. Kāda būs tīkla struktūra. Šeit labi iederas sistēmas arhitektūras bildes, shematiski attēlojumi. Svarīgi norādīt arī nepieciešamo aparatūru, tai skaitā, kādi sensori nepieciešami projekta realizēšanai. Lai varam sākt meklēt nepieciešamos sensorus, motes. Tiek sagaidīts, ka šī ir saturīgākā projekta apraksta daļa.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sagaidāmais rezultāts&amp;#039;&amp;#039;&amp;#039;. Cik daudz no savas projekta idejas plānojat šī semestra laikā realizēt. Kādus testus veikt. Kā novērtēsit rezultātus.&lt;br /&gt;
&lt;br /&gt;
Papildus tēmas:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kas šajā tēmā pasaulē ir jau izdarīts&amp;#039;&amp;#039;&amp;#039;. Bakalaura studentiem netiek prasīts izdarīt kaut ko universālu, kas pasaulē vēl neeksistē. Tai pat laikā, ir ļoti vēlams, ka veicat izpēti, par to, kas pasaulē Jūsu tēmā ir jau izpildīts. Kaut vai tāpēc, lai izvēlētos labāko risinājumu, lai nav pašiem jāizdomā no nulles&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Idealizācija&amp;#039;&amp;#039;&amp;#039;. Šī projekta ietvaros netiek prasīts, lai Jūs uzbūvējat vispasaules sensoru tīklu ar Google mēroga infrastruktūru. Bet, ja tas būtu iespējams - ko ar Jūsu sensoru tīklu varētu izdarīt? T.i., padomājiet arī pāri sava viena semestra robežām!&lt;br /&gt;
&lt;br /&gt;
===MD_Testbed===&lt;br /&gt;
Uzdevuma veikšana EDI testbed platformā (Testbed).&lt;br /&gt;
&lt;br /&gt;
Pieslēguma informācija Testbed platformai tiks paziņota individuāli, lekcijā un/vai e-studijās.&lt;br /&gt;
&lt;br /&gt;
Uzdevums ir ievākt informāciju no Testbed sensoriem kas atrodas uz jums izdalītajiem Testbed sensoru mezgliem pēc iespējas ilgāku laika posmu, vismaz 24 stundas, un attēlot datus grafiski. Sīkāks uzdevumu apraksts seko.&lt;br /&gt;
&lt;br /&gt;
====Programma P1====&lt;br /&gt;
Programmas P1 mērķis ir pārbaudīt Testbed darbību un nolasīt log failos saglabātos datus.&lt;br /&gt;
&lt;br /&gt;
* Pieslēgties Testbed &lt;br /&gt;
* Pārbaudīt jums izdalīto sensoru mezglu darbību izveidojot vienkāršu programmu &amp;lt;code&amp;gt;P1.c&amp;lt;/code&amp;gt; kas sūta skaitļus no 1 līdz 100 ar vienas sekundes intervālu uz seriālo portu. Skaitļus sūtīt kā simbolu virkni salasāmā tekstā, piemēram &amp;quot;17&amp;quot;.&lt;br /&gt;
* Darbināt P1 uz visiem sensoru mezgliem vienlaicīgi. Darbināt eksperimentu 10min. Saglabāt Log failus.&lt;br /&gt;
* Novērtēt rezultātus. Piemēram, vai visi sensori darbojās vienlīdz ātri?&lt;br /&gt;
&lt;br /&gt;
====Programma P2====&lt;br /&gt;
Programmas P2 mērķis ir ievākt sensoru datus ilgākā laika posmā.&lt;br /&gt;
&lt;br /&gt;
* Izveidot programmu &amp;lt;code&amp;gt;P2.c&amp;lt;/code&amp;gt; kas reizi 10 sekundēs nolasa sensoru vērtības. &lt;br /&gt;
* Lasāmie sensori ir: Gaismas sensors, temperatūra un gaisa mitrums.&lt;br /&gt;
* Darbināt P2 24 stundas un saglabāt datus Log failos.&lt;br /&gt;
* Analizēt sensoru datus. Uzzīmēt datus grafikā ar x kā laika asi un y kā mērījumu asi. Izdarīt secinājumus.&lt;br /&gt;
&lt;br /&gt;
====Programma P3====&lt;br /&gt;
Programmas P3 mērķis ir novērtēt komunikāciju iespējas Testbed vidē.&lt;br /&gt;
&lt;br /&gt;
* Izveidot programmu &amp;lt;code&amp;gt;P3_send.c&amp;lt;/code&amp;gt;, kas sūta 300 ziņas visiem citiem mezgliem ik pa 100 milisekundēm. Katrā ziņā iekļaut tās kārtas numuru. Datos iekļaut arī savu identifikatoru, lai saņemošais klients var atpazīt datu pakas tipu un mērķi.&lt;br /&gt;
* Izveidot programmu &amp;lt;code&amp;gt;P3_receive.c&amp;lt;/code&amp;gt;, kas saņem ziņas pa radio no citiem mezgliem un pieraksta RSSI vērtības atmiņas buferī. Kad visas atsūtītas, eksportēt datus uz log failu caur seriālo portu.&lt;br /&gt;
* Darbināt P3_send uz viena mezgla un P3_receive uz pārējiem. Saglabāt datus log failā.&lt;br /&gt;
* Atkārtot iepriekšējo eksperimentu tā, lai datu būtu sūtīti no visiem mezgliem.&lt;br /&gt;
* Rezultātā jums jābūt datiem kas apraksta komunikāciju starp jebkuriem diviem mezgliem.&lt;br /&gt;
* Rezultātu analīzē parādiet kā RSSI mainās laikā starp visiem mezgliem. Bez tam, izveidojiet tabulu vai grafu kurā novērtējiet komunikāciju/ saņemtā signāla stiprumu starp visiem mezgliem. Atcerieties, ka saites var būt arī asimetriskas, piemēram, mezgls A &amp;quot;dzird&amp;quot; mezglu B labāk nekā B &amp;quot;dzird&amp;quot; A.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Piezīmes&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Ņemiet vērā, ka var gadīties, ka dažas ziņas mezgli var nesaņemt trokšņu vai citu iemeslu dēļ. Datos tas ir jāredz. Tāpēc saglabājot RSSI jāņem vērā arī saņemtās ziņas kārtas numurs, ko tā sūtīja.&lt;br /&gt;
* Saņemtos RSSI rādījumus jums jāglabā atmiņā, lai tie aizņemtu pēc iespējas mazāk vietas. Sūtot tos uz reizi pa seriālo portu jums var nepietikt laika saņemt visas ziņas. Tāpēc ieteicams datus saglabāt ar seriālo portu tikai pēc tam kad eksperiments beidzies - pēdēja ziņa saņemta (vai nav pienākusi, bet laiks pagājis).&lt;br /&gt;
&lt;br /&gt;
====Iesniegšana====&lt;br /&gt;
Iesniegt rezultātus visiem uzdevumiem e-studijās kā MD_Testbed. &lt;br /&gt;
Tai skaitā, katram uzdevumam P&amp;#039;&amp;#039;X&amp;#039;&amp;#039;, kur &amp;#039;&amp;#039;X&amp;#039;&amp;#039; ir 1, 2 un 3:&lt;br /&gt;
&lt;br /&gt;
* Katram uzdevumam P1, P2 un P3 izveidot direktoriju ar attiecīgu vārdu. Šajās direktorijās izvietot attiecīgo uzdevumu pirmkoda, datu un apraksta failus.&lt;br /&gt;
* Iekopēt direktorijās visu pirmkodu un ievākto datu failus&lt;br /&gt;
* Analīzes rezultātus aprakstīt un grafikus attēlot PDF failā ar nosaukumu P&amp;#039;&amp;#039;X&amp;#039;&amp;#039;.pdf&lt;br /&gt;
* Neaizmirstiet aprakstā norādīt darba autorus un ko katrs darījis, kā arī katra dalībnieka procentuālo ieguldījumu no komandas darba.&lt;br /&gt;
* Visus failus arhivēt kā zip failu un saukt BST_MD_Testbed_Vards_Uzvards.zip, kur, protams, lietots &amp;#039;&amp;#039;jūsu&amp;#039;&amp;#039; vārds un uzvārds.&lt;br /&gt;
* Zip fails jāiesūta e-studijās VISIEM komandas dalībniekiem.&lt;br /&gt;
&lt;br /&gt;
=Testbed=&lt;br /&gt;
&lt;br /&gt;
EDI BST testa vides piekļuve un lietošana.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lasāmviela&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Qy32wqh3W4ki808hN_FUTMHURcO1F6St3nwovtZLLNQ/edit?usp=sharing Lietošanas pamācība]&lt;br /&gt;
* [https://www.edi.lv/testbed EDI Testbed] portāls&lt;br /&gt;
* Testbed CLI komandu [https://www.dropbox.com/s/gse78nkox8eo523/EDI%20TestBed%20CLI%20cheat%20sheet%202021.pdf?raw=1 Cheatsheet]&lt;br /&gt;
* [https://www.dropbox.com/s/efsx8380cy4y366/EDI_TestBed_CLI_intro_2021.pdf?raw=1 EDI Testbed Prezentācija]&lt;br /&gt;
* Demonstrācijas video pieejams eStudijās&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CLI klientu programmatūra&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** [https://makonis.edi.lv/s/PtomG54z8i7ozJp Linux]&lt;br /&gt;
** [https://makonis.edi.lv/s/bBAzoknjX23WfPS Windows]&lt;br /&gt;
&lt;br /&gt;
Publikācijas&lt;br /&gt;
* [https://www.researchgate.net/publication/236735509_Wireless_Sensor_Network_Testbeds_A_Survey Wireless Sensor Network Testbeds: A Survey]&lt;br /&gt;
&lt;br /&gt;
= Resursi =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/edi-riga/MansOS/wiki &amp;#039;&amp;#039;&amp;#039;MansOS&amp;#039;&amp;#039;&amp;#039; operētājsistēma]&lt;br /&gt;
** [[MansOS msp430 procesora rīku instalācija ar Docker]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.catb.org/esr/structure-packing/ The Lost Art of Structure Packing]&lt;br /&gt;
* Grāmata: [https://ptolemy.berkeley.edu/books/leeseshia/ Introduction to Embedded Systems - A Cyber-Physical Systems Approach]&lt;br /&gt;
* [[LU::poster-howto | Ieteikumi plakātu prezentāciju veidošanā]]&lt;br /&gt;
&lt;br /&gt;
* [https://towardsdatascience.com/top-30-data-science-interview-questions-7dd9a96d3f5c Datu zinātne] - 30 intervijas jautājumi&lt;br /&gt;
&lt;br /&gt;
* [https://google.github.io/mediapipe/ Mediapipe] - attēlu apsrādes bibliotēka&lt;br /&gt;
&lt;br /&gt;
== Aparatūra, sensori ==&lt;br /&gt;
* [[DiLab_resursi]] - LU pieejamie sensori un aparatūra&lt;br /&gt;
&lt;br /&gt;
== Saites ==&lt;br /&gt;
* [[LU-BST:links | Bezvadu sensoru tīklu saites]]&lt;br /&gt;
* [https://www.sqimway.com/index.html Bezvadu komunikācijas veidi un frekvences]&lt;br /&gt;
* [http://ss64.com/bash Linux komandu rokasgrāmata]. Komandas, kas mums būs noderīgas: cd, ls, cp, mv, mkdir, df, echo, export, find, grep, less, nano, make, man, ping, rm, ifconfig.&lt;br /&gt;
* [[LU-BST:SwissQM | Kā piedarbināt SwissQM virtuālo mašīnu sensoru tīkliem]] (Paldies Kārlim Visendorfam par aprakstu!)&lt;br /&gt;
* [https://www.ibr.cs.tu-bs.de/dus/publications/spots2006.pdf uPart mote un tās īpašības]&lt;br /&gt;
&lt;br /&gt;
== Interesanti ==&lt;br /&gt;
* [https://www.sparkfun.com/news/6147 Hedy Lamarr and Frequency Hopping Technology] - Holivudas aktrise un FH patenta autore.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=LU-DIP-m&amp;diff=11270</id>
		<title>LU-DIP-m</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=LU-DIP-m&amp;diff=11270"/>
		<updated>2026-05-14T09:02:23Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* xx.06.26 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Īsceļi:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
[[#Kalendārs | Kalendārs]] | &lt;br /&gt;
[[#Lekciju video | Video]] |&lt;br /&gt;
[[#PD | PD]] |&lt;br /&gt;
[[#MD | MD]] |&lt;br /&gt;
[[#Informācijas resursi | Resursi]] | &lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
{{TodayTomorrow}} (ja ir lekcija)&lt;br /&gt;
&lt;br /&gt;
{{LUDFKurss|Digitālā projektēšana [M]|DIP|DatZ7034|2DAT7034|maģistru un doktorantu}}&lt;br /&gt;
&lt;br /&gt;
= Par kursu =&lt;br /&gt;
&lt;br /&gt;
Kursa mērķi ir iepazīstināt ar digitālo iekārtu projektēšanas aspektiem, darba plūsmu, problēmām un risinājumiem. Kursa ietvaros tiek apskatīti digitālu iekārtu un datoru arhitektūras pamata un arī sarežģītākas pakāpes elementi.&lt;br /&gt;
Kursā studenti izstrādā praktiskos darbus un kursa projektu, kura rezultāts ir digitāla iekarta, piemēram procesors, mini dators, grafikas kontrolieris, kalkulators, paralēlas attēlu apstrādes iekārta un citas iekārtas.&lt;br /&gt;
&lt;br /&gt;
=== Administratīvā informācija===&lt;br /&gt;
* Pasniedzējs: Leo Seļāvo &amp;#039;&amp;#039;(epasts: vards.uzvards @ gmail.com)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * Vērtējums = 40% mājas un praktiskie darbi, 10% dalība klasē, 20% KD1 un 30% KD2(eksāmens). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{KursiMD|DIP|50%|10%}}&lt;br /&gt;
&lt;br /&gt;
=Kalendārs=&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=4 style = &amp;#039;border-color: #ddd;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
! Datums&lt;br /&gt;
! Tēma, saturs&lt;br /&gt;
! Uzdevumi&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
==== 5.02.26 ====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Ievads kursā&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Digitālas iekārtas vispārējā arhitektūra un uzbūve.&lt;br /&gt;
Digitālā projektēšana, ievads, darba plūsma. Map, place, route. Laika anotācija - &amp;quot;&amp;quot;Timing back-annotation&amp;quot;&amp;quot;. Simulācija un testēšana dažādos līmeņos.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mācību materiāli&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://youtu.be/sqyLYgVvtr0 Ievads (video)]&lt;br /&gt;
* [https://youtu.be/G6abrFbeazw Kas ir digitālas sistēmas (video)]&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
[[#PD1 | PD1]] - LED un slēdžī&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 12.02.26 ====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Digitālo iekārtu pamatelementi&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* [https://youtu.be/6340drM2Fm0 Slaidi/video]&lt;br /&gt;
&lt;br /&gt;
Digitālo iekārtu pamatelementi, tranzistors, invertors, NAND un NOR elementi no tranzistoriem, to loģiskā uzbūve un īpašības.&lt;br /&gt;
Loģiskie elementi, minimālā kopa. Pāreja no loģiskajām izteiksmēm un tabulām uz realizāciju ar loģiskajiem elementiem. Kombinētie loģiskie elementi. Dešifrators, multipleksors, frekvences dalītājs un citi elementi.&lt;br /&gt;
Elementi ar atmiņu.  RS un D trigeri. &amp;quot;&amp;quot;Latch&amp;quot;&amp;quot; un &amp;quot;&amp;quot;D-Flip-flop&amp;quot;&amp;quot;. Reģistri un uz tiem bāzētas iekārtas. Bīdes reģistri. Skaitītāji. Uzstādīšanas un noturēšanas laiku ierobežojumi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;CMOS tehnoloģija&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
MOS tranzistora uzbūve un pielietojumi loģisko iekārtu uzbūvē&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mācību materiāli&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://youtu.be/knlFvRxpUuE MOS tranzistors kā pamatelements digitālajām iekārtām (video)]&lt;br /&gt;
* [https://youtu.be/I-l2bQ-C_VU Loģisko elementu uzbūve ar MOS tranzistoriem (video)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 19.02.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Aparatūru aprakstošas valodas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aparatūru aprakstošas valodas (HDL), Verilog. Valodas elementi simulācijai un sintēzei. Uzvedības un struktūras apraksts. Moduļi. Datu tipi, signāli un reģistri.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mācību materiāli&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [http://www.ece.umd.edu/class/enee359a/verilog_tutorial.pdf Verilog tutorial] no UMD.&lt;br /&gt;
* [http://www.asic-world.com/verilog/veritut.html Verilog tutorial] no ASIC world.&lt;br /&gt;
* [https://uobdv.github.io/Design-Verification/Supplementary/Verilog.SLIDES.pdf Verilog lekcijas slaidi] no CMU.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Uzdots [[#MD_RF | MD_RF]]&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 26.02.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Instrukciju kopas arhitektūra&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* [http://selavo.lv/kursi/dipm/dlx_handout.pdf Slaidi/video]&lt;br /&gt;
&lt;br /&gt;
Procesora instrukciju arhitektūra. Instrukciju tipi un kodēšana. Operandi. RISC un CISC arhitektūras. DLX procesora instrukciju arhitektūra. Salīdzinoši piemēri no ARM instrukciju kopas.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš&amp;#039;&amp;#039;&amp;#039; [[#MD_RF | MD_RF]]&lt;br /&gt;
* Uzdots [[#MD_ALU | MD_ALU]]&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 5.03.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Risc V arhitektūra&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Vientakts procesora arhitektūra. Instrukciju dešifratora un skaitītāja reģistri. Reģistru fails. Aritmētiski loģiskā iekārta (ALU). Atmiņas saskarne. Instrukciju un datu kešatmiņa.&lt;br /&gt;
&lt;br /&gt;
RISC V procesora arhitektūra un instrukciju kopa.&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/eit5g6x4a7tqhla/riscv-20160507-patterson-160507071645.pdf?raw=1 Slaidi/video]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* RISC-V arhitektūras procesori un instrukciju kopa.&lt;br /&gt;
* Salīdzinošais ieskats ARM instrukciju kopā.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mācību materiāli&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://riscv.org/ RISCV.org]&lt;br /&gt;
* [https://www.dropbox.com/s/8oy8yqd2bpff9rd/RISCVGreenCardv8-20151013.pdf?raw=1 RISC V Green Card]&lt;br /&gt;
* [https://five-embeddev.com/riscv-isa-manual/latest/instr-table.html RISC-V ISA Manual] - tabula ar instrukcijām un to kodiem.&lt;br /&gt;
* [https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-118.pdf Instruction manual] (Berkeley universitāte)&lt;br /&gt;
&lt;br /&gt;
* [https://riscvasm.lucasteske.dev/# RISC-V Online Assembler]&lt;br /&gt;
* [https://www.cs.cornell.edu/courses/cs3410/2019sp/riscv/interpreter/# RISCV Interpreter] online at Cornell&lt;br /&gt;
&lt;br /&gt;
* [http://tice.sea.eseo.fr/riscv/ RISCV datapath vizualizācija]&lt;br /&gt;
&lt;br /&gt;
* [https://circuitdigest.com/article/understanding-risc-v-architecture-and-why-it-could-be-a-replacement-for-arm Risc V un ARM]&lt;br /&gt;
* [https://youtu.be/XMg0qzyMi14 Designing Open Processors at the Barcelona Supercomputing Center (video)]&lt;br /&gt;
&lt;br /&gt;
* Konferences:&lt;br /&gt;
** [https://www.dac.com/ DAC]&lt;br /&gt;
** [https://www.date-conference.com/ DATE]&lt;br /&gt;
** [https://dsd-seaa2021.unipv.it/index.html#call Euromicro DSD]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš&amp;#039;&amp;#039;&amp;#039;: [[#MD_ALU | MD_ALU]]&lt;br /&gt;
* Uzdots: [[#MD_CPU_v0 | MD_CPU_v0]]&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 12.03.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Instrukciju atmiņa. RISC V Asemblers&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Instrukciju atmiņa, reģistrs, dekoderis. PC reģistrs.&lt;br /&gt;
&lt;br /&gt;
RISC V Asemblers. GNU rīki kompilācijai. Qemu simulators.&lt;br /&gt;
&lt;br /&gt;
* GNU asemblera kompilators RISC V arhitektūrai ir pieejams kā riscv64-linux-gnu-as. Ar to ir iespējams kompilēt kodu 32 bitu arhitektūrai RV32i norādot attiecīgu arhitektūras parametru:&lt;br /&gt;
 riscv64-linux-gnu-as -march=rv32e -al test.s&lt;br /&gt;
* Tad kompilēto kodu iespējams dabūt no listinga (to apstrādājot), vai arī no kompilētā elf faila ar objdump.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš&amp;#039;&amp;#039;&amp;#039;: [[#MD_CPU_v0 | MD_CPU_v0]]&lt;br /&gt;
* Uzdots: [[#MD_CPU_IC | MD_CPU_IC]]&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 19.03.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Operatīvā atmiņa&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Operatīvā atmiņa, statiskā un dinamiskā. Atmiņas matricas un uzbūve. Kešatmiņas. Saskarnes starp atmiņu un citām iekārtām.&lt;br /&gt;
&lt;br /&gt;
Resursi:&lt;br /&gt;
* [http://ece-research.unm.edu/jimp/vlsi/slides/chap8_2.html Atmiņas uzbūve] no New Mexico Universitātes, VLSI kursa.&lt;br /&gt;
* [https://www.embedded.com/flash-101-nand-flash-vs-nor-flash/ NAND un NOR zibatmiņa] (embedded.com)&lt;br /&gt;
* [https://www.enterprisestorageforum.com/hardware/slc-vs-mlc-vs-tlc-nand-flash/ SLV, MLC, TLC Flash memory] (Enterprise storage forum)&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš&amp;#039;&amp;#039;&amp;#039;: [[#MD_CPU_IC | MD_CPU_IC]]&lt;br /&gt;
* Uzdots: [[#MD_CPU_DC | MD_CPU_DC]]&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 26.03.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Vadības kontrole&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Branch instrukcijas. Jump-and-link instrukcijas. &lt;br /&gt;
To realizācija vientakts procesorā. &lt;br /&gt;
Branch prediction. Heristikas vadības kontroles optimizācijai.&lt;br /&gt;
&lt;br /&gt;
Kešatmiņa. Asociatīvā atmiņa. &lt;br /&gt;
&amp;quot;N-way set associative cache memory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš&amp;#039;&amp;#039;&amp;#039;: [[#MD_CPU_DC | MD_CPU_DC]]&lt;br /&gt;
* Uzdots: [[#MD_CPU_Branch | MD_CPU_Branch]]&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 9.04.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;GPIO&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
GPIO - General Purpose Input Output. Datu ievads un izvads ar kartētu atmiņu (memory mapped IO). Mikrokontroliera perifērijas iekārtu reģistri. Reģistrs lasīšanas un rakstīšanas virzienam. Saskarnes savietošana ar operatīvās atmiņas saskarni.&lt;br /&gt;
|&lt;br /&gt;
* Uzdots: [[#MD_GPIO | MD_GPIO]]&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 16.04.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Procesora arhitektūra&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* [https://youtu.be/P2CARhD2k3A Slaidi/video]&lt;br /&gt;
Procesora arhitektūra. Daudz-taktu procesors un konveijera princips.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš&amp;#039;&amp;#039;&amp;#039;: [[#MD_CPU_Branch | MD_CPU_Branch]]&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 23.04.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Metrikas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Digitālas projektēšanas metrikas. Funkcionalitāte. Izmaksas, fiksētās un mainīgās. Uzticamība, izturība. Trokšņu noturība un imunitāte. Veiktspēja. Ātrums un enerģijas patēriņš. Projektēšanas laiks.&lt;br /&gt;
* [https://www.dropbox.com/s/aoyenqlkhaz1yoe/Metrics_Leo.pdf?raw=1 Slaidi/video]&lt;br /&gt;
&lt;br /&gt;
Resursi:&lt;br /&gt;
* [https://semiengineering.com/from-design-to-deployment-how-silicon-lifecycle-management-optimizes-the-entire-ic-life-span/ Silicon lifecycle...]&lt;br /&gt;
* [https://anysilicon.com/when-and-why-should-you-choose-an-asic/ When and why ASIC...]&lt;br /&gt;
&lt;br /&gt;
* [https://qr.ae/pC3aan Dealing with faults on billion-transistor chips] (Quora)&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 30.04.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Programmējamās loģikas iekārtas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* [https://youtu.be/JEiLcHtgSlE Slaidi/video]&lt;br /&gt;
&lt;br /&gt;
Programmējamās loģikas iekārtas, CPLD un FPGA. FPGA uzbūve. Konfigurējami loģiskie elementi. Ievada un izvada elementi. Komunikācija, maģistrāles.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mācību materiāli&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://www.electronicsforu.com/technology-trends/fpga-vs-cpld-microcontrollers FPGA vs CPLD vs Microcontrollers] (from electronicsforu.com)&lt;br /&gt;
* [https://www.xilinx.com/support/documentation/data_sheets/ds312.pdf Spartan-3E FPGA Family Data Sheet]&lt;br /&gt;
* [https://www.xilinx.com/support/documentation/data_sheets/ds090.pdf CoolRunner II CPLD Family]&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 7.05.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;FPGA kā serviss&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Attālināta FPGA attīstītājrīku programmēšana un testēšana.&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš&amp;#039;&amp;#039;&amp;#039;: [[#MD_GPIO | MD_GPIO]]&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 14.05.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;(Vieslekcija)&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
FPGA pielietojumi kosmosa tehnoloģijās.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 21.05.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Superskalāras arhitektūras&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* [https://www.dropbox.com/s/7nrd0ke682oc935/13_Superscalar.pdf?raw=1 Slaidi/video]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Superskalārie procesori un to uzbūve. Paralēlu ALU izmantošanas stratēģijas.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 28.05.26 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Dinamiska instrukciju plānošana&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Instrukciju paralelisms, ciklu atrullēšana, Scoreboarding un Tomasulo arhitektūras.&lt;br /&gt;
&lt;br /&gt;
Slaidi:&lt;br /&gt;
* [https://www.dropbox.com/s/ieks943pmn4ikpm/ECE570_dynamic_scheduling.pdf?raw=1 Scoreboarding algoritms]&lt;br /&gt;
* [https://www.dropbox.com/s/1a1s4d95k5plotb/Lecture04_tomasulo.pdf?raw=1 Tomasulo algoritms]&lt;br /&gt;
&lt;br /&gt;
Resursi:&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Tomasulo%27s_algorithm Par Tomasulo algoritmu] no Wikipedijas&lt;br /&gt;
* [http://nathantypanski.github.io/tomasulo-simulator/ Tomasulo simulators]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [https://serenefield.com/Blog/posts/HighPerformanceArchitecture/2021-01-28_High-Performance-Computer-Architecture-13---Tomasulo-s-Algorithm-Part-1-8c65788dec07.html Ievads Tomasulo algoritmā] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 28.05.26 ====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Kopsavilkums&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Daudzkodolu procesori un CUDA&lt;br /&gt;
* [https://sites.google.com/a/nirmauni.ac.in/cudacodes/cuda-material/tutorial-3 GPU Computing: The Democratization of Parallel Computing] - seminārs, ASPLOS&amp;#039;08&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
==== 11.06.26 ====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Eksāmens&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
10:30 Eksāmens.&lt;br /&gt;
&lt;br /&gt;
Projektu demonstrācijas un plakāti.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
Eksāmenā:&lt;br /&gt;
* Risinājuma pirmkods un projekts kā zip fails&lt;br /&gt;
* Dokumentācija jūsu risinājumam &amp;quot;Datasheet&amp;quot;.&lt;br /&gt;
* Jānodod eseja (e-studijās), kurā aprakstīti projekta izaicinājumi un sasniegumi kā arī tehniskā informācija par projektu.&lt;br /&gt;
* Bez tam, jāizveido plakāts, kas būs jāprezentē mutiski un jāatbild uz jautājumiem. PDF formātā (e-studijās).&lt;br /&gt;
** [[LU::poster-howto | Ieteikumi plakāta prezentācijas]] veidošanā&lt;br /&gt;
* Ja projektā ir demonstrējama daļa, tad jāveic arī tā demonstrācija.&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Lekciju video =&lt;br /&gt;
Lekciju [https://www.youtube.com/playlist?list=PL32WMyFDbfNnVb3nFI9Tku5O8ukKBxs6Z videomateriāls ir pieejams Youtube]. Sīkāk, pa tēmām:&lt;br /&gt;
* [https://youtu.be/sqyLYgVvtr0 Ievads kursa pirmajai daļai.]&lt;br /&gt;
* [https://youtu.be/G6abrFbeazw Digitālas sistēmas.]&lt;br /&gt;
* [https://youtu.be/6340drM2Fm0 Loģikas pamatelementi.]&lt;br /&gt;
* [https://youtu.be/knlFvRxpUuE Tranzistora uzbūve.]&lt;br /&gt;
* [https://youtu.be/I-l2bQ-C_VU Tranzistoru lietojumi.]&lt;br /&gt;
* [https://youtu.be/hDOUl1ViMdc Laika atkarīgi elementi.]&lt;br /&gt;
* [https://youtu.be/1spw-GAsDLk Trigeri un &amp;quot;latch&amp;quot; iekārtas.]&lt;br /&gt;
* [https://youtu.be/P2CARhD2k3A CPU uzbūve un konveijera princips.]&lt;br /&gt;
* [https://youtu.be/JEiLcHtgSlE FPGA uzbūve.]&lt;br /&gt;
&lt;br /&gt;
= PD =&lt;br /&gt;
Praktiskie darbi.&lt;br /&gt;
&lt;br /&gt;
===PD1===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED un slēdži&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķi=====&lt;br /&gt;
* apgūt darba plūsmu ar FPGA shēmas ievadu, kompilāciju un dizaina augžuplādēšanu uz FPGA iekārtas.&lt;br /&gt;
* lietot FPGA ievada un izvada portus (pinus).&lt;br /&gt;
* lietot elementāras loģikas elementus shēmā.&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
Izveidot digitālu iekārtu, kas izmanto ievada elementus (slēdžus) un izvada elementus (LED).&lt;br /&gt;
* Shēmas ievads&lt;br /&gt;
* Kompilācija&lt;br /&gt;
* Uzlādēšana uz reālas FPGA iekārtas&lt;br /&gt;
* Pārbaude&lt;br /&gt;
&lt;br /&gt;
Iekārtai jāveic sekojošas darbības:&lt;br /&gt;
* SW1 slēdzis ieslēdz un izslēdz LED1 spīddiodi.&lt;br /&gt;
* SW2 un SW3 slēdži veido ievaddatus XOR elementam, kura rezultats tiek izvadīts uz LED2.&lt;br /&gt;
* Spīddiode LED3, kas ieslēdzas un izslēdzas reizi sekundē. SW4 to var apstādināt un iedarbināt.&lt;br /&gt;
&lt;br /&gt;
Praktiskajā darbā izstrādātā iekārta jādemonstrē uz FPGA iekārtas.&lt;br /&gt;
&lt;br /&gt;
Resusrsi:&lt;br /&gt;
* [http://www.xilinx.com/support/documentation/boards_and_kits/ug230.pdf Xilinx Spartan-3E FPGA Starter Kit Board User Guide]&lt;br /&gt;
* [https://eprints.qut.edu.au/76297/1/Spartan3E_Tutorial_1ver2.pdf Spartan 3E Tutorial] no Queensland University of Technology&lt;br /&gt;
&lt;br /&gt;
===PD_Counter===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Skaitītāja simulācija&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķi=====&lt;br /&gt;
* Iepazīties ar FPGA elementu bibliotēkas skaitītāja moduļiem&lt;br /&gt;
* Iemācīties, kā darbināt simulācijas&lt;br /&gt;
&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
* Izveidot shēmu iekārtai, kas izmantojot takts signālu realizē 4 bitu bināru skaitītāju.&lt;br /&gt;
* Demonstrēt iekārtas darbību ar simulātoru (ISim vai Modelsim)&lt;br /&gt;
&lt;br /&gt;
=====Iesniegt=====&lt;br /&gt;
Iesniegt e-studijās: &lt;br /&gt;
* PDF dokumentu kurā ir gan iekārtas shēma, gan arī simulācijas rezultāti un īss pieredzes apraksts.&lt;br /&gt;
&lt;br /&gt;
===PD_Calc===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kalkulators: stāvokļu diagramma un kontrolieris&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
===== Mērķi =====&lt;br /&gt;
* Iepazīties ar galīgo automātu projektēšanu un implementāciju Verilog valodā&lt;br /&gt;
* Projektēt digitālu sistēmu ar kontrolieri&lt;br /&gt;
* Simulēt kontroliera dizainu&lt;br /&gt;
&lt;br /&gt;
===== Uzdevums =====&lt;br /&gt;
Izveidot funkcionālu kalkulatora moduli, kas reaģē uz taustiņu signāliem veic saskaitīšanas un atņemšanas operācijas. &lt;br /&gt;
Kalkulators strādā heksadecimālā sistēmā, tātad, tam ir 16 ciparu taustiņi: 0,1,2...8,9,A,B,C,D,E,F.&lt;br /&gt;
Bez tam ir arī operāciju taustiņi: CLR - nodzēst rezultātu, un operācijas +, - un =.&lt;br /&gt;
Nospiežot katru taustiņu tiek pacelts signāls BtnDown. Atlaižot taustiņu tas tiek nolaists.&lt;br /&gt;
Jāveic sekojoši uzdevumi:&lt;br /&gt;
* Izveidot projektu kalkulatoram ar Verilog vai shēmu diagrammu.&lt;br /&gt;
* Izveidot kontrolieri, kas balstīts uz vienu vai vairākiem galīgiem stāvokļu automātiem.&lt;br /&gt;
* Demonstrēt iekārtas darbību ar simulātoru Xilinx ISim.&lt;br /&gt;
&lt;br /&gt;
===== Iesniegt =====&lt;br /&gt;
Iesniegt e-studijās: &lt;br /&gt;
* PDF dokumentu kurā ir gan iekārtas shēma, gan arī simulācijas rezultāti un īss pieredzes apraksts.&lt;br /&gt;
* Iekārtas un testēšanas Verilog pirmkoda failus.&lt;br /&gt;
&lt;br /&gt;
===PD_VGA===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Šaha laukums&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķi=====&lt;br /&gt;
* iepazīties ar VGA signālu protokolu&lt;br /&gt;
* izpildīt iekartas dizainu Verilog valodā&lt;br /&gt;
&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
Izveidot iekārtu, kas uz monitora ekrāna attēlo 8x8 šaha lauciņu. &lt;br /&gt;
Darba gaita iepazīties ar video signāla formu un laika parametriem. &lt;br /&gt;
Darbu atļauts izpildīt daļēji vai pilnīgi Verilog valodā. &lt;br /&gt;
&lt;br /&gt;
Praktiskajā darbā izstrādātā iekārta jādemonstrē uz Spartan 3E FPGA iekārtas, kam pieslēgts monitors.&lt;br /&gt;
&lt;br /&gt;
Izstrādātā risinājuma pirmkoda faili jāarhivē failā vards_uzvards_PD2.zip un jāiesūta e-studijās.&lt;br /&gt;
&lt;br /&gt;
===PD_Kbd===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Klaviatūra un Ciparu izvads&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķi=====&lt;br /&gt;
* iepazīties ar PS/2 (klaviatūras) protokolu&lt;br /&gt;
* Izstrādāt stāvokļu mašīnu - galīgo automātu kalkulatora darbībai&lt;br /&gt;
&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
Izveidot digitālu iekārtu, kas darbojas kā kalkulators ar skaitļiem heksadecimālajā sistēmā un var izpildīt saskaitīšanas un atņemšanas operācijas.&lt;br /&gt;
&lt;br /&gt;
Skaitļu ievads ir no klaviatūras, kas pieslēdta ar PS/2 portu.&lt;br /&gt;
&lt;br /&gt;
Skaitļu izvads ir uz LCD ekrāna.&lt;br /&gt;
&lt;br /&gt;
Izstrādātā risinājuma pirmkoda faili jāarhivē failā vards_uzvards_PD3.zip un jāiesūta e-studijās.&lt;br /&gt;
&lt;br /&gt;
= MD =&lt;br /&gt;
Mājas darbi.&lt;br /&gt;
&lt;br /&gt;
===MD1===&lt;br /&gt;
&lt;br /&gt;
Novērtēt Spartan 3E attīstītājrīka un FPGA iespējas. Atbildēt uz jautājumu: vai iespējams uz Spartan 3E realizēt datoru, kas varētu darbināt Linux klases operētājsistēmu? Atbildi &amp;#039;&amp;#039;&amp;#039;pamatot&amp;#039;&amp;#039;&amp;#039;, izvērtējot &amp;#039;&amp;#039;&amp;#039;nepieciešamos un atbilstošos pieejamos resursus&amp;#039;&amp;#039;&amp;#039; gan FPGA, gan perifērijas iekārtu kontekstā.&lt;br /&gt;
&lt;br /&gt;
Atbilde noformējama kā eseja PDF failā vards_uzvards_MD1.pdf un jāiesūta e-studijās.&lt;br /&gt;
&lt;br /&gt;
===MD2===&lt;br /&gt;
&lt;br /&gt;
Aprakstīt ideju kursā realizējamam projektam, ko izstrādāsiet uz FPGA iekārtas.&lt;br /&gt;
Iekļaut sekojošas sadaļas:&lt;br /&gt;
* Vai tas ir individuāls vai komandas darbs. Ja komandas, tad pievienot dalībnieku sarakstu un to lomu projektā&lt;br /&gt;
* Mērķis un motivācija&lt;br /&gt;
* Nepieciešamie resursi&lt;br /&gt;
* Risinājuma apraksts&lt;br /&gt;
* Realizācijas plāns ar konkrētiem datumiem un starpmērķiem, kas tajos sasniedzami&lt;br /&gt;
&lt;br /&gt;
Atbilde noformējama kā dokuments PDF failā vards_uzvards_MD2.pdf un jāiesūta e-studijās.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===MD_OpenGL===&lt;br /&gt;
&lt;br /&gt;
Uzzīmēt un aprakstīt video kontroliera shēmu, kas atbalsta minimālu OpenGL vai līdzīgu instrukciju kopu.&lt;br /&gt;
Instrukcijas tiek nodotas no datora pa seriālo portu. Instrukcijas jāatkodē un jāizpilda, izmainot lokālu video buferi. No bufera attēls jāizvada uz  iebūvēto VGA portu attēla izvadei.&lt;br /&gt;
&lt;br /&gt;
Atbilde noformējama kā dokuments PDF failā vards_uzvards_MDx.pdf un jāiesūta e-studijās.&lt;br /&gt;
&lt;br /&gt;
===MD_RF===&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Reģistru fails un simulācija&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķi=====&lt;br /&gt;
* Pamatelementu un reģistru lietojums Verilog valodā&lt;br /&gt;
* Projekta simulācija&lt;br /&gt;
&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
Izveidot 32x32 reģistru failu procesoram. Veikt simulāciju ar ISim, kas pārbauda tā darbību.&lt;br /&gt;
&lt;br /&gt;
* Reģistru failā ir 32 biti&lt;br /&gt;
* Katrs reģistrs ir 32 bitus garš&lt;br /&gt;
* Turpmāk aprakstā  portu/signālu bitu skaits tiek norādīts aiz tiem iekavās.&lt;br /&gt;
* Ir divi porti A(32) un B(32), kas ļauj vienlaicīgi nolasīt divu reģistru vērtības. Lasāmo reģistru adreses tiek norādītas ar AA(5) un AB(5)&lt;br /&gt;
* Ir viens ports D(32), kas ļauj ierakstīt viena reģistra vērtību CLK uzlecošās frontes notikuma brīdī, ja ir iespējota rakstīšana ar signālu WR. Reģistrs, kurā rakstīt, tiek norādīts ar signālu AD(5).&lt;br /&gt;
* Lasīšanas un rakstīšanas darbībām jāvar notikt paralēli, vienlaicīgi.&lt;br /&gt;
&lt;br /&gt;
Demonstrēt iekārtas darbību ar simulatoru ISim [https://www.youtube.com/watch?v=9iQfqhUfAcE (pamācības video)]&lt;br /&gt;
* Simulācijas daļā demonstrēt, kā informācija tiek rakstīta visos reģistros, kā arī lasīta no tiem. Lai veiktu šo simulāciju, izveidot testa moduli (testbench) atsevišķā Verilog failā.&lt;br /&gt;
&lt;br /&gt;
=====Iesniegt=====&lt;br /&gt;
Iesniegt e-studijās: &lt;br /&gt;
* Verilog pirmkodu reģistru failam un tā testa modulim.&lt;br /&gt;
* PDF dokuments ar simulācijas rezultātiem un īsu pieredzes aprakstu.&lt;br /&gt;
&lt;br /&gt;
===MD_ALU===&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Aritmētiski loģiskā ierīce (ALU)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķi=====&lt;br /&gt;
* Izpētīt ISA un izstrādāt specifikāciju atbilstošam procesora ALU&lt;br /&gt;
* ALU izstrāde&lt;br /&gt;
&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
* Izstrādāt ALU kas atbilst RISCV R32I instrukciju kopai &lt;br /&gt;
* ALU nepieciešams nodrošināt sekojošu saskarni:&lt;br /&gt;
** A un B ir datu ievadda maģistrāles, 32 biti, vai ideāli, parametrizējamas.&lt;br /&gt;
** OUT ir rezultāts, arī datu maģistrāle&lt;br /&gt;
** OPCODE - ievads, ALU operācijas kods&lt;br /&gt;
** karodziņi, kas indicē:&lt;br /&gt;
*** V - Overflow&lt;br /&gt;
*** Z - Zero&lt;br /&gt;
*** N - Negative&lt;br /&gt;
*** C - Carry&lt;br /&gt;
* Demonstrēt iekārtas darbību vairākām instrukcijām, ar simulatoru (ISim)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Resursi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [https://www.cl.cam.ac.uk/teaching/1617/ECAD+Arch/files/docs/RISCVGreenCardv8-20151013.pdf RISCV reference card] - instrukciju tipi, kopsavilkums&lt;br /&gt;
* [https://inst.eecs.berkeley.edu/~cs61c/fa17/img/riscvcard.pdf RISCV Reference sheet] - instrukciju saraksts&lt;br /&gt;
* [https://riscv.org/technical/specifications/ RISCV specifikācijas protāls un dokumenti]&lt;br /&gt;
&lt;br /&gt;
=====Iesniegt=====&lt;br /&gt;
Iesniegt e-studijās: &lt;br /&gt;
* Verilog pirmkoda fails ar iekārtas dizainu.&lt;br /&gt;
* PDF dokuments ar simulācijas rezultātiem un īsu pieredzes aprakstu.&lt;br /&gt;
&lt;br /&gt;
===MD_CPU_v0===&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CPU prototips&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķis=====&lt;br /&gt;
Iepazīt instrukciju dekoderi un aritmētisko instrukciju datu plūsmu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
* Izstrādāt instrukciju dekoderi pēc RISC V R32I ISA Green card.&lt;br /&gt;
* Izstrādāt vienkāršu kontrolieri, kas tulko instrukciju operāciju kodus uz ALU operāciju kodiem, un reģistru faila WE (Write Enable) signālu.&lt;br /&gt;
* Izveidot prototipu CPU kas var izpildīt vienkāršas instrukcijas pa vienai.&lt;br /&gt;
&lt;br /&gt;
CPU prototipam (v0) jāsavieno reģistru fails, ALU un instrukciju dekoderis un operāciju kodu kontrolieris tā, lai būtu iespējams ieejā dot vienas instrukcijas 32 bitu kodu, un tā tiktu izpildīta, un rezultāts ierakstīts attiecīgajā reģistrā pēc CLK takts signāla augošās frontes.&lt;br /&gt;
&lt;br /&gt;
* Demonstrēt iekārtas darbību vairākām instrukcijām, ar simulatoru (ISim)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Resursi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* RISC V dokumentācija&lt;br /&gt;
&lt;br /&gt;
=====Iesniegt=====&lt;br /&gt;
Iesniegt e-studijās: &lt;br /&gt;
* Verilog pirmkoda faili ar iekārtas dizainu.&lt;br /&gt;
* PDF dokuments ar simulācijas rezultātiem un īsu pieredzes aprakstu.&lt;br /&gt;
&lt;br /&gt;
===MD_CPU_IC===&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CPU prototips ar instrukciju kešatmiņu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķis=====&lt;br /&gt;
Iepazīt instrukciju kešatmiņu un RISC V asemblera kompilāciju.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
* Izstrādāt instrukciju kešatmiņu, instrukciju reģistru, PC reģistru.&lt;br /&gt;
* Izveidot prototipu CPU kas var izpildīt vienkāršas instrukcijas no instrukciju atmiņas. Katrs takts signāls CLK ielasa un izpilda nākamo instrukciju.&lt;br /&gt;
* Izveidot vienkāršu RISC V asemblera programmu instrukciju testēšanai. Kompilēt to ar GNU AS kompilatoru.&lt;br /&gt;
* Instrukciju kešatmiņas modulim ielasīt kompilētu programmu (no teksta faila), Verilog kompilācijas solī.&lt;br /&gt;
&lt;br /&gt;
* Demonstrēt iekārtas darbību ar simulatoru (ISim)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Resursi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [https://riscv.org/technical/specifications/ RISC V dokumentācija]&lt;br /&gt;
* [https://github.com/riscv-non-isa/riscv-asm-manual/blob/master/riscv-asm.md RISC V Assembly manual]&lt;br /&gt;
* [https://www.cl.cam.ac.uk/teaching/1617/ECAD+Arch/files/docs/RISCVGreenCardv8-20151013.pdf RISC V Green card]&lt;br /&gt;
* [https://riscvasm.lucasteske.dev/# RiscV kompilators online]&lt;br /&gt;
&lt;br /&gt;
GNU asemblera kompilators RISC V arhitektūrai ir pieejams kā riscv64-linux-gnu-as.&lt;br /&gt;
Ar to ir iespējams kompilēt kodu 32 bitu arhitektūrai RV32i norādot attiecīgu arhitektūras parametru:&lt;br /&gt;
 riscv64-linux-gnu-as -march=rv32e -al test.s&lt;br /&gt;
&lt;br /&gt;
Tad kompilēto kodu iespējams dabūt no listinga (to apstrādājot), vai arī no kompilētā elf faila ar objdump.&lt;br /&gt;
&lt;br /&gt;
=====Iesniegt=====&lt;br /&gt;
Iesniegt e-studijās: &lt;br /&gt;
* Verilog un citi saistītie pirmkoda faili ar iekārtas dizainu.&lt;br /&gt;
* Testa programma asemblerā&lt;br /&gt;
* PDF dokuments ar simulācijas rezultātiem un īsu pieredzes aprakstu.&lt;br /&gt;
&lt;br /&gt;
===MD_CPU_DC===&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CPU prototips ar datu kešatmiņu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķis=====&lt;br /&gt;
Iepazīt datu kešatmiņu un saskarni ar operatīvo atmiņu.&lt;br /&gt;
&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
* Izstrādāt datu kešatmiņu.&lt;br /&gt;
* Izveidot prototipu CPU kas var izpildīt vienkāršas instrukcijas ar atmiņu, piemēram Load un Store.&lt;br /&gt;
* Izveidot vienkāršu RISC V asemblera programmu instrukciju testēšanai. Kompilēt to ar GNU AS kompilatoru.&lt;br /&gt;
* Demonstrēt iekārtas darbību ar simulatoru (ISim)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Resursi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [https://riscv.org/technical/specifications/ RISC V dokumentācija]&lt;br /&gt;
* [https://github.com/riscv-non-isa/riscv-asm-manual/blob/master/riscv-asm.md RISC V Assembly manual]&lt;br /&gt;
* [https://www.cl.cam.ac.uk/teaching/1617/ECAD+Arch/files/docs/RISCVGreenCardv8-20151013.pdf RISC V Green card]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Iesniegt=====&lt;br /&gt;
Iesniegt e-studijās: &lt;br /&gt;
* Verilog pirmkoda faili ar iekārtas dizainu.&lt;br /&gt;
* PDF dokuments ar simulācijas rezultātiem un īsu pieredzes aprakstu.&lt;br /&gt;
&lt;br /&gt;
===MD_CPU_Branch===&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CPU prototips ar Branch un Jump-and-link instrukciju realizāciju&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķis=====&lt;br /&gt;
Iepazīt Branch un Jump-and-link instrukciju darbības un dizaina principus.&lt;br /&gt;
&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
* Izstrādāt Branch instrukcijas saskaņā ar RISC V instrukciju kopu&lt;br /&gt;
** BEQ, BNE, BLT, BGE, BLTU, BGEU.&lt;br /&gt;
* Izstrādāt Jump-and-link instrukcijas saskaņā ar RISC V instrukciju kopu&lt;br /&gt;
** JAL, JALR&lt;br /&gt;
* Izveidot prototipu CPU kas var izpildīt vadības kontroles instrukcijas.&lt;br /&gt;
* Izveidot vienkāršu RISC V asemblera programmu instrukciju testēšanai. Kompilēt to ar GNU AS kompilatoru.&lt;br /&gt;
* Demonstrēt iekārtas darbību ar simulatoru (ISim)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Resursi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [https://riscv.org/technical/specifications/ RISC V dokumentācija]&lt;br /&gt;
* [https://github.com/riscv-non-isa/riscv-asm-manual/blob/master/riscv-asm.md RISC V Assembly manual]&lt;br /&gt;
* [https://www.cl.cam.ac.uk/teaching/1617/ECAD+Arch/files/docs/RISCVGreenCardv8-20151013.pdf RISC V Green card]&lt;br /&gt;
* [https://github.com/jameslzhu/riscv-card/blob/master/riscv-card.pdf RISC V unofficial Reference card]&lt;br /&gt;
&lt;br /&gt;
=====Iesniegt=====&lt;br /&gt;
Iesniegt e-studijās: &lt;br /&gt;
* Verilog pirmkoda faili ar iekārtas dizainu.&lt;br /&gt;
* PDF dokuments ar simulācijas rezultātiem un īsu pieredzes aprakstu.&lt;br /&gt;
&lt;br /&gt;
===MD_GPIO===&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Universāls perifērijas datu ievads un izvads (GPIO) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=====Mērķis=====&lt;br /&gt;
Iepazīt datu apmaiņas principus starp mikroprocesoru un perifērijas iekārtām.&lt;br /&gt;
&lt;br /&gt;
=====Uzdevums=====&lt;br /&gt;
* Izstrādāt moduļus pikrokontroliera ārējai iekārtai GPIO, kas spēj nodot un lasīt datus rakstot īpašā adresē.&lt;br /&gt;
** Ieslēgt un izslēgt 8 LED, kas kartēti uz vienu baitu atmiņā. Katram LED atbilst savs bits baitā.&lt;br /&gt;
** Nolasīt 8 slēdžu (Switch) stāvokļus lasot vienu baitu pēc konkrētas atmiņas adreses. Katram slēdzim atbilst savs bits baitā.&lt;br /&gt;
** Realizēt GPIO iekārtas saskarni caur baitu konkrētā adresē operatīvajā atmiņā. &lt;br /&gt;
*** 8 LED baita adrese: 0x40000000. Bita vērtība 0 nozīmē &amp;quot;izslēgts&amp;quot;, un 1 nozīmē ieslēgts. Šo baitu jāmāk ne tikai rakstīt bet arī lasīt.&lt;br /&gt;
*** 8 Slēdžu baita adrese: 0x40000004. Bita vērtība 0 nozīmē izslēgts, 1 nozīmē ieslēgts. Šo baitu var tikai lasīt. Rakstīšanai šajā adresē nav ietekmes.&lt;br /&gt;
*** ja tiek pievienoti vēl citi GPIO moduļi, adreses turpinās no 0x40000008, katra nākamā par vietu vārdu (4 baitiem) uz priekšu.&lt;br /&gt;
**** Papildus iespējams realizēt saskarni katram GPIO blokam ar diviem reģistriem: Datu virziena reģistru un Datu vērtības reģistru.&lt;br /&gt;
**** Rakstot datu virziena reģistrā biti 0 nozīmē lasīšana/ievads un 1 nozīmē rakstīšana/izvads&lt;br /&gt;
**** Datu vērtības reģistru var gan lasīt gan rakstīt.&lt;br /&gt;
**** Viena reģistra ietvaros dažādiem bitiem var būt dažādas funkcijas.&lt;br /&gt;
&lt;br /&gt;
* Dizainu organizēt tā, lai izveidotie GPIO moduļi var tikt pielietoti arī citām perifērijas iekārtām:&lt;br /&gt;
** Konfigurējot piekļuvi ārējām iekārtām caur UCF failu&lt;br /&gt;
** Integrējot citus iekšējos moduļus kas izstrādāti Verilog vai shēmtehnikā.&lt;br /&gt;
&lt;br /&gt;
* Integrēt GPIO jūsu CPU projektā.&lt;br /&gt;
* Izveidot vienkāršu RISC V asemblera programmu GPIO testēšanai. Kompilēt to ar GNU AS kompilatoru.&lt;br /&gt;
* Demonstrēt iekārtas darbību ar aparatūru.&lt;br /&gt;
&lt;br /&gt;
Piemēram var apskatīt GPIO organizāciju dažādu mikrokontrolieru dokumentācijā, piemēram Atmega328p.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Resursi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Atmega328p mikrokontroliera dokumentācija]&lt;br /&gt;
* [https://github.com/elomage/FPGA-resources/blob/main/ucf_templates/Anvyl.ucf UCF faila piemērs ANVYL attīstītājrīkam]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/General-purpose_input/output General purpose input/output] - Wikipedia&lt;br /&gt;
&lt;br /&gt;
=====Iesniegt=====&lt;br /&gt;
Iesniegt e-studijās: &lt;br /&gt;
* Verilog pirmkoda faili ar iekārtas dizainu.&lt;br /&gt;
* PDF dokuments ar rezultātiem un īsu pieredzes aprakstu.&lt;br /&gt;
&lt;br /&gt;
= Informācijas resursi =&lt;br /&gt;
&lt;br /&gt;
{{DIP_saites}}&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=LU-BST-b&amp;diff=11269</id>
		<title>LU-BST-b</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=LU-BST-b&amp;diff=11269"/>
		<updated>2026-05-12T18:45:43Z</updated>

		<summary type="html">&lt;p&gt;Leo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Īssaites:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
[[#Kalendārs | Kalendārs]] | &lt;br /&gt;
[[#Uzdevumi | Uzdevumi]] | &lt;br /&gt;
[[#Resursi | Resursi]] | &lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
{{TodayTomorrow}} (ja ir lekcija)&lt;br /&gt;
&lt;br /&gt;
{{LUDFKurss|Bezvadu Sensoru Tīkli|BST|DatZB043|2DAT3253}}&lt;br /&gt;
* Pasniedzējs: [[User:Leo | Leo Seļāvo]]&lt;br /&gt;
&lt;br /&gt;
====Kursa mērķis un uzdevumi====&lt;br /&gt;
Iepazīties ar bezvadu sensoru tīklu sistēmu darbības un projektēšanas principiem un pielietojumiem.&lt;br /&gt;
* Apgūt sensoru un iegulto sistēmu pamata tehnoloģijas un pielietojumus lietu internetā. &lt;br /&gt;
* Izstrādāt arhitektūru un komunikāciju protokolus bezvadu sensoru sistēmām. &lt;br /&gt;
* Programmēt iegultās sistēmas BST pielietojumam. &lt;br /&gt;
* Analizēt sensoru lasījumus un izdarīt secinājumus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Ievadlekcijas video&amp;#039;&amp;#039;&amp;#039;:&amp;lt;/big&amp;gt; [https://youtu.be/nwPxnED1M34 No sensoriem līdz stāstam]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Vērtējums kursā ====&lt;br /&gt;
* 30% Praktiskie darbi PD&lt;br /&gt;
* 20% Mājas darbi MD&lt;br /&gt;
* 20% Kontroldarbs KD&lt;br /&gt;
* 30% Projekta prezentācija un demo eksāmenā EKS + PROJ&lt;br /&gt;
&lt;br /&gt;
==== Mājas darbi ====&lt;br /&gt;
* Iesniedzami e-studijās&lt;br /&gt;
* Termiņš 30min pirms lekcijas sākuma, vai arī kā MD nosacījumos.&lt;br /&gt;
** Kavēts termiņš nozīmē -50% no vērtējuma. Pēc nedēļas darbs var tikt nepieņemts.&lt;br /&gt;
&lt;br /&gt;
==== Vidus semestra aptauja ====&lt;br /&gt;
* [https://docs.google.com/document/d/1XpUX_ZRIGsMSBrZpuO7KhmUn-x2emV3B/edit Aptauja]&lt;br /&gt;
&lt;br /&gt;
=Kalendārs=&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=4 style = &amp;#039;border-color: #ddd; background-color: #fdfff2;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
! Datums&lt;br /&gt;
! Tēma, saturs&lt;br /&gt;
! Uzdevumi&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
====4.02.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Ievadlekcija&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bezvadu sensoru tīklu pielietojumi un pamatproblēmas. BST kursa forma un prasības.&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/4iazzqk2ykmumsq/00_intro.pdf?raw=1 Ievads BST - slaidi]&lt;br /&gt;
* [https://www.dropbox.com/s/u5fnw7uku1ua1sf/00_Intro_IoT.pdf?raw=1 Ievads IoT - slaidi]&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD1 | PD1]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====11.02.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Bezvadu sakaru sistēmas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Radio spektrs un ISM josla. Komunikācijas protokoli un modulācija.&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/jujvdabdj03szif/L02_Wireless_systems.pdf?raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD2 | PD2]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====18.02.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Radio komunikāciju realitātes&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/scl/fi/fgqnlfpo7xurz5mm5atwj/03_radio-realities.pdf?rlkey=x54t0itxkbyuu0705ejoi3vry&amp;amp;st=mcy8s1hc&amp;amp;raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD3 | PD3]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====25.02.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Iegultās sistēmas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Sensoru mezgla uzbūve.&lt;br /&gt;
&lt;br /&gt;
[[BST-b_HW | Lekcijas pieraksti]]&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/kzcd4mr8mirh2i9/L03_motes.pdf?raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD4 | PD4]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====4.03.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;MAC protokoli sensoru tīklos&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/le4f7sywa528lnb/L05_Harvard_mac.pdf?raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD5 | PD5]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====11.03.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;(&amp;#039;&amp;#039;Attālināti&amp;#039;&amp;#039;) &amp;#039;&amp;#039;&amp;#039;KD0: Maršrutizācijas protokoli&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/u1y7n2www1y7vgu/L06_Routing.pdf?raw=1 Maršrutizācija. Slaidi]&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Uzdots: [[#MD_Routing|MD_Routing]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====18.03.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Laika sinhronizācija&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/8dmwkihq3gq4gls/L07_Timesync.pdf?raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[#PD6 | PD6 Multihop]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====25.03.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Lokalizācija&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* [http://selavo.lv/kursi/bst/09_localization.pdf Slaidi]&lt;br /&gt;
&lt;br /&gt;
Diskusijas par projektiem&lt;br /&gt;
|&lt;br /&gt;
Sensoru datu analīze, Jupyter notebook&lt;br /&gt;
* [https://jupyter.org Jupyter]&lt;br /&gt;
* [https://anaconda.org/anaconda/python Anaconda Python]&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====8.04.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Programmēšanas abstrakcijas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Komponenšu orientēta programmēšana. Skriptēta un enkapsulēta programmēšana. TinyOS, MansOS un SEAL.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lasāmviela&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://www.dropbox.com/s/xwnr2aterigjp7q/05_component-programming.pdf?raw=1 Komponenšu orientēta programmēšana, TinyOS]&lt;br /&gt;
* [https://www.dropbox.com/s/jalyp6jxv7b2ja6/12_prog-abstractions.pdf?raw=1 Programmēšanas abstrakcijas BST, Mate]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Iesniegt: [[#MD_Routing|MD_Routing]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Uzdots: [[#MD_Proj|MD_Proj]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====15.04.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;KD1&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Vidus semestra kontroldarbs KD1. Pieejams eStudijās.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====22.04.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Projektu tēmas&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Diskusija par projektu tēmām.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Use case&amp;quot; - par projektiem infekcijas risku mazināšanai.&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====29.04.26====&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Datu vizualizācija un analīze&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Datu vizualizācija un analīze.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====6.05.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Datu analīze, prakse&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lasāmviela&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://www.anaconda.com/ Anaconda platforma] datu zinātnei.&lt;br /&gt;
* [https://jupyter.org/ Jupyter Notebook] - vide mazām programmām Python un datu analīzei.&lt;br /&gt;
* [https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/ Jupyter triki]&lt;br /&gt;
&lt;br /&gt;
* [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6480280/ Wireless Sensor Networks for Big Data Systems]&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš: [[#MD_Proj|MD_Proj]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Projektu statuss&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====13.05.26====&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Drošība un privātums&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* [https://www.dropbox.com/scl/fi/5xkeow5yuaxobewhwrntr/13_security-privacy_v2.pdf?rlkey=w6papger2tw2to9l3kk7w344y&amp;amp;st=1sxvon1n&amp;amp;dl=1 Slaidi]&lt;br /&gt;
* Videolekcija e-studijās.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lasāmviela&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://cert.lv/lv CERT.lv] - IT drošības incidentu novēršanas institūcija Latvijā.&lt;br /&gt;
* [https://www.thalesgroup.com/en/markets/digital-identity-and-security/iot/magazine/internet-threats IoT Security Issues in 2021: a Business Perspective]&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Projekta statusa ziņojumi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====20.05.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Enerģijas ieguve no vides&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/lro0ncpw570neej/15_energy-harvesting.pdf?raw=1 Slaidi]&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Projekta statusa ziņojumi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====27.05.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Kopsavilkums&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [https://www.dropbox.com/s/qf5yd5toylks4zf/L99_Summary.pdf?raw=1 Slaidi]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Projektu statusa ziņojumi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
====xx.06.26====&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Eksāmens&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eksāmena sākums: xx:xx&lt;br /&gt;
Eksāmena vieta: xxx. aud.&lt;br /&gt;
&lt;br /&gt;
Eksāmena (projekta) rezultāti iesūtāmi e-studijās kā PROJ, tai skaitā:&lt;br /&gt;
* apraksts.pdf - apraksts: problēma, risinājumi, jūsu risinājums, rezultāti un pieredze izstrādājot un testējot projektu. Fails PDF formātā.&lt;br /&gt;
* plakāts.pdf - plakāts par projektu. Fails PDF formātā.&lt;br /&gt;
* Saite uz demonstrācijas video, ja tāds ir.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Eksāmens&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Iesniegt projekta rezultātus e-studijās.&lt;br /&gt;
* Prezentācija klātienē.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- TESTBED&lt;br /&gt;
=====================================&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;BST Testbed&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
EDI BST [[#Testbed | Testbed apraksts un lietojums]].&lt;br /&gt;
|&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Uzdots: [[#MD_Testbed|MD_Testbed-P1]] - Testbed P1 uzdevums&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
=====================================&lt;br /&gt;
|&lt;br /&gt;
{| width=&amp;#039;100%&amp;#039; style=&amp;#039;background-color:#ddd;&amp;#039;&lt;br /&gt;
|&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;Testbed&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Testbed prakse&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;#039;vertical-align: top;&amp;#039;&lt;br /&gt;
|&lt;br /&gt;
=====================================&lt;br /&gt;
* Termiņš: [https://doodle.com/poll/627utpttbvqiypue?utm_source=poll&amp;amp;utm_medium=link Pieteikt grupas MD_Testbed uzdevumiem]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš: [[#MD_Testbed|MD_Testbed-P1]] - Testbed P1 uzdevums&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Termiņš: [[#MD_Testbed|MD_Testbed]] - Visi uzdevumi&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Uzdevumi =&lt;br /&gt;
== Praktiskie darbi ==&lt;br /&gt;
Praktiskajos darbos būs lietojama [https://github.com/edi-riga/MansOS/wiki MansOS operētājsistēma].&lt;br /&gt;
* Īss apraksts un pamācības pieejamas [https://github.com/edi-riga/MansOS/wiki MansOS wiki].&lt;br /&gt;
&amp;lt;!--https://github.com/IECS/MansOS--&amp;gt;&lt;br /&gt;
Praktisko darbu risinājumi iesūtāmi e-studijās.&lt;br /&gt;
&lt;br /&gt;
===PD1===&lt;br /&gt;
&amp;quot;SOS&amp;quot; morzes ābecē izvadīts uz motes LED&lt;br /&gt;
* E-studijās iesūtīt C programmas kodu.&lt;br /&gt;
&lt;br /&gt;
===PD2===&lt;br /&gt;
Hello World -&amp;gt; no motes uz termināla&lt;br /&gt;
&lt;br /&gt;
===PD3===&lt;br /&gt;
Gaismas sensora lasījums uz termināla&lt;br /&gt;
&lt;br /&gt;
===PD4===&lt;br /&gt;
Darbs grupā pa divi.&lt;br /&gt;
&lt;br /&gt;
Gaismas sensora lasījums pārraidīts ar radio un saņemts uz citas motes un izvadīts uz termināla.&lt;br /&gt;
&lt;br /&gt;
Risinājumam jābūt noturīgam pret citiem raidītājiem šajā pašā radio kanālā. Jāparāda tikai sava risinājuma sūtītās ziņas.&lt;br /&gt;
&lt;br /&gt;
Iesūtīt pirmkodu, kā arī failu apraksts.pdf ar testu rezultātiem un to aprakstu.&lt;br /&gt;
&lt;br /&gt;
===PD5===&lt;br /&gt;
Darbs grupā pa divi.&lt;br /&gt;
&lt;br /&gt;
Noteikt radio raidīšanas attālumu TmoteSky motēm.&lt;br /&gt;
* Izveidot raidītāja programmu un uztvērēja programmu. &lt;br /&gt;
* Pārvietot motes dažādos attālumos un novērtēt, cik datu pakas tiek saņemtas.&lt;br /&gt;
* Izvērtēt, kāda ietekme ir motes savstarpējai orientācijai starp raidītāju un uztvērēju.&lt;br /&gt;
* Aprakstīt rezultātus un iesniegt PDF dokumentā apraksts.pdf, e-studijās, kā PD5.&lt;br /&gt;
&lt;br /&gt;
===PD6===&lt;br /&gt;
Darbs grupā pa diviem vai trijiem studentiem.&lt;br /&gt;
&lt;br /&gt;
Realizēt &amp;quot;Multihop&amp;quot; tīklu ar TmoteSky motēm.&lt;br /&gt;
* Izveidot programmatūru trīs dažādu sensoru mezglu tipiem, attiecīgos pirmkoda failos:&lt;br /&gt;
*# sensor.c - Sensors - nolasa gaismas sensora vērtību un nosūta pa radio Releja tipa motei.&lt;br /&gt;
*# relay.c - Relejs - mote, kas saņem datus no sensoriem un pārsūta tālāk citām motēm (Relejiem un Vārtejām).&lt;br /&gt;
*# gateway.c - Vārteja - mote, kas saņem radio datus un pārsūta tos uz seriālo portu (USB).&lt;br /&gt;
&lt;br /&gt;
* Katram mezglam (motei) ir unikāls ID. Izdomāt, kā to panākt.&lt;br /&gt;
* Tīklā jābūt vismaz vienam relejam, bet var būt vairāki, lai realizētu garāku komunikācijas ķēdi.&lt;br /&gt;
* Tīklā var būt vairāki Sensoru mezgli. &lt;br /&gt;
* Tīklā ir tikai viena vārteja.&lt;br /&gt;
* Relejam jāignorē tās ziņas, ko tas jau ir kādreiz sūtījis. Šo var realizēt ar motes identifikatora un/vai ziņas kārtas numura iekļaušanu sūtāmajā datu pakā. Tad, piemēram, mote var ignorēt vecākas datu pakas nekā pēdējā, ko tā ir sūtījusi.&lt;br /&gt;
* Vārtejai katra datu paka jānosūta pa USB tikai vienreiz. Ja tā, piemēram, saņem to pašu datu paku atkārtoti, piemēram, no cita Releja, tai tā jāignorē.&lt;br /&gt;
&lt;br /&gt;
* Aprakstīt rezultātus un iesniegt PDF dokumentā apraksts.pdf, e-studijās, kā PD6. Iesniegt arī programmatūras kodu.&lt;br /&gt;
&lt;br /&gt;
==Mājas darbi==&lt;br /&gt;
===MD_Routing===&lt;br /&gt;
Izstrādāt un aprakstīt maršrutizācijas algoritmu, kas atbilst prasībām &lt;br /&gt;
[https://www.dropbox.com/s/yakqcy9e8322tbf/BST_routing_MD.pdf?raw=1 šajos slaidos]&lt;br /&gt;
&lt;br /&gt;
* Aprakstīt izveidoto maršrutizācijas protokolu.&lt;br /&gt;
* Aprakstīt protokola veiktspējas novērtējumu.&lt;br /&gt;
* Sniegt piemēru, kā tas darbojas slaidos dotajā situācijā.&lt;br /&gt;
* Risinājumu iesniegt PDF dokumentā, e-studijās.&lt;br /&gt;
&lt;br /&gt;
===MD1===&lt;br /&gt;
[[#PD5 | PD5]] rezultāti - Izvērtēt sensoru mezglu komunikāciju veiktspēju atkarībā no distances.&lt;br /&gt;
&lt;br /&gt;
Gadījumā, ja jums neizdevās savākt savus datus, tad analīzei var lietot šos, ar attiecīgu atsauci:&lt;br /&gt;
* [https://www.dropbox.com/s/gd434p1wkgcq9gz/merijumi_veldre_kniss.xlsx?dl=1 | Dati1 (excel)] (Rainers, Juris)&lt;br /&gt;
* [https://www.dropbox.com/s/h679d2y84svixs1/BST_PD05_DATA_Audris.zip?dl=1 | Dati2 (zip)] (Audris, Madara)&lt;br /&gt;
&lt;br /&gt;
===MD3===&lt;br /&gt;
Izstrādāt un aprakstīt virtuālas mašīnas valodu bezvadu sensoru mezgliem, līdzīgi kā &lt;br /&gt;
[https://www.dropbox.com/s/pw8hl4zbsbgek65/L09b_prog-abstractions.pdf?raw=1 Mate lekcijas slaidos]. &lt;br /&gt;
&lt;br /&gt;
Aprakstā jāiekļauj: &lt;br /&gt;
* Valodas komandas, arhitektūra, pieņēmumi&lt;br /&gt;
* Komandu kodējums (pa bitiem), komandu tipi vai klases.&lt;br /&gt;
* Divi piemēri programmām, kas kodēti jūsu valodā.&lt;br /&gt;
* Ar ko jūsu risinājums atšķiras no Mate un kādos gadījumos tam ir priekšrocības.&lt;br /&gt;
&lt;br /&gt;
===MD_Proj===&lt;br /&gt;
====Kursa projekta pieteikums====&lt;br /&gt;
&lt;br /&gt;
=====Īss apraksts=====&lt;br /&gt;
&lt;br /&gt;
Izstrādāt projekta pieteikumu, kurā aprakstīt:&lt;br /&gt;
* Problēmu, ko risināsiet ar bezvadu sensoru tīklu palīdzību&lt;br /&gt;
* Motivāciju, kāpēc problēma jārisina&lt;br /&gt;
* Esošos risinājumus šai problēmai vai līdzīgām problēmām&lt;br /&gt;
* Kas nepieciešams jūsu risinājumam: tehnoloģijas, aparatūra&lt;br /&gt;
* Termiņi katrai nedēļai: kas tiks veikts līdz šiem termiņiem projekta izstrādes gaitā.&lt;br /&gt;
&lt;br /&gt;
Aprakstu organizēt kā slaidus, lai ērti prezentēt. Iesniegt aprakstu PDF formātā.&lt;br /&gt;
&lt;br /&gt;
=====Sīkāks apraksts=====&lt;br /&gt;
&lt;br /&gt;
Šoreiz nekas nav jāprogrammē. Bet gan jāuzraksta sava kursa projekta īss apraksts kā slaidu prezentācija un jāiesniedz PDF formātā.&lt;br /&gt;
Kursa projekta pieteikumu būs iespējams prezentēt lekcijas laikā, lai pārrunātu ar kolēģiem. &lt;br /&gt;
&lt;br /&gt;
Obligātās dokumenta nodaļas:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Projekta tēma&amp;#039;&amp;#039;&amp;#039;. Kas ir Jūsu projekts, ko Jūs izstrādāsiet. Šeit var pietikt ar vienu vai dažiem teikumiem&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Projekta komanda&amp;#039;&amp;#039;&amp;#039;, īpaši ja nepieciešams vairāk par vienu dalībnieku. Kas piedalās, kādas lomas katrs izpilda (kurš ko programmēs, kurš projektēs, kurš testēs utt)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Motivācija&amp;#039;&amp;#039;&amp;#039;. Kāpēc Jūs šādu projektu taisāt. Kāds no tā varētu būt labums Jums un pārējiem apkārtējiem cilvēkiem, dabai.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Jūsu pieeja un arhitektūra&amp;#039;&amp;#039;&amp;#039;. Kā realizēsiet projektu. Kāda būs izmantotā aparatūra. Kāda programmatūra. Kāda būs tīkla struktūra. Šeit labi iederas sistēmas arhitektūras bildes, shematiski attēlojumi. Svarīgi norādīt arī nepieciešamo aparatūru, tai skaitā, kādi sensori nepieciešami projekta realizēšanai. Lai varam sākt meklēt nepieciešamos sensorus, motes. Tiek sagaidīts, ka šī ir saturīgākā projekta apraksta daļa.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sagaidāmais rezultāts&amp;#039;&amp;#039;&amp;#039;. Cik daudz no savas projekta idejas plānojat šī semestra laikā realizēt. Kādus testus veikt. Kā novērtēsit rezultātus.&lt;br /&gt;
&lt;br /&gt;
Papildus tēmas:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kas šajā tēmā pasaulē ir jau izdarīts&amp;#039;&amp;#039;&amp;#039;. Bakalaura studentiem netiek prasīts izdarīt kaut ko universālu, kas pasaulē vēl neeksistē. Tai pat laikā, ir ļoti vēlams, ka veicat izpēti, par to, kas pasaulē Jūsu tēmā ir jau izpildīts. Kaut vai tāpēc, lai izvēlētos labāko risinājumu, lai nav pašiem jāizdomā no nulles&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Idealizācija&amp;#039;&amp;#039;&amp;#039;. Šī projekta ietvaros netiek prasīts, lai Jūs uzbūvējat vispasaules sensoru tīklu ar Google mēroga infrastruktūru. Bet, ja tas būtu iespējams - ko ar Jūsu sensoru tīklu varētu izdarīt? T.i., padomājiet arī pāri sava viena semestra robežām!&lt;br /&gt;
&lt;br /&gt;
===MD_Testbed===&lt;br /&gt;
Uzdevuma veikšana EDI testbed platformā (Testbed).&lt;br /&gt;
&lt;br /&gt;
Pieslēguma informācija Testbed platformai tiks paziņota individuāli, lekcijā un/vai e-studijās.&lt;br /&gt;
&lt;br /&gt;
Uzdevums ir ievākt informāciju no Testbed sensoriem kas atrodas uz jums izdalītajiem Testbed sensoru mezgliem pēc iespējas ilgāku laika posmu, vismaz 24 stundas, un attēlot datus grafiski. Sīkāks uzdevumu apraksts seko.&lt;br /&gt;
&lt;br /&gt;
====Programma P1====&lt;br /&gt;
Programmas P1 mērķis ir pārbaudīt Testbed darbību un nolasīt log failos saglabātos datus.&lt;br /&gt;
&lt;br /&gt;
* Pieslēgties Testbed &lt;br /&gt;
* Pārbaudīt jums izdalīto sensoru mezglu darbību izveidojot vienkāršu programmu &amp;lt;code&amp;gt;P1.c&amp;lt;/code&amp;gt; kas sūta skaitļus no 1 līdz 100 ar vienas sekundes intervālu uz seriālo portu. Skaitļus sūtīt kā simbolu virkni salasāmā tekstā, piemēram &amp;quot;17&amp;quot;.&lt;br /&gt;
* Darbināt P1 uz visiem sensoru mezgliem vienlaicīgi. Darbināt eksperimentu 10min. Saglabāt Log failus.&lt;br /&gt;
* Novērtēt rezultātus. Piemēram, vai visi sensori darbojās vienlīdz ātri?&lt;br /&gt;
&lt;br /&gt;
====Programma P2====&lt;br /&gt;
Programmas P2 mērķis ir ievākt sensoru datus ilgākā laika posmā.&lt;br /&gt;
&lt;br /&gt;
* Izveidot programmu &amp;lt;code&amp;gt;P2.c&amp;lt;/code&amp;gt; kas reizi 10 sekundēs nolasa sensoru vērtības. &lt;br /&gt;
* Lasāmie sensori ir: Gaismas sensors, temperatūra un gaisa mitrums.&lt;br /&gt;
* Darbināt P2 24 stundas un saglabāt datus Log failos.&lt;br /&gt;
* Analizēt sensoru datus. Uzzīmēt datus grafikā ar x kā laika asi un y kā mērījumu asi. Izdarīt secinājumus.&lt;br /&gt;
&lt;br /&gt;
====Programma P3====&lt;br /&gt;
Programmas P3 mērķis ir novērtēt komunikāciju iespējas Testbed vidē.&lt;br /&gt;
&lt;br /&gt;
* Izveidot programmu &amp;lt;code&amp;gt;P3_send.c&amp;lt;/code&amp;gt;, kas sūta 300 ziņas visiem citiem mezgliem ik pa 100 milisekundēm. Katrā ziņā iekļaut tās kārtas numuru. Datos iekļaut arī savu identifikatoru, lai saņemošais klients var atpazīt datu pakas tipu un mērķi.&lt;br /&gt;
* Izveidot programmu &amp;lt;code&amp;gt;P3_receive.c&amp;lt;/code&amp;gt;, kas saņem ziņas pa radio no citiem mezgliem un pieraksta RSSI vērtības atmiņas buferī. Kad visas atsūtītas, eksportēt datus uz log failu caur seriālo portu.&lt;br /&gt;
* Darbināt P3_send uz viena mezgla un P3_receive uz pārējiem. Saglabāt datus log failā.&lt;br /&gt;
* Atkārtot iepriekšējo eksperimentu tā, lai datu būtu sūtīti no visiem mezgliem.&lt;br /&gt;
* Rezultātā jums jābūt datiem kas apraksta komunikāciju starp jebkuriem diviem mezgliem.&lt;br /&gt;
* Rezultātu analīzē parādiet kā RSSI mainās laikā starp visiem mezgliem. Bez tam, izveidojiet tabulu vai grafu kurā novērtējiet komunikāciju/ saņemtā signāla stiprumu starp visiem mezgliem. Atcerieties, ka saites var būt arī asimetriskas, piemēram, mezgls A &amp;quot;dzird&amp;quot; mezglu B labāk nekā B &amp;quot;dzird&amp;quot; A.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Piezīmes&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Ņemiet vērā, ka var gadīties, ka dažas ziņas mezgli var nesaņemt trokšņu vai citu iemeslu dēļ. Datos tas ir jāredz. Tāpēc saglabājot RSSI jāņem vērā arī saņemtās ziņas kārtas numurs, ko tā sūtīja.&lt;br /&gt;
* Saņemtos RSSI rādījumus jums jāglabā atmiņā, lai tie aizņemtu pēc iespējas mazāk vietas. Sūtot tos uz reizi pa seriālo portu jums var nepietikt laika saņemt visas ziņas. Tāpēc ieteicams datus saglabāt ar seriālo portu tikai pēc tam kad eksperiments beidzies - pēdēja ziņa saņemta (vai nav pienākusi, bet laiks pagājis).&lt;br /&gt;
&lt;br /&gt;
====Iesniegšana====&lt;br /&gt;
Iesniegt rezultātus visiem uzdevumiem e-studijās kā MD_Testbed. &lt;br /&gt;
Tai skaitā, katram uzdevumam P&amp;#039;&amp;#039;X&amp;#039;&amp;#039;, kur &amp;#039;&amp;#039;X&amp;#039;&amp;#039; ir 1, 2 un 3:&lt;br /&gt;
&lt;br /&gt;
* Katram uzdevumam P1, P2 un P3 izveidot direktoriju ar attiecīgu vārdu. Šajās direktorijās izvietot attiecīgo uzdevumu pirmkoda, datu un apraksta failus.&lt;br /&gt;
* Iekopēt direktorijās visu pirmkodu un ievākto datu failus&lt;br /&gt;
* Analīzes rezultātus aprakstīt un grafikus attēlot PDF failā ar nosaukumu P&amp;#039;&amp;#039;X&amp;#039;&amp;#039;.pdf&lt;br /&gt;
* Neaizmirstiet aprakstā norādīt darba autorus un ko katrs darījis, kā arī katra dalībnieka procentuālo ieguldījumu no komandas darba.&lt;br /&gt;
* Visus failus arhivēt kā zip failu un saukt BST_MD_Testbed_Vards_Uzvards.zip, kur, protams, lietots &amp;#039;&amp;#039;jūsu&amp;#039;&amp;#039; vārds un uzvārds.&lt;br /&gt;
* Zip fails jāiesūta e-studijās VISIEM komandas dalībniekiem.&lt;br /&gt;
&lt;br /&gt;
=Testbed=&lt;br /&gt;
&lt;br /&gt;
EDI BST testa vides piekļuve un lietošana.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lasāmviela&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Qy32wqh3W4ki808hN_FUTMHURcO1F6St3nwovtZLLNQ/edit?usp=sharing Lietošanas pamācība]&lt;br /&gt;
* [https://www.edi.lv/testbed EDI Testbed] portāls&lt;br /&gt;
* Testbed CLI komandu [https://www.dropbox.com/s/gse78nkox8eo523/EDI%20TestBed%20CLI%20cheat%20sheet%202021.pdf?raw=1 Cheatsheet]&lt;br /&gt;
* [https://www.dropbox.com/s/efsx8380cy4y366/EDI_TestBed_CLI_intro_2021.pdf?raw=1 EDI Testbed Prezentācija]&lt;br /&gt;
* Demonstrācijas video pieejams eStudijās&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CLI klientu programmatūra&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** [https://makonis.edi.lv/s/PtomG54z8i7ozJp Linux]&lt;br /&gt;
** [https://makonis.edi.lv/s/bBAzoknjX23WfPS Windows]&lt;br /&gt;
&lt;br /&gt;
Publikācijas&lt;br /&gt;
* [https://www.researchgate.net/publication/236735509_Wireless_Sensor_Network_Testbeds_A_Survey Wireless Sensor Network Testbeds: A Survey]&lt;br /&gt;
&lt;br /&gt;
= Resursi =&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/edi-riga/MansOS/wiki &amp;#039;&amp;#039;&amp;#039;MansOS&amp;#039;&amp;#039;&amp;#039; operētājsistēma]&lt;br /&gt;
** [[MansOS msp430 procesora rīku instalācija ar Docker]]&lt;br /&gt;
&lt;br /&gt;
* [http://www.catb.org/esr/structure-packing/ The Lost Art of Structure Packing]&lt;br /&gt;
* Grāmata: [https://ptolemy.berkeley.edu/books/leeseshia/ Introduction to Embedded Systems - A Cyber-Physical Systems Approach]&lt;br /&gt;
* [[LU::poster-howto | Ieteikumi plakātu prezentāciju veidošanā]]&lt;br /&gt;
&lt;br /&gt;
* [https://towardsdatascience.com/top-30-data-science-interview-questions-7dd9a96d3f5c Datu zinātne] - 30 intervijas jautājumi&lt;br /&gt;
&lt;br /&gt;
* [https://google.github.io/mediapipe/ Mediapipe] - attēlu apsrādes bibliotēka&lt;br /&gt;
&lt;br /&gt;
== Aparatūra, sensori ==&lt;br /&gt;
* [[DiLab_resursi]] - LU pieejamie sensori un aparatūra&lt;br /&gt;
&lt;br /&gt;
== Saites ==&lt;br /&gt;
* [[LU-BST:links | Bezvadu sensoru tīklu saites]]&lt;br /&gt;
* [https://www.sqimway.com/index.html Bezvadu komunikācijas veidi un frekvences]&lt;br /&gt;
* [http://ss64.com/bash Linux komandu rokasgrāmata]. Komandas, kas mums būs noderīgas: cd, ls, cp, mv, mkdir, df, echo, export, find, grep, less, nano, make, man, ping, rm, ifconfig.&lt;br /&gt;
* [[LU-BST:SwissQM | Kā piedarbināt SwissQM virtuālo mašīnu sensoru tīkliem]] (Paldies Kārlim Visendorfam par aprakstu!)&lt;br /&gt;
* [https://www.ibr.cs.tu-bs.de/dus/publications/spots2006.pdf uPart mote un tās īpašības]&lt;br /&gt;
&lt;br /&gt;
== Interesanti ==&lt;br /&gt;
* [https://www.sparkfun.com/news/6147 Hedy Lamarr and Frequency Hopping Technology] - Holivudas aktrise un FH patenta autore.&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
	<entry>
		<id>http://andromeda.df.lu.lv/wiki/index.php?title=ISE_14.7_instal%C4%81cija&amp;diff=11268</id>
		<title>ISE 14.7 instalācija</title>
		<link rel="alternate" type="text/html" href="http://andromeda.df.lu.lv/wiki/index.php?title=ISE_14.7_instal%C4%81cija&amp;diff=11268"/>
		<updated>2026-05-07T11:13:53Z</updated>

		<summary type="html">&lt;p&gt;Leo: /* Instalē atbalsta bibliotēkas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Īsumā =&lt;br /&gt;
&amp;#039;&amp;#039;(Šis ir izmēģināts ar Ubuntu 22.04)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== Lejuplādē ====&lt;br /&gt;
** ISE instalāciju iespējams lejuplādēt no [https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/archive-ise.html Xilinx arhīva web portāla], kurā nepieciešams šim nolūkam izveidot kontu.&lt;br /&gt;
&lt;br /&gt;
==== Instalē atbalsta bibliotēkas ====&lt;br /&gt;
&lt;br /&gt;
 sudo apt install libncurses5&lt;br /&gt;
&lt;br /&gt;
Jaunākai sistēmai (Ubuntu 26+), kur libncurses5 nomainījusi libncurses6, var mēģināt:&lt;br /&gt;
 sudo ln -s /usr/lib/x86_64-linux-gnu/libncurses.so.6 /usr/lib/x86_64-linux-gnu/libncurses.so.5&lt;br /&gt;
&lt;br /&gt;
==== Instalē ISE ====&lt;br /&gt;
No atarhivētās direktorijas&lt;br /&gt;
 sudo chmod a+x xsetup&lt;br /&gt;
 sudo ./xsetup&lt;br /&gt;
&lt;br /&gt;
Seko instalācijai &lt;br /&gt;
* Piekrīt licensēm&lt;br /&gt;
* Uncheck &amp;quot;Install cable drivers&amp;quot;&lt;br /&gt;
* Izvēlas WebPack (vai System edition pilnai versijai)&lt;br /&gt;
* Instalācijas vieta: /opt/Xilinx&lt;br /&gt;
* Licensi, ko saņem no Xilinx, tai skaitā studentu brīvo licensi, vai pielikt arī vēlāk.&lt;br /&gt;
&lt;br /&gt;
Izmēģina&lt;br /&gt;
 Uztaisam skriptu ise.sh palaišanai:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /opt/Xilinx/14.7/ISE_DS&lt;br /&gt;
 . ./settings64.sh&lt;br /&gt;
&lt;br /&gt;
Pieliek taciņas&lt;br /&gt;
 export PATH=$PATH:/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64&lt;br /&gt;
 ise&lt;br /&gt;
&lt;br /&gt;
==== Instalē Digilent Adept ====&lt;br /&gt;
Priekš ANVYL un jaunākiem attīstītājrīkiem&lt;br /&gt;
* Runtime&lt;br /&gt;
* Utilities&lt;br /&gt;
&lt;br /&gt;
= Papildus info =&lt;br /&gt;
Xilinx ISE Webpack versija 14.7 (Windows 7, nevis Windows 10) ir pēdējā versija, kas vēl atbalsta Spartan 3E FPGA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[ISE WebPACK 14.7 USB driver]] instalācija (vecākiem Spartan 3E rīkiem)&lt;br /&gt;
* Jaunākiem (ANVYL) rīkem - [https://digilent.com/reference/software/adept/start Digilent Adept] jāinstallē Utilities un Runtime&lt;br /&gt;
Papildus:&lt;br /&gt;
* [https://www.xilinx.com/support/answers/59128.html Digilent driver installation] (no Xilinx portāla)&lt;br /&gt;
* [http://dreamrunner.org/blog/2012/09/12/install-xilinx-ise-on-the-ubuntu/ Install Xilinx ISE on Ubuntu] (learn&amp;amp;think)&lt;br /&gt;
* [https://www.george-smart.co.uk/fpga/xilinx_jtag_linux/ Install Linux ISE] (George Smart)&lt;br /&gt;
&lt;br /&gt;
* [https://www.programmersought.com/article/24731802295/ ISE instalācija uz Ubuntu 18]&lt;/div&gt;</summary>
		<author><name>Leo</name></author>
		
	</entry>
</feed>