[RFC] Add a dialect for SystemC emission (#3520)

This commit is contained in:
Martin Erhart 2022-07-19 17:14:36 +02:00 committed by GitHub
parent 2c9f23f16a
commit ae3d1acd19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 889 additions and 235 deletions

View File

@ -0,0 +1,118 @@
# SystemC Dialect Rationale
This document describes various design points of the SystemC dialect, why they
are the way they are, and current status. This follows in the spirit of other
[MLIR Rationale docs](https://mlir.llvm.org/docs/Rationale/).
- [SystemC Dialect Rationale](#systemc-dialect-rationale)
- [Introduction](#introduction)
- [Lowering](#lowering)
- [Q&A](#qa)
## Introduction
[SystemC](https://en.wikipedia.org/wiki/SystemC) is a library written in C++
to allow functional modeling of systems. The included event-driven simulation
kernel can then be used to simulate a system modeled entirely in SystemC.
Additionally, SystemC is a standard (IEEE Std 1666-2011) supported by several
tools (e.g., Verilator) and can thus be used as an interface to such tools as
well as between multiple systems that are internally using custom
implementations.
Enabling CIRCT to emit SystemC code provides another way (next to Verilog
emission) to interface with the outside-world and at the same time
provides another way to simulate systems compiled with CIRCT.
## Lowering
In a first step, lowering from [HW](https://circt.llvm.org/docs/Dialects/HW/)
to the SystemC dialect will be implemented. A tool called ExportSystemC,
which is analogous to ExportVerilog, will then take these SystemC and
[Comb](https://circt.llvm.org/docs/Dialects/Comb/) operations to emit proper
SystemC-C++ code that can be compiled using clang, GCC, or any other
C++-compiler to produce the simulator binary. In the long run support for more
dialects can be added, such as LLHD and SV.
As a simple example we take a look at the following HW module which just adds
two numbers together:
```mlir
hw.module @adder (%a: i32, %b: i32) -> (c: i32) {
%sum = comb.add %a, %b : i32
hw.output %sum : i32
}
```
It will then be lowered to the following SystemC IR to make code emission
easier for ExportSystemC:
```mlir
systemc.module @adder(%a: i32, %b: i32) -> (%c: i32) {
systemc.ctor {
systemc.method @add
}
systemc.func @add() {
// c = a + b
%res = comb.add %a, %b : i32
systemc.con %c, %res : i32
}
}
```
ExportSystemC will then emit the following C++ code to be compiled by clang or
another C++-compiler:
```cpp
#ifndef ADDER_H
#define ADDER_H
#include <systemc.h>
SC_MODULE(adder) {
sc_in<sc_uint<32>> a;
sc_in<sc_uint<32>> b;
sc_out<sc_uint<32>> c;
SC_CTOR(adder) {
SC_METHOD(add);
}
void add() {
c = a + b;
}
};
#endif // ADDER_H
```
## Q&A
**Q: Why implement a custom module operation rather than using `hw.module`?**
In SystemC we want to model module outputs as arguments such that the SSA value
is already defined from the beginning which we can then assign to and reference.
**Q: Why implement a custom func operation rather than using `func.func`?**
An important difference compared to the `func.func` operation is that it
represents a member function (method) of a SystemC module, i.e., a C++ struct.
This leads to some implementation differences:
* Not isolated from above: we need to be able to access module fields such as
the modules inputs, outputs, and signals
* Verified to have no arguments and void return type: this is a restriction
from SystemC for the function to be passed to SC_METHOD, etc. This could
also be achieved with `func.func`, but would require us to write the verifier
in `systemc.module` instead.
* Region with only a single basic block (structured control flow) and no
terminator: using structured control-flow leads to easier code emission
**Q: How much of C++ does the SystemC dialect aim to model?**
As much as necessary, as little as possible. Completely capturing C++ in a
dialect would be a huge undertaking and way too much to 'just' achieve SystemC
emission. At the same time, it is not possible to not model any C++ at all,
because when only modeling SystemC specific constructs, the gap for
ExportSystemC to bridge would be too big (we want the printer to be as simple
as possible).

View File

@ -0,0 +1,3 @@
# 'systemc' Dialect
[include "Dialects/SystemC.md"]

View File

@ -30,6 +30,7 @@ digraph G {
ESI [URL="https://circt.llvm.org/docs/Dialects/ESI/"]
FSM [URL="https://circt.llvm.org/docs/Dialects/FSM/"]
HWArith [URL="https://circt.llvm.org/docs/Dialects/HWArith/"]
SystemC [URL="https://circt.llvm.org/docs/Dialects/SystemC/"]
// Invisible node to make space for RTL cluster's incoming edges.
space_above_RTL [style = invis, label=""]
@ -46,7 +47,7 @@ digraph G {
// Internal tools
subgraph internal_tools{
node [fillcolor="#fdc086"]
FIRRTLParser llhd_sim
FIRRTLParser llhd_sim ExportSystemC
ExportVerilog [URL="https://circt.llvm.org/docs/VerilogGeneration/"]
PyCDE [URL="https://circt.llvm.org/docs/PyCDE/"]
Scheduling [URL="https://circt.llvm.org/docs/Scheduling/"]
@ -90,12 +91,15 @@ digraph G {
Seq -> SV
HW -> LLHD
Comb -> ExportVerilog
HW -> SystemC
// Tool flows
Scheduling -> StaticLogic [dir=both]
Chisel -> FIRFile
FIRFile -> FIRRTLParser
FIRRTLParser -> FIRRTL
{SystemC, Comb} -> ExportSystemC
ExportSystemC -> CPPFile
{HW SV} -> ExportVerilog
SVVHDL -> Moore [weight=999]
Moore -> LLHD

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 159 KiB

View File

@ -4,78 +4,78 @@
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: G Pages: 1 -->
<svg width="639pt" height="833pt"
viewBox="0.00 0.00 638.87 833.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg width="672pt" height="833pt"
viewBox="0.00 0.00 671.93 833.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 829)">
<title>G</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-829 634.87,-829 634.87,4 -4,4"/>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-829 667.93,-829 667.93,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_mlir</title>
<polygon fill="none" stroke="black" points="8,-726 8,-817 326,-817 326,-726 8,-726"/>
<text text-anchor="middle" x="167" y="-801.8" font-family="Times,serif" font-size="14.00">Upstream MLIR</text>
<polygon fill="none" stroke="black" points="109.5,-726 109.5,-817 427.5,-817 427.5,-726 109.5,-726"/>
<text text-anchor="middle" x="268.5" y="-801.8" font-family="Times,serif" font-size="14.00">Upstream MLIR</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_std_arith_dialect</title>
<polygon fill="none" stroke="black" points="150,-734 150,-786 318,-786 318,-734 150,-734"/>
<polygon fill="none" stroke="black" points="251.5,-734 251.5,-786 419.5,-786 419.5,-734 251.5,-734"/>
</g>
<g id="clust3" class="cluster">
<title>cluster_circt</title>
<polygon fill="none" stroke="black" points="57,-136 57,-718 468,-718 468,-136 57,-136"/>
<text text-anchor="middle" x="262.5" y="-702.8" font-family="Times,serif" font-size="14.00">CIRCT</text>
<polygon fill="none" stroke="black" points="80.5,-136 80.5,-718 494.5,-718 494.5,-136 80.5,-136"/>
<text text-anchor="middle" x="287.5" y="-702.8" font-family="Times,serif" font-size="14.00">CIRCT</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_RTL</title>
<polygon fill="none" stroke="black" points="164,-208 164,-355 374,-355 374,-208 164,-208"/>
<text text-anchor="middle" x="269" y="-339.8" font-family="Times,serif" font-size="14.00">RTL dialects</text>
<polygon fill="none" stroke="black" points="172.5,-208 172.5,-355 382.5,-355 382.5,-208 172.5,-208"/>
<text text-anchor="middle" x="277.5" y="-339.8" font-family="Times,serif" font-size="14.00">RTL dialects</text>
</g>
<!-- SCF -->
<g id="node1" class="node">
<title>SCF</title>
<polygon fill="#beaed4" stroke="black" points="70,-778 16,-778 16,-742 70,-742 70,-778"/>
<text text-anchor="middle" x="43" y="-756.3" font-family="Times,serif" font-size="14.00">SCF</text>
<polygon fill="#beaed4" stroke="black" points="171.5,-778 117.5,-778 117.5,-742 171.5,-742 171.5,-778"/>
<text text-anchor="middle" x="144.5" y="-756.3" font-family="Times,serif" font-size="14.00">SCF</text>
</g>
<!-- Calyx -->
<g id="node6" class="node">
<title>Calyx</title>
<g id="a_node6"><a xlink:href="https://circt.llvm.org/docs/Dialects/Calyx/" xlink:title="Calyx">
<polygon fill="white" stroke="black" points="137,-543 81,-543 81,-507 137,-507 137,-543"/>
<text text-anchor="middle" x="109" y="-521.3" font-family="Times,serif" font-size="14.00">Calyx</text>
<polygon fill="white" stroke="black" points="244.5,-543 188.5,-543 188.5,-507 244.5,-507 244.5,-543"/>
<text text-anchor="middle" x="216.5" y="-521.3" font-family="Times,serif" font-size="14.00">Calyx</text>
</a>
</g>
</g>
<!-- SCF&#45;&gt;Calyx -->
<g id="edge1" class="edge">
<title>SCF&#45;&gt;Calyx</title>
<path fill="none" stroke="black" d="M43.37,-741.9C44.62,-709.04 50.1,-635.34 74,-579 78.03,-569.51 83.78,-559.88 89.47,-551.48"/>
<polygon fill="black" stroke="black" points="92.38,-553.41 95.29,-543.23 86.66,-549.38 92.38,-553.41"/>
<path fill="none" stroke="black" d="M145.35,-741.78C147.56,-708.73 155.27,-634.71 181.5,-579 185.89,-569.67 191.75,-560.09 197.41,-551.68"/>
<polygon fill="black" stroke="black" points="200.33,-553.6 203.17,-543.4 194.58,-549.61 200.33,-553.6"/>
</g>
<!-- Affine -->
<g id="node2" class="node">
<title>Affine</title>
<polygon fill="#beaed4" stroke="black" points="142,-778 84,-778 84,-742 142,-742 142,-778"/>
<text text-anchor="middle" x="113" y="-756.3" font-family="Times,serif" font-size="14.00">Affine</text>
<polygon fill="#beaed4" stroke="black" points="243.5,-778 185.5,-778 185.5,-742 243.5,-742 243.5,-778"/>
<text text-anchor="middle" x="214.5" y="-756.3" font-family="Times,serif" font-size="14.00">Affine</text>
</g>
<!-- StaticLogic -->
<g id="node8" class="node">
<title>StaticLogic</title>
<g id="a_node8"><a xlink:href="https://circt.llvm.org/docs/Dialects/StaticLogic/" xlink:title="StaticLogic">
<polygon fill="white" stroke="black" points="177.5,-615 80.5,-615 80.5,-579 177.5,-579 177.5,-615"/>
<text text-anchor="middle" x="129" y="-593.3" font-family="Times,serif" font-size="14.00">StaticLogic</text>
<polygon fill="white" stroke="black" points="285,-615 188,-615 188,-579 285,-579 285,-615"/>
<text text-anchor="middle" x="236.5" y="-593.3" font-family="Times,serif" font-size="14.00">StaticLogic</text>
</a>
</g>
</g>
<!-- Affine&#45;&gt;StaticLogic -->
<g id="edge2" class="edge">
<title>Affine&#45;&gt;StaticLogic</title>
<path fill="none" stroke="black" d="M128.1,-741.76C133.62,-736.18 140.2,-730.33 147,-726 155.42,-720.63 162.33,-726.22 168,-718 184.9,-693.48 177.29,-679.29 168,-651 164.69,-640.91 158.63,-631.15 152.27,-622.82"/>
<polygon fill="black" stroke="black" points="154.92,-620.54 145.89,-615.01 149.5,-624.97 154.92,-620.54"/>
<path fill="none" stroke="black" d="M229.6,-741.76C235.12,-736.18 241.7,-730.33 248.5,-726 256.92,-720.63 263.83,-726.22 269.5,-718 286.4,-693.48 277.68,-679.63 269.5,-651 266.79,-641.51 261.83,-632.06 256.57,-623.83"/>
<polygon fill="black" stroke="black" points="259.36,-621.72 250.83,-615.43 253.58,-625.67 259.36,-621.72"/>
</g>
<!-- Scheduling -->
<g id="node23" class="node">
<g id="node25" class="node">
<title>Scheduling</title>
<g id="a_node23"><a xlink:href="https://circt.llvm.org/docs/Scheduling/" xlink:title="Scheduling">
<polygon fill="#fdc086" stroke="black" points="161,-687 65,-687 65,-651 161,-651 161,-687"/>
<text text-anchor="middle" x="113" y="-665.3" font-family="Times,serif" font-size="14.00">Scheduling</text>
<g id="a_node25"><a xlink:href="https://circt.llvm.org/docs/Scheduling/" xlink:title="Scheduling">
<polygon fill="#fdc086" stroke="black" points="262.5,-687 166.5,-687 166.5,-651 262.5,-651 262.5,-687"/>
<text text-anchor="middle" x="214.5" y="-665.3" font-family="Times,serif" font-size="14.00">Scheduling</text>
</a>
</g>
</g>
@ -83,107 +83,107 @@
<!-- Standard -->
<g id="node3" class="node">
<title>Standard</title>
<polygon fill="#beaed4" stroke="black" points="309.5,-778 226.5,-778 226.5,-742 309.5,-742 309.5,-778"/>
<text text-anchor="middle" x="268" y="-756.3" font-family="Times,serif" font-size="14.00">Standard</text>
<polygon fill="#beaed4" stroke="black" points="411,-778 328,-778 328,-742 411,-742 411,-778"/>
<text text-anchor="middle" x="369.5" y="-756.3" font-family="Times,serif" font-size="14.00">Standard</text>
</g>
<!-- Arith -->
<g id="node4" class="node">
<title>Arith</title>
<polygon fill="#beaed4" stroke="black" points="212,-778 158,-778 158,-742 212,-742 212,-778"/>
<text text-anchor="middle" x="185" y="-756.3" font-family="Times,serif" font-size="14.00">Arith</text>
<polygon fill="#beaed4" stroke="black" points="313.5,-778 259.5,-778 259.5,-742 313.5,-742 313.5,-778"/>
<text text-anchor="middle" x="286.5" y="-756.3" font-family="Times,serif" font-size="14.00">Arith</text>
</g>
<!-- Handshake -->
<g id="node5" class="node">
<title>Handshake</title>
<g id="a_node5"><a xlink:href="https://circt.llvm.org/docs/Dialects/Handshake/" xlink:title="Handshake">
<polygon fill="white" stroke="black" points="247,-543 151,-543 151,-507 247,-507 247,-543"/>
<text text-anchor="middle" x="199" y="-521.3" font-family="Times,serif" font-size="14.00">Handshake</text>
<polygon fill="white" stroke="black" points="354.5,-543 258.5,-543 258.5,-507 354.5,-507 354.5,-543"/>
<text text-anchor="middle" x="306.5" y="-521.3" font-family="Times,serif" font-size="14.00">Handshake</text>
</a>
</g>
</g>
<!-- Arith&#45;&gt;Handshake -->
<g id="edge4" class="edge">
<title>Arith&#45;&gt;Handshake</title>
<path fill="none" stroke="black" d="M214.18,-734C218.19,-729.13 221.71,-723.74 224,-718 246.93,-660.63 237.5,-639.28 224,-579 221.99,-570.01 218.27,-560.75 214.3,-552.53"/>
<polygon fill="black" stroke="black" points="217.32,-550.73 209.63,-543.44 211.09,-553.94 217.32,-550.73"/>
<path fill="none" stroke="black" d="M311.07,-734C314.44,-731.13 317.96,-728.38 321.5,-726 333.77,-717.73 555.51,-627.45 563.5,-615 572.14,-601.53 573.77,-591.27 563.5,-579 536.09,-546.24 421.25,-552.66 364.54,-543.01"/>
<polygon fill="black" stroke="black" points="365.16,-539.57 354.66,-541.01 363.77,-546.43 365.16,-539.57"/>
</g>
<!-- Arith&#45;&gt;Calyx -->
<g id="edge5" class="edge">
<title>Arith&#45;&gt;Calyx</title>
<path fill="none" stroke="black" d="M191.88,-734C200.45,-697.58 211.02,-628.86 185,-579 180.47,-570.32 163.05,-557.9 146.03,-547.27"/>
<polygon fill="black" stroke="black" points="147.6,-544.13 137.24,-541.9 143.95,-550.1 147.6,-544.13"/>
<path fill="none" stroke="black" d="M294.66,-734C305,-697.59 318.53,-628.89 292.5,-579 287.97,-570.32 270.55,-557.9 253.53,-547.27"/>
<polygon fill="black" stroke="black" points="255.1,-544.13 244.74,-541.9 251.45,-550.1 255.1,-544.13"/>
</g>
<!-- FIRRTL -->
<g id="node7" class="node">
<title>FIRRTL</title>
<g id="a_node7"><a xlink:href="https://circt.llvm.org/docs/Dialects/FIRRTL/" xlink:title="FIRRTL">
<polygon fill="white" stroke="black" points="225.5,-471 154.5,-471 154.5,-435 225.5,-435 225.5,-471"/>
<text text-anchor="middle" x="190" y="-449.3" font-family="Times,serif" font-size="14.00">FIRRTL</text>
<polygon fill="white" stroke="black" points="461,-471 390,-471 390,-435 461,-435 461,-471"/>
<text text-anchor="middle" x="425.5" y="-449.3" font-family="Times,serif" font-size="14.00">FIRRTL</text>
</a>
</g>
</g>
<!-- Handshake&#45;&gt;FIRRTL -->
<g id="edge6" class="edge">
<title>Handshake&#45;&gt;FIRRTL</title>
<path fill="none" stroke="black" d="M196.78,-506.7C195.78,-498.98 194.59,-489.71 193.49,-481.11"/>
<polygon fill="black" stroke="black" points="196.95,-480.58 192.2,-471.1 190,-481.47 196.95,-480.58"/>
<path fill="none" stroke="black" d="M335.61,-506.88C351.17,-497.72 370.52,-486.34 387.28,-476.48"/>
<polygon fill="black" stroke="black" points="389.43,-479.28 396.28,-471.19 385.88,-473.24 389.43,-479.28"/>
</g>
<!-- FSM -->
<g id="node11" class="node">
<title>FSM</title>
<g id="a_node11"><a xlink:href="https://circt.llvm.org/docs/Dialects/FSM/" xlink:title="FSM">
<polygon fill="white" stroke="black" points="140,-471 86,-471 86,-435 140,-435 140,-471"/>
<text text-anchor="middle" x="113" y="-449.3" font-family="Times,serif" font-size="14.00">FSM</text>
<polygon fill="white" stroke="black" points="302.5,-471 248.5,-471 248.5,-435 302.5,-435 302.5,-471"/>
<text text-anchor="middle" x="275.5" y="-449.3" font-family="Times,serif" font-size="14.00">FSM</text>
</a>
</g>
</g>
<!-- Calyx&#45;&gt;FSM -->
<g id="edge7" class="edge">
<title>Calyx&#45;&gt;FSM</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M109.99,-506.7C110.43,-498.98 110.96,-489.71 111.45,-481.11"/>
<polygon fill="black" stroke="black" points="114.95,-481.29 112.02,-471.1 107.96,-480.89 114.95,-481.29"/>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M231.08,-506.7C238.16,-498.3 246.78,-488.07 254.55,-478.86"/>
<polygon fill="black" stroke="black" points="257.31,-481.01 261.08,-471.1 251.96,-476.49 257.31,-481.01"/>
</g>
<!-- Calyx_native -->
<g id="node26" class="node">
<g id="node28" class="node">
<title>Calyx_native</title>
<polygon fill="#ffff99" stroke="black" points="630.73,-154.54 630.73,-169.46 587.54,-180 526.46,-180 483.27,-169.46 483.27,-154.54 526.46,-144 587.54,-144 630.73,-154.54"/>
<text text-anchor="middle" x="557" y="-158.3" font-family="Times,serif" font-size="14.00">Calyx native</text>
<polygon fill="#ffff99" stroke="black" points="650.23,-154.54 650.23,-169.46 607.04,-180 545.96,-180 502.77,-169.46 502.77,-154.54 545.96,-144 607.04,-144 650.23,-154.54"/>
<text text-anchor="middle" x="576.5" y="-158.3" font-family="Times,serif" font-size="14.00">Calyx native</text>
</g>
<!-- Calyx&#45;&gt;Calyx_native -->
<g id="edge26" class="edge">
<g id="edge29" class="edge">
<title>Calyx&#45;&gt;Calyx_native</title>
<path fill="none" stroke="black" d="M137.33,-509.26C139.56,-508.41 141.79,-507.64 144,-507 282.76,-466.86 330.1,-517.08 467,-471 540.11,-446.39 616,-459.14 616,-382 616,-382 616,-382 616,-305 616,-261.83 592.46,-216.53 575.11,-189.03"/>
<polygon fill="black" stroke="black" points="577.9,-186.89 569.51,-180.41 572.03,-190.7 577.9,-186.89"/>
<path fill="none" stroke="black" d="M244.87,-509.39C247.09,-508.51 249.31,-507.7 251.5,-507 425.34,-451.64 642.5,-564.44 642.5,-382 642.5,-382 642.5,-382 642.5,-305 642.5,-260.84 615.93,-215.56 596.51,-188.35"/>
<polygon fill="black" stroke="black" points="599.24,-186.16 590.5,-180.18 593.6,-190.31 599.24,-186.16"/>
</g>
<!-- space_above_RTL -->
<!-- FIRRTL&#45;&gt;space_above_RTL -->
<!-- HW -->
<g id="node15" class="node">
<g id="node16" class="node">
<title>HW</title>
<g id="a_node15"><a xlink:href="https://circt.llvm.org/docs/Dialects/HW/" xlink:title="HW">
<polygon fill="white" stroke="black" points="226,-324 172,-324 172,-288 226,-288 226,-324"/>
<text text-anchor="middle" x="199" y="-302.3" font-family="Times,serif" font-size="14.00">HW</text>
<g id="a_node16"><a xlink:href="https://circt.llvm.org/docs/Dialects/HW/" xlink:title="HW">
<polygon fill="white" stroke="black" points="234.5,-324 180.5,-324 180.5,-288 234.5,-288 234.5,-324"/>
<text text-anchor="middle" x="207.5" y="-302.3" font-family="Times,serif" font-size="14.00">HW</text>
</a>
</g>
</g>
<!-- FIRRTL&#45;&gt;HW -->
<g id="edge8" class="edge">
<title>FIRRTL&#45;&gt;HW</title>
<path fill="none" stroke="black" d="M191.07,-434.8C192.13,-417.61 193.84,-390.21 195.39,-365.18"/>
<polygon fill="black" stroke="black" points="198.89,-365.2 196.02,-355 191.91,-364.76 198.89,-365.2"/>
<path fill="none" stroke="black" d="M409.29,-434.85C388.41,-413.96 349.95,-379.43 309.5,-363 284.83,-352.98 271.3,-366.26 250.78,-359.33"/>
<polygon fill="black" stroke="black" points="252.04,-356.06 241.5,-355 249.08,-362.4 252.04,-356.06"/>
</g>
<!-- StaticLogic&#45;&gt;Calyx -->
<g id="edge3" class="edge">
<title>StaticLogic&#45;&gt;Calyx</title>
<path fill="none" stroke="black" d="M124.06,-578.7C121.83,-570.9 119.15,-561.51 116.67,-552.83"/>
<polygon fill="black" stroke="black" points="120,-551.76 113.89,-543.1 113.27,-553.68 120,-551.76"/>
<path fill="none" stroke="black" d="M231.56,-578.7C229.33,-570.9 226.65,-561.51 224.17,-552.83"/>
<polygon fill="black" stroke="black" points="227.5,-551.76 221.39,-543.1 220.77,-553.68 227.5,-551.76"/>
</g>
<!-- MSFT -->
<g id="node9" class="node">
<title>MSFT</title>
<g id="a_node9"><a xlink:href="https://circt.llvm.org/docs/Dialects/MSFT/" xlink:title="MSFT">
<polygon fill="white" stroke="black" points="459.5,-471 400.5,-471 400.5,-435 459.5,-435 459.5,-471"/>
<text text-anchor="middle" x="430" y="-449.3" font-family="Times,serif" font-size="14.00">MSFT</text>
<polygon fill="white" stroke="black" points="376,-471 317,-471 317,-435 376,-435 376,-471"/>
<text text-anchor="middle" x="346.5" y="-449.3" font-family="Times,serif" font-size="14.00">MSFT</text>
</a>
</g>
</g>
@ -191,29 +191,29 @@
<!-- MSFT&#45;&gt;HW -->
<g id="edge9" class="edge">
<title>MSFT&#45;&gt;HW</title>
<path fill="none" stroke="black" d="M411.59,-434.87C387.97,-414.01 344.79,-379.51 301,-363 276.08,-353.61 262.74,-366.42 242.27,-359.36"/>
<polygon fill="black" stroke="black" points="243.54,-356.09 233,-355 240.56,-362.43 243.54,-356.09"/>
<path fill="none" stroke="black" d="M316.92,-438.43C287.84,-424.88 247.02,-405.19 241.5,-399 238.67,-395.83 232.89,-381.16 226.88,-364.44"/>
<polygon fill="black" stroke="black" points="230.17,-363.26 223.53,-355 223.57,-365.59 230.17,-363.26"/>
</g>
<!-- TCL -->
<g id="node32" class="node">
<g id="node34" class="node">
<title>TCL</title>
<polygon fill="#7fc97f" stroke="black" points="460,-108 412,-108 412,-72 466,-72 466,-102 460,-108"/>
<polyline fill="none" stroke="black" points="460,-108 460,-102 "/>
<polyline fill="none" stroke="black" points="466,-102 460,-102 "/>
<text text-anchor="middle" x="439" y="-86.3" font-family="Times,serif" font-size="14.00">.tcl</text>
<polygon fill="#7fc97f" stroke="black" points="461.5,-108 413.5,-108 413.5,-72 467.5,-72 467.5,-102 461.5,-108"/>
<polyline fill="none" stroke="black" points="461.5,-108 461.5,-102 "/>
<polyline fill="none" stroke="black" points="467.5,-102 461.5,-102 "/>
<text text-anchor="middle" x="440.5" y="-86.3" font-family="Times,serif" font-size="14.00">.tcl</text>
</g>
<!-- MSFT&#45;&gt;TCL -->
<g id="edge36" class="edge">
<g id="edge40" class="edge">
<title>MSFT&#45;&gt;TCL</title>
<path fill="none" stroke="black" d="M459.75,-448.51C490.44,-443.27 537.34,-430.36 563,-399 575.59,-383.62 569.22,-374.8 571,-355 573.67,-325.34 581.51,-315.86 571,-288 548.44,-228.19 509.83,-234.24 476,-180 463.8,-160.44 454.02,-136.17 447.58,-117.91"/>
<polygon fill="black" stroke="black" points="450.81,-116.54 444.27,-108.2 444.19,-118.79 450.81,-116.54"/>
<path fill="none" stroke="black" d="M376.13,-437.59C378.59,-436.64 381.07,-435.76 383.5,-435 472.24,-407.37 519.71,-460.38 589.5,-399 666.03,-331.69 642.22,-280.76 657.5,-180 660.43,-160.67 669.84,-151.17 657.5,-136 635.25,-108.67 533.72,-97.41 477.77,-93.22"/>
<polygon fill="black" stroke="black" points="477.78,-89.71 467.56,-92.49 477.28,-96.69 477.78,-89.71"/>
</g>
<!-- ESI -->
<g id="node10" class="node">
<title>ESI</title>
<g id="a_node10"><a xlink:href="https://circt.llvm.org/docs/Dialects/ESI/" xlink:title="ESI">
<polygon fill="white" stroke="black" points="294,-471 240,-471 240,-435 294,-435 294,-471"/>
<text text-anchor="middle" x="267" y="-449.3" font-family="Times,serif" font-size="14.00">ESI</text>
<polygon fill="white" stroke="black" points="142.5,-471 88.5,-471 88.5,-435 142.5,-435 142.5,-471"/>
<text text-anchor="middle" x="115.5" y="-449.3" font-family="Times,serif" font-size="14.00">ESI</text>
</a>
</g>
</g>
@ -221,36 +221,36 @@
<!-- ESI&#45;&gt;HW -->
<g id="edge10" class="edge">
<title>ESI&#45;&gt;HW</title>
<path fill="none" stroke="black" d="M248.43,-434.98C238.91,-425.29 227.91,-412.44 221,-399 215.56,-388.42 211.44,-376.46 208.32,-364.74"/>
<polygon fill="black" stroke="black" points="211.71,-363.88 205.94,-355 204.92,-365.54 211.71,-363.88"/>
<path fill="none" stroke="black" d="M126.41,-434.8C137.56,-417.22 155.48,-388.98 171.65,-363.51"/>
<polygon fill="black" stroke="black" points="174.64,-365.32 177.05,-355 168.73,-361.57 174.64,-365.32"/>
</g>
<!-- CapNProto -->
<g id="node31" class="node">
<g id="node33" class="node">
<title>CapNProto</title>
<polygon fill="#7fc97f" stroke="black" points="191.5,-108 96.5,-108 96.5,-72 197.5,-72 197.5,-102 191.5,-108"/>
<polyline fill="none" stroke="black" points="191.5,-108 191.5,-102 "/>
<polyline fill="none" stroke="black" points="197.5,-102 191.5,-102 "/>
<text text-anchor="middle" x="147" y="-86.3" font-family="Times,serif" font-size="14.00">Cap&#39;n Proto</text>
<polygon fill="#7fc97f" stroke="black" points="95,-108 0,-108 0,-72 101,-72 101,-102 95,-108"/>
<polyline fill="none" stroke="black" points="95,-108 95,-102 "/>
<polyline fill="none" stroke="black" points="101,-102 95,-102 "/>
<text text-anchor="middle" x="50.5" y="-86.3" font-family="Times,serif" font-size="14.00">Cap&#39;n Proto</text>
</g>
<!-- ESI&#45;&gt;CapNProto -->
<g id="edge35" class="edge">
<g id="edge39" class="edge">
<title>ESI&#45;&gt;CapNProto</title>
<path fill="none" stroke="black" d="M239.76,-436.99C202.44,-414.19 140,-367.07 140,-307 140,-307 140,-307 140,-233 140,-192.95 142.81,-146.62 144.87,-118.06"/>
<polygon fill="black" stroke="black" points="148.37,-118.27 145.62,-108.04 141.39,-117.75 148.37,-118.27"/>
<path fill="none" stroke="black" d="M102.45,-434.75C83.99,-408.59 52.5,-356.68 52.5,-307 52.5,-307 52.5,-307 52.5,-233 52.5,-192.99 51.7,-146.65 51.11,-118.08"/>
<polygon fill="black" stroke="black" points="54.61,-117.97 50.9,-108.05 47.61,-118.12 54.61,-117.97"/>
</g>
<!-- FSM&#45;&gt;space_above_RTL -->
<!-- FSM&#45;&gt;HW -->
<g id="edge11" class="edge">
<title>FSM&#45;&gt;HW</title>
<path fill="none" stroke="black" d="M123.2,-434.8C133.58,-417.3 150.23,-389.23 165.29,-363.84"/>
<polygon fill="black" stroke="black" points="168.44,-365.38 170.53,-355 162.42,-361.81 168.44,-365.38"/>
<path fill="none" stroke="black" d="M255.99,-434.61C246.36,-425.01 235.36,-412.34 228.5,-399 223.07,-388.43 219.03,-376.47 216.03,-364.75"/>
<polygon fill="black" stroke="black" points="219.43,-363.93 213.74,-355 212.61,-365.53 219.43,-363.93"/>
</g>
<!-- HWArith -->
<g id="node12" class="node">
<title>HWArith</title>
<g id="a_node12"><a xlink:href="https://circt.llvm.org/docs/Dialects/HWArith/" xlink:title="HWArith">
<polygon fill="white" stroke="black" points="386,-471 308,-471 308,-435 386,-435 386,-471"/>
<text text-anchor="middle" x="347" y="-449.3" font-family="Times,serif" font-size="14.00">HWArith</text>
<polygon fill="white" stroke="black" points="234.5,-471 156.5,-471 156.5,-435 234.5,-435 234.5,-471"/>
<text text-anchor="middle" x="195.5" y="-449.3" font-family="Times,serif" font-size="14.00">HWArith</text>
</a>
</g>
</g>
@ -258,307 +258,346 @@
<!-- HWArith&#45;&gt;HW -->
<g id="edge12" class="edge">
<title>HWArith&#45;&gt;HW</title>
<path fill="none" stroke="black" d="M307.93,-437.54C279.36,-426.31 243.8,-410.71 233,-399 231.52,-397.4 225.79,-382.36 219.44,-364.89"/>
<polygon fill="black" stroke="black" points="222.56,-363.22 215.87,-355 215.97,-365.59 222.56,-363.22"/>
<path fill="none" stroke="black" d="M196.92,-434.8C198.35,-417.61 200.61,-390.21 202.69,-365.18"/>
<polygon fill="black" stroke="black" points="206.19,-365.25 203.53,-355 199.21,-364.68 206.19,-365.25"/>
</g>
<!-- SystemC -->
<g id="node13" class="node">
<title>SystemC</title>
<g id="a_node13"><a xlink:href="https://circt.llvm.org/docs/Dialects/SystemC/" xlink:title="SystemC">
<polygon fill="white" stroke="black" points="470.5,-252 390.5,-252 390.5,-216 470.5,-216 470.5,-252"/>
<text text-anchor="middle" x="430.5" y="-230.3" font-family="Times,serif" font-size="14.00">SystemC</text>
</a>
</g>
</g>
<!-- ExportSystemC -->
<g id="node22" class="node">
<title>ExportSystemC</title>
<polygon fill="#fdc086" stroke="black" points="486,-180 357,-180 357,-144 486,-144 486,-180"/>
<text text-anchor="middle" x="421.5" y="-158.3" font-family="Times,serif" font-size="14.00">ExportSystemC</text>
</g>
<!-- SystemC&#45;&gt;ExportSystemC -->
<g id="edge21" class="edge">
<title>SystemC&#45;&gt;ExportSystemC</title>
<path fill="none" stroke="black" d="M428.28,-215.7C427.28,-207.98 426.09,-198.71 424.99,-190.11"/>
<polygon fill="black" stroke="black" points="428.45,-189.58 423.7,-180.1 421.5,-190.47 428.45,-189.58"/>
</g>
<!-- Seq -->
<g id="node14" class="node">
<g id="node15" class="node">
<title>Seq</title>
<g id="a_node14"><a xlink:href="https://circt.llvm.org/docs/Dialects/Seq/" xlink:title="Seq">
<polygon fill="white" stroke="black" points="294,-324 240,-324 240,-288 294,-288 294,-324"/>
<text text-anchor="middle" x="267" y="-302.3" font-family="Times,serif" font-size="14.00">Seq</text>
<g id="a_node15"><a xlink:href="https://circt.llvm.org/docs/Dialects/Seq/" xlink:title="Seq">
<polygon fill="white" stroke="black" points="302.5,-324 248.5,-324 248.5,-288 302.5,-288 302.5,-324"/>
<text text-anchor="middle" x="275.5" y="-302.3" font-family="Times,serif" font-size="14.00">Seq</text>
</a>
</g>
</g>
<!-- space_above_RTL&#45;&gt;Seq -->
<!-- space_above_RTL&#45;&gt;HW -->
<!-- Comb -->
<g id="node17" class="node">
<g id="node18" class="node">
<title>Comb</title>
<g id="a_node17"><a xlink:href="https://circt.llvm.org/docs/Dialects/Comb/" xlink:title="Comb">
<polygon fill="white" stroke="black" points="366,-324 308,-324 308,-288 366,-288 366,-324"/>
<text text-anchor="middle" x="337" y="-302.3" font-family="Times,serif" font-size="14.00">Comb</text>
<g id="a_node18"><a xlink:href="https://circt.llvm.org/docs/Dialects/Comb/" xlink:title="Comb">
<polygon fill="white" stroke="black" points="374.5,-324 316.5,-324 316.5,-288 374.5,-288 374.5,-324"/>
<text text-anchor="middle" x="345.5" y="-302.3" font-family="Times,serif" font-size="14.00">Comb</text>
</a>
</g>
</g>
<!-- space_above_RTL&#45;&gt;Comb -->
<!-- SV -->
<g id="node16" class="node">
<g id="node17" class="node">
<title>SV</title>
<g id="a_node16"><a xlink:href="https://circt.llvm.org/docs/Dialects/SV/" xlink:title="SV">
<polygon fill="white" stroke="black" points="366,-252 312,-252 312,-216 366,-216 366,-252"/>
<text text-anchor="middle" x="339" y="-230.3" font-family="Times,serif" font-size="14.00">SV</text>
<g id="a_node17"><a xlink:href="https://circt.llvm.org/docs/Dialects/SV/" xlink:title="SV">
<polygon fill="white" stroke="black" points="312.5,-252 258.5,-252 258.5,-216 312.5,-216 312.5,-252"/>
<text text-anchor="middle" x="285.5" y="-230.3" font-family="Times,serif" font-size="14.00">SV</text>
</a>
</g>
</g>
<!-- Seq&#45;&gt;SV -->
<g id="edge13" class="edge">
<title>Seq&#45;&gt;SV</title>
<path fill="none" stroke="black" d="M284.8,-287.7C293.6,-279.14 304.38,-268.66 314,-259.3"/>
<polygon fill="black" stroke="black" points="316.68,-261.58 321.41,-252.1 311.8,-256.57 316.68,-261.58"/>
<path fill="none" stroke="black" d="M277.97,-287.7C279.07,-279.98 280.4,-270.71 281.63,-262.11"/>
<polygon fill="black" stroke="black" points="285.11,-262.5 283.06,-252.1 278.18,-261.51 285.11,-262.5"/>
</g>
<!-- llhd_sim -->
<g id="node20" class="node">
<g id="node21" class="node">
<title>llhd_sim</title>
<polygon fill="#fdc086" stroke="black" points="309,-180 233,-180 233,-144 309,-144 309,-180"/>
<text text-anchor="middle" x="271" y="-158.3" font-family="Times,serif" font-size="14.00">llhd_sim</text>
<polygon fill="#fdc086" stroke="black" points="212.5,-180 136.5,-180 136.5,-144 212.5,-144 212.5,-180"/>
<text text-anchor="middle" x="174.5" y="-158.3" font-family="Times,serif" font-size="14.00">llhd_sim</text>
</g>
<!-- Seq&#45;&gt;llhd_sim -->
<g id="edge30" class="edge">
<g id="edge34" class="edge">
<title>Seq&#45;&gt;llhd_sim</title>
<path fill="none" stroke="black" d="M246.18,-287.62C236.54,-278.2 226.11,-265.7 221,-252 214.16,-233.68 213.04,-225.86 221,-208 224.55,-200.03 230.29,-192.87 236.64,-186.74"/>
<polygon fill="black" stroke="black" points="239.08,-189.25 244.28,-180.02 234.46,-184 239.08,-189.25"/>
<path fill="none" stroke="black" d="M248.42,-291.43C246.08,-290.26 243.75,-289.11 241.5,-288 208.7,-271.82 186.9,-283.01 167.5,-252 155.99,-233.6 159.17,-208.69 164.41,-189.9"/>
<polygon fill="black" stroke="black" points="167.81,-190.77 167.45,-180.18 161.13,-188.68 167.81,-190.77"/>
</g>
<!-- HW&#45;&gt;SystemC -->
<g id="edge20" class="edge">
<title>HW&#45;&gt;SystemC</title>
<path fill="none" stroke="black" d="M234.74,-290.74C237,-289.75 239.27,-288.82 241.5,-288 300.35,-266.23 320.56,-271.12 380.75,-253.36"/>
<polygon fill="black" stroke="black" points="381.8,-256.69 390.35,-250.43 379.76,-250 381.8,-256.69"/>
</g>
<!-- LLHD -->
<g id="node18" class="node">
<g id="node19" class="node">
<title>LLHD</title>
<g id="a_node18"><a xlink:href="https://circt.llvm.org/docs/Dialects/LLHD/" xlink:title="LLHD">
<polygon fill="white" stroke="black" points="298,-252 240,-252 240,-216 298,-216 298,-252"/>
<text text-anchor="middle" x="269" y="-230.3" font-family="Times,serif" font-size="14.00">LLHD</text>
<g id="a_node19"><a xlink:href="https://circt.llvm.org/docs/Dialects/LLHD/" xlink:title="LLHD">
<polygon fill="white" stroke="black" points="244.5,-252 186.5,-252 186.5,-216 244.5,-216 244.5,-252"/>
<text text-anchor="middle" x="215.5" y="-230.3" font-family="Times,serif" font-size="14.00">LLHD</text>
</a>
</g>
</g>
<!-- HW&#45;&gt;LLHD -->
<g id="edge14" class="edge">
<title>HW&#45;&gt;LLHD</title>
<path fill="none" stroke="black" d="M216.3,-287.7C224.86,-279.14 235.34,-268.66 244.7,-259.3"/>
<polygon fill="black" stroke="black" points="247.3,-261.65 251.9,-252.1 242.35,-256.7 247.3,-261.65"/>
<path fill="none" stroke="black" d="M209.48,-287.7C210.36,-279.98 211.42,-270.71 212.4,-262.11"/>
<polygon fill="black" stroke="black" points="215.89,-262.44 213.55,-252.1 208.93,-261.64 215.89,-262.44"/>
</g>
<!-- HW&#45;&gt;llhd_sim -->
<g id="edge31" class="edge">
<g id="edge35" class="edge">
<title>HW&#45;&gt;llhd_sim</title>
<path fill="none" stroke="black" d="M197.5,-287.97C196.52,-267.56 197.49,-232.98 212,-208 216.8,-199.74 223.77,-192.49 231.25,-186.35"/>
<polygon fill="black" stroke="black" points="233.61,-188.95 239.49,-180.14 229.4,-183.36 233.61,-188.95"/>
<path fill="none" stroke="black" d="M181.38,-287.82C169.92,-278.69 157.69,-266.39 151.5,-252 142.82,-231.84 150.11,-207.65 158.71,-189.59"/>
<polygon fill="black" stroke="black" points="162.05,-190.73 163.53,-180.24 155.83,-187.53 162.05,-190.73"/>
</g>
<!-- ExportVerilog -->
<g id="node21" class="node">
<g id="node23" class="node">
<title>ExportVerilog</title>
<g id="a_node21"><a xlink:href="https://circt.llvm.org/docs/VerilogGeneration/" xlink:title="ExportVerilog">
<polygon fill="#fdc086" stroke="black" points="439,-180 323,-180 323,-144 439,-144 439,-180"/>
<text text-anchor="middle" x="381" y="-158.3" font-family="Times,serif" font-size="14.00">ExportVerilog</text>
<g id="a_node23"><a xlink:href="https://circt.llvm.org/docs/VerilogGeneration/" xlink:title="ExportVerilog">
<polygon fill="#fdc086" stroke="black" points="342.5,-180 226.5,-180 226.5,-144 342.5,-144 342.5,-180"/>
<text text-anchor="middle" x="284.5" y="-158.3" font-family="Times,serif" font-size="14.00">ExportVerilog</text>
</a>
</g>
</g>
<!-- HW&#45;&gt;ExportVerilog -->
<g id="edge20" class="edge">
<g id="edge23" class="edge">
<title>HW&#45;&gt;ExportVerilog</title>
<path fill="none" stroke="black" d="M226.24,-290.76C228.5,-289.77 230.77,-288.83 233,-288 293.18,-265.51 331.4,-300.96 373,-252 380.68,-242.97 382.04,-213.01 381.89,-190.33"/>
<polygon fill="black" stroke="black" points="385.39,-190.15 381.72,-180.21 378.39,-190.26 385.39,-190.15"/>
<path fill="none" stroke="black" d="M234.56,-291.38C236.9,-290.22 239.24,-289.09 241.5,-288 275.91,-271.46 298.92,-284.16 319.5,-252 330.04,-235.53 325.85,-226.5 319.5,-208 317.07,-200.92 313.02,-194.1 308.52,-187.99"/>
<polygon fill="black" stroke="black" points="311.22,-185.76 302.22,-180.17 305.77,-190.15 311.22,-185.76"/>
</g>
<!-- Circilator -->
<g id="node27" class="node">
<g id="node29" class="node">
<title>Circilator</title>
<polygon fill="#ffff99" stroke="black" stroke-dasharray="5,2" points="330.19,-82.54 330.19,-97.46 295.52,-108 246.48,-108 211.81,-97.46 211.81,-82.54 246.48,-72 295.52,-72 330.19,-82.54"/>
<text text-anchor="middle" x="271" y="-86.3" font-family="Times,serif" font-size="14.00">Circilator</text>
<polygon fill="#ffff99" stroke="black" stroke-dasharray="5,2" points="233.69,-82.54 233.69,-97.46 199.02,-108 149.98,-108 115.31,-97.46 115.31,-82.54 149.98,-72 199.02,-72 233.69,-82.54"/>
<text text-anchor="middle" x="174.5" y="-86.3" font-family="Times,serif" font-size="14.00">Circilator</text>
</g>
<!-- HW&#45;&gt;Circilator -->
<g id="edge24" class="edge">
<g id="edge27" class="edge">
<title>HW&#45;&gt;Circilator</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M191.93,-287.67C188.16,-277.47 183.91,-264.22 182,-252 178.98,-232.68 177.94,-227.13 182,-208 189.27,-173.74 192.52,-163.66 214,-136 220.38,-127.79 228.57,-120.19 236.74,-113.67"/>
<polygon fill="black" stroke="black" points="238.98,-116.36 244.83,-107.53 234.75,-110.79 238.98,-116.36"/>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M180.07,-300.42C153.53,-294.38 114.73,-280.9 96.5,-252 68.59,-207.75 87.35,-179.44 116.5,-136 122.3,-127.35 130.32,-119.63 138.53,-113.14"/>
<polygon fill="black" stroke="black" points="140.79,-115.82 146.75,-107.06 136.63,-110.2 140.79,-115.82"/>
</g>
<!-- SV&#45;&gt;ExportVerilog -->
<g id="edge21" class="edge">
<g id="edge24" class="edge">
<title>SV&#45;&gt;ExportVerilog</title>
<path fill="none" stroke="black" d="M349.38,-215.7C354.26,-207.56 360.19,-197.69 365.58,-188.7"/>
<polygon fill="black" stroke="black" points="368.59,-190.48 370.74,-180.1 362.59,-186.88 368.59,-190.48"/>
<path fill="none" stroke="black" d="M285.25,-215.7C285.14,-207.98 285.01,-198.71 284.89,-190.11"/>
<polygon fill="black" stroke="black" points="288.39,-190.05 284.74,-180.1 281.39,-190.15 288.39,-190.05"/>
</g>
<!-- Comb&#45;&gt;llhd_sim -->
<g id="edge32" class="edge">
<g id="edge36" class="edge">
<title>Comb&#45;&gt;llhd_sim</title>
<path fill="none" stroke="black" d="M307.75,-291.02C277.76,-276.55 235.18,-255.56 233,-252 222.78,-235.33 226.28,-226.37 233,-208 235.61,-200.87 239.9,-194.09 244.68,-188.06"/>
<polygon fill="black" stroke="black" points="247.47,-190.18 251.39,-180.33 242.19,-185.59 247.47,-190.18"/>
<path fill="none" stroke="black" d="M316.21,-290.67C313.96,-289.72 311.7,-288.82 309.5,-288 253.3,-267.12 217.12,-298.68 179.5,-252 165.73,-234.92 165.68,-209.47 168.37,-190.15"/>
<polygon fill="black" stroke="black" points="171.85,-190.59 170.08,-180.14 164.95,-189.41 171.85,-190.59"/>
</g>
<!-- Comb&#45;&gt;ExportSystemC -->
<g id="edge22" class="edge">
<title>Comb&#45;&gt;ExportSystemC</title>
<path fill="none" stroke="black" d="M374.74,-302.51C406.15,-298.09 454.61,-285.86 477.5,-252 488.45,-235.8 485.95,-225.63 477.5,-208 473.59,-199.84 467.39,-192.68 460.52,-186.62"/>
<polygon fill="black" stroke="black" points="462.24,-183.52 452.24,-180.02 457.88,-188.99 462.24,-183.52"/>
</g>
<!-- Comb&#45;&gt;ExportVerilog -->
<g id="edge15" class="edge">
<title>Comb&#45;&gt;ExportVerilog</title>
<path fill="none" stroke="black" d="M358.71,-287.79C368.76,-278.41 379.64,-265.9 385,-252 392.63,-232.22 390.94,-208.1 387.72,-189.96"/>
<polygon fill="black" stroke="black" points="391.13,-189.16 385.71,-180.05 384.27,-190.55 391.13,-189.16"/>
<path fill="none" stroke="black" d="M346.31,-287.86C346.54,-267.65 344.66,-233.57 331.5,-208 327.65,-200.51 322.05,-193.57 316.06,-187.49"/>
<polygon fill="black" stroke="black" points="318.05,-184.56 308.36,-180.28 313.26,-189.67 318.05,-184.56"/>
</g>
<!-- LLHD&#45;&gt;llhd_sim -->
<g id="edge33" class="edge">
<g id="edge37" class="edge">
<title>LLHD&#45;&gt;llhd_sim</title>
<path fill="none" stroke="black" d="M269.49,-215.7C269.71,-207.98 269.98,-198.71 270.23,-190.11"/>
<polygon fill="black" stroke="black" points="273.72,-190.2 270.51,-180.1 266.73,-190 273.72,-190.2"/>
<path fill="none" stroke="black" d="M205.37,-215.7C200.65,-207.64 194.94,-197.89 189.72,-188.98"/>
<polygon fill="black" stroke="black" points="192.59,-186.96 184.52,-180.1 186.55,-190.5 192.59,-186.96"/>
</g>
<!-- LLHD&#45;&gt;Circilator -->
<g id="edge25" class="edge">
<g id="edge28" class="edge">
<title>LLHD&#45;&gt;Circilator</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M248.18,-215.62C238.54,-206.2 228.11,-193.7 223,-180 216.16,-161.68 215.23,-153.94 223,-136 226.43,-128.09 232,-120.93 238.17,-114.77"/>
<polygon fill="black" stroke="black" points="240.55,-117.34 245.58,-108.01 235.83,-112.17 240.55,-117.34"/>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M186.21,-224.21C165.49,-216.27 139.21,-202.36 126.5,-180 116.84,-163 118.73,-153.94 126.5,-136 129.93,-128.09 135.5,-120.93 141.67,-114.77"/>
<polygon fill="black" stroke="black" points="144.05,-117.34 149.08,-108.01 139.33,-112.17 144.05,-117.34"/>
</g>
<!-- FIRRTLParser -->
<g id="node19" class="node">
<g id="node20" class="node">
<title>FIRRTLParser</title>
<polygon fill="#fdc086" stroke="black" points="378.5,-543 261.5,-543 261.5,-507 378.5,-507 378.5,-543"/>
<text text-anchor="middle" x="320" y="-521.3" font-family="Times,serif" font-size="14.00">FIRRTLParser</text>
<polygon fill="#fdc086" stroke="black" points="486,-543 369,-543 369,-507 486,-507 486,-543"/>
<text text-anchor="middle" x="427.5" y="-521.3" font-family="Times,serif" font-size="14.00">FIRRTLParser</text>
</g>
<!-- FIRRTLParser&#45;&gt;FIRRTL -->
<g id="edge19" class="edge">
<title>FIRRTLParser&#45;&gt;FIRRTL</title>
<path fill="none" stroke="black" d="M288.2,-506.88C270.89,-497.55 249.28,-485.92 230.74,-475.94"/>
<polygon fill="black" stroke="black" points="232.39,-472.85 221.92,-471.19 229.07,-479.01 232.39,-472.85"/>
<path fill="none" stroke="black" d="M427.01,-506.7C426.79,-498.98 426.52,-489.71 426.27,-481.11"/>
<polygon fill="black" stroke="black" points="429.77,-481 425.99,-471.1 422.78,-481.2 429.77,-481"/>
</g>
<!-- llhd_sim&#45;&gt;Circilator -->
<!-- VCDTrace -->
<g id="node28" class="node">
<g id="node30" class="node">
<title>VCDTrace</title>
<polygon fill="#7fc97f" stroke="black" points="392,-108 344,-108 344,-72 398,-72 398,-102 392,-108"/>
<polyline fill="none" stroke="black" points="392,-108 392,-102 "/>
<polyline fill="none" stroke="black" points="398,-102 392,-102 "/>
<text text-anchor="middle" x="371" y="-86.3" font-family="Times,serif" font-size="14.00">.vcd</text>
<polygon fill="#7fc97f" stroke="black" points="295.5,-108 247.5,-108 247.5,-72 301.5,-72 301.5,-102 295.5,-108"/>
<polyline fill="none" stroke="black" points="295.5,-108 295.5,-102 "/>
<polyline fill="none" stroke="black" points="301.5,-102 295.5,-102 "/>
<text text-anchor="middle" x="274.5" y="-86.3" font-family="Times,serif" font-size="14.00">.vcd</text>
</g>
<!-- llhd_sim&#45;&gt;VCDTrace -->
<g id="edge34" class="edge">
<g id="edge38" class="edge">
<title>llhd_sim&#45;&gt;VCDTrace</title>
<path fill="none" stroke="black" d="M295.46,-143.88C308.3,-134.89 324.2,-123.76 338.09,-114.03"/>
<polygon fill="black" stroke="black" points="340.26,-116.79 346.44,-108.19 336.24,-111.06 340.26,-116.79"/>
<path fill="none" stroke="black" d="M198.96,-143.88C211.8,-134.89 227.7,-123.76 241.59,-114.03"/>
<polygon fill="black" stroke="black" points="243.76,-116.79 249.94,-108.19 239.74,-111.06 243.76,-116.79"/>
</g>
<!-- SVFile -->
<g id="node30" class="node">
<g id="node32" class="node">
<title>SVFile</title>
<polygon fill="#7fc97f" stroke="black" points="553,-108 505,-108 505,-72 559,-72 559,-102 553,-108"/>
<polyline fill="none" stroke="black" points="553,-108 553,-102 "/>
<polyline fill="none" stroke="black" points="559,-102 553,-102 "/>
<text text-anchor="middle" x="532" y="-86.3" font-family="Times,serif" font-size="14.00">.sv</text>
<polygon fill="#7fc97f" stroke="black" points="393.5,-108 345.5,-108 345.5,-72 399.5,-72 399.5,-102 393.5,-108"/>
<polyline fill="none" stroke="black" points="393.5,-108 393.5,-102 "/>
<polyline fill="none" stroke="black" points="399.5,-102 393.5,-102 "/>
<text text-anchor="middle" x="372.5" y="-86.3" font-family="Times,serif" font-size="14.00">.sv</text>
</g>
<!-- llhd_sim&#45;&gt;SVFile -->
<!-- llhd_sim&#45;&gt;CapNProto -->
<!-- llhd_sim&#45;&gt;TCL -->
<!-- CPPFile -->
<g id="node31" class="node">
<title>CPPFile</title>
<polygon fill="#7fc97f" stroke="black" points="269.5,-36 221.5,-36 221.5,0 275.5,0 275.5,-30 269.5,-36"/>
<polyline fill="none" stroke="black" points="269.5,-36 269.5,-30 "/>
<polyline fill="none" stroke="black" points="275.5,-30 269.5,-30 "/>
<text text-anchor="middle" x="248.5" y="-14.3" font-family="Times,serif" font-size="14.00">.cpp</text>
</g>
<!-- ExportSystemC&#45;&gt;CPPFile -->
<g id="edge33" class="edge">
<title>ExportSystemC&#45;&gt;CPPFile</title>
<path fill="none" stroke="black" d="M389.95,-143.97C373.74,-134.47 354.15,-121.79 338.5,-108 322.87,-94.23 323.01,-86.94 308.5,-72 298.79,-62.01 287.49,-51.72 277.33,-42.9"/>
<polygon fill="black" stroke="black" points="279.35,-40.02 269.48,-36.17 274.8,-45.33 279.35,-40.02"/>
</g>
<!-- ExportVerilog&#45;&gt;SVFile -->
<g id="edge27" class="edge">
<g id="edge30" class="edge">
<title>ExportVerilog&#45;&gt;SVFile</title>
<path fill="none" stroke="black" d="M417.94,-143.88C441.57,-132.92 472.1,-118.77 495.63,-107.86"/>
<polygon fill="black" stroke="black" points="497.31,-110.94 504.91,-103.56 494.37,-104.59 497.31,-110.94"/>
<path fill="none" stroke="black" d="M306.25,-143.7C317.34,-134.88 330.97,-124.03 342.99,-114.47"/>
<polygon fill="black" stroke="black" points="345.35,-117.07 351,-108.1 340.99,-111.59 345.35,-117.07"/>
</g>
<!-- PyCDE -->
<g id="node22" class="node">
<g id="node24" class="node">
<title>PyCDE</title>
<g id="a_node22"><a xlink:href="https://circt.llvm.org/docs/PyCDE/" xlink:title="PyCDE">
<polygon fill="#fdc086" stroke="black" points="459.5,-543 392.5,-543 392.5,-507 459.5,-507 459.5,-543"/>
<text text-anchor="middle" x="426" y="-521.3" font-family="Times,serif" font-size="14.00">PyCDE</text>
<g id="a_node24"><a xlink:href="https://circt.llvm.org/docs/PyCDE/" xlink:title="PyCDE">
<polygon fill="#fdc086" stroke="black" points="158,-543 91,-543 91,-507 158,-507 158,-543"/>
<text text-anchor="middle" x="124.5" y="-521.3" font-family="Times,serif" font-size="14.00">PyCDE</text>
</a>
</g>
</g>
<!-- PyCDE&#45;&gt;MSFT -->
<g id="edge39" class="edge">
<g id="edge43" class="edge">
<title>PyCDE&#45;&gt;MSFT</title>
<path fill="none" stroke="black" d="M426.99,-506.7C427.43,-498.98 427.96,-489.71 428.45,-481.11"/>
<polygon fill="black" stroke="black" points="431.95,-481.29 429.02,-471.1 424.96,-480.89 431.95,-481.29"/>
<path fill="none" stroke="black" d="M158.27,-510.79C162.04,-509.45 165.84,-508.16 169.5,-507 227.76,-488.56 247.08,-492.08 307.21,-471.56"/>
<polygon fill="black" stroke="black" points="308.52,-474.81 316.8,-468.2 306.21,-468.2 308.52,-474.81"/>
</g>
<!-- PyCDE&#45;&gt;ESI -->
<g id="edge38" class="edge">
<g id="edge42" class="edge">
<title>PyCDE&#45;&gt;ESI</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M392.39,-509.71C390.23,-508.79 388.08,-507.88 386,-507 351.04,-492.17 339.89,-488.67 303.33,-471.98"/>
<polygon fill="black" stroke="black" points="304.57,-468.7 294.02,-467.7 301.64,-475.06 304.57,-468.7"/>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M122.28,-506.7C121.28,-498.98 120.09,-489.71 118.99,-481.11"/>
<polygon fill="black" stroke="black" points="122.45,-480.58 117.7,-471.1 115.5,-481.47 122.45,-480.58"/>
</g>
<!-- PyCDE&#45;&gt;HWArith -->
<g id="edge40" class="edge">
<g id="edge44" class="edge">
<title>PyCDE&#45;&gt;HWArith</title>
<path fill="none" stroke="black" d="M406.47,-506.7C396.62,-497.97 384.51,-487.24 373.8,-477.75"/>
<polygon fill="black" stroke="black" points="376.11,-475.12 366.3,-471.1 371.47,-480.36 376.11,-475.12"/>
<path fill="none" stroke="black" d="M142.05,-506.7C150.73,-498.14 161.36,-487.66 170.85,-478.3"/>
<polygon fill="black" stroke="black" points="173.49,-480.62 178.15,-471.1 168.57,-475.63 173.49,-480.62"/>
</g>
<!-- Scheduling&#45;&gt;StaticLogic -->
<g id="edge16" class="edge">
<title>Scheduling&#45;&gt;StaticLogic</title>
<path fill="none" stroke="black" d="M119.25,-640.67C120.42,-635.55 121.64,-630.21 122.8,-625.1"/>
<polygon fill="black" stroke="black" points="115.77,-640.17 116.96,-650.7 122.6,-641.73 115.77,-640.17"/>
<polygon fill="black" stroke="black" points="126.27,-625.63 125.09,-615.1 119.45,-624.07 126.27,-625.63"/>
<path fill="none" stroke="black" d="M223,-640.95C224.67,-635.65 226.41,-630.1 228.07,-624.81"/>
<polygon fill="black" stroke="black" points="219.6,-640.11 219.94,-650.7 226.28,-642.21 219.6,-640.11"/>
<polygon fill="black" stroke="black" points="231.46,-625.69 231.12,-615.1 224.79,-623.59 231.46,-625.69"/>
</g>
<!-- Scheduling&#45;&gt;MSFT -->
<g id="edge41" class="edge">
<g id="edge45" class="edge">
<title>Scheduling&#45;&gt;MSFT</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M89.73,-643.18C83.37,-634.85 77.31,-625.09 74,-615 59.03,-569.39 42.02,-542.79 74,-507 119.63,-455.93 308.29,-487.37 390.68,-470.89"/>
<polygon fill="black" stroke="black" points="87.08,-645.46 96.11,-650.99 92.5,-641.03 87.08,-645.46"/>
<polygon fill="black" stroke="black" points="391.51,-474.3 400.42,-468.57 389.88,-467.49 391.51,-474.3"/>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M194.43,-642.17C189.17,-633.94 184.21,-624.49 181.5,-615 168.31,-568.85 152.52,-545.26 181.5,-507 215.3,-462.38 250.15,-488.29 307.07,-471.38"/>
<polygon fill="black" stroke="black" points="191.64,-644.28 200.17,-650.57 197.42,-640.33 191.64,-644.28"/>
<polygon fill="black" stroke="black" points="308.4,-474.63 316.78,-468.14 306.19,-467.99 308.4,-474.63"/>
</g>
<!-- Moore -->
<g id="node24" class="node">
<g id="node26" class="node">
<title>Moore</title>
<polygon fill="#ffff99" stroke="black" points="563.73,-298.54 563.73,-313.46 538.11,-324 501.89,-324 476.27,-313.46 476.27,-298.54 501.89,-288 538.11,-288 563.73,-298.54"/>
<text text-anchor="middle" x="520" y="-302.3" font-family="Times,serif" font-size="14.00">Moore</text>
<polygon fill="#ffff99" stroke="black" points="590.23,-298.54 590.23,-313.46 564.61,-324 528.39,-324 502.77,-313.46 502.77,-298.54 528.39,-288 564.61,-288 590.23,-298.54"/>
<text text-anchor="middle" x="546.5" y="-302.3" font-family="Times,serif" font-size="14.00">Moore</text>
</g>
<!-- Moore&#45;&gt;LLHD -->
<g id="edge23" class="edge">
<g id="edge26" class="edge">
<title>Moore&#45;&gt;LLHD</title>
<path fill="none" stroke="black" d="M478.87,-297.41C437.2,-289.16 370.92,-274.5 307.94,-252.8"/>
<polygon fill="black" stroke="black" points="308.86,-249.42 298.27,-249.4 306.54,-256.02 308.86,-249.42"/>
<path fill="none" stroke="black" d="M502.64,-300.77C446.24,-294.54 345.43,-280.72 254.34,-252.6"/>
<polygon fill="black" stroke="black" points="255.3,-249.24 244.71,-249.57 253.2,-255.91 255.3,-249.24"/>
</g>
<!-- Chisel -->
<g id="node25" class="node">
<g id="node27" class="node">
<title>Chisel</title>
<polygon fill="#ffff99" stroke="black" points="545.83,-752.54 545.83,-767.46 520.74,-778 485.26,-778 460.17,-767.46 460.17,-752.54 485.26,-742 520.74,-742 545.83,-752.54"/>
<text text-anchor="middle" x="503" y="-756.3" font-family="Times,serif" font-size="14.00">Chisel</text>
<polygon fill="#ffff99" stroke="black" points="572.33,-752.54 572.33,-767.46 547.24,-778 511.76,-778 486.67,-767.46 486.67,-752.54 511.76,-742 547.24,-742 572.33,-752.54"/>
<text text-anchor="middle" x="529.5" y="-756.3" font-family="Times,serif" font-size="14.00">Chisel</text>
</g>
<!-- FIRFile -->
<g id="node33" class="node">
<g id="node35" class="node">
<title>FIRFile</title>
<polygon fill="#7fc97f" stroke="black" points="524,-687 476,-687 476,-651 530,-651 530,-681 524,-687"/>
<polyline fill="none" stroke="black" points="524,-687 524,-681 "/>
<polyline fill="none" stroke="black" points="530,-681 524,-681 "/>
<text text-anchor="middle" x="503" y="-665.3" font-family="Times,serif" font-size="14.00">.fir</text>
<polygon fill="#7fc97f" stroke="black" points="550.5,-687 502.5,-687 502.5,-651 556.5,-651 556.5,-681 550.5,-687"/>
<polyline fill="none" stroke="black" points="550.5,-687 550.5,-681 "/>
<polyline fill="none" stroke="black" points="556.5,-681 550.5,-681 "/>
<text text-anchor="middle" x="529.5" y="-665.3" font-family="Times,serif" font-size="14.00">.fir</text>
</g>
<!-- Chisel&#45;&gt;FIRFile -->
<g id="edge17" class="edge">
<title>Chisel&#45;&gt;FIRFile</title>
<path fill="none" stroke="black" d="M503,-741.84C503,-729.28 503,-711.98 503,-697.5"/>
<polygon fill="black" stroke="black" points="506.5,-697.11 503,-687.11 499.5,-697.11 506.5,-697.11"/>
<path fill="none" stroke="black" d="M529.5,-741.84C529.5,-729.28 529.5,-711.98 529.5,-697.5"/>
<polygon fill="black" stroke="black" points="533,-697.11 529.5,-687.11 526,-697.11 533,-697.11"/>
</g>
<!-- Calyx_native&#45;&gt;SVFile -->
<g id="edge28" class="edge">
<g id="edge31" class="edge">
<title>Calyx_native&#45;&gt;SVFile</title>
<path fill="none" stroke="black" d="M546.22,-143.7C542.81,-135.9 539.28,-126.51 536.46,-117.83"/>
<polygon fill="black" stroke="black" points="539.77,-116.67 533.52,-108.1 533.06,-118.69 539.77,-116.67"/>
<path fill="none" stroke="black" d="M528.82,-147.96C516.29,-144.09 502.86,-139.86 490.5,-136 453.72,-124.52 441.04,-123.78 409.42,-111.86"/>
<polygon fill="black" stroke="black" points="410.55,-108.54 399.96,-108.18 408.01,-115.07 410.55,-108.54"/>
</g>
<!-- Calyx_native&#45;&gt;SVFile -->
<!-- CPPFile -->
<g id="node29" class="node">
<title>CPPFile</title>
<polygon fill="#7fc97f" stroke="black" points="292,-36 244,-36 244,0 298,0 298,-30 292,-36"/>
<polyline fill="none" stroke="black" points="292,-36 292,-30 "/>
<polyline fill="none" stroke="black" points="298,-30 292,-30 "/>
<text text-anchor="middle" x="271" y="-14.3" font-family="Times,serif" font-size="14.00">.cpp</text>
</g>
<!-- Circilator&#45;&gt;CPPFile -->
<g id="edge29" class="edge">
<g id="edge32" class="edge">
<title>Circilator&#45;&gt;CPPFile</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M271,-71.7C271,-63.98 271,-54.71 271,-46.11"/>
<polygon fill="black" stroke="black" points="274.5,-46.1 271,-36.1 267.5,-46.1 274.5,-46.1"/>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M192.79,-71.7C201.93,-63.05 213.14,-52.45 223.1,-43.03"/>
<polygon fill="black" stroke="black" points="225.56,-45.52 230.42,-36.1 220.75,-40.43 225.56,-45.52"/>
</g>
<!-- FIRFile&#45;&gt;FIRRTLParser -->
<g id="edge18" class="edge">
<title>FIRFile&#45;&gt;FIRRTLParser</title>
<path fill="none" stroke="black" d="M480.93,-650.87C448.36,-625.6 387.34,-578.25 350.52,-549.68"/>
<polygon fill="black" stroke="black" points="352.2,-546.55 342.15,-543.19 347.91,-552.08 352.2,-546.55"/>
<path fill="none" stroke="black" d="M556.5,-651.89C569.03,-642.8 582.64,-630.2 589.5,-615 596.08,-600.41 598.89,-591.95 589.5,-579 568.16,-549.56 529.98,-536.17 496.05,-530.21"/>
<polygon fill="black" stroke="black" points="496.57,-526.75 486.15,-528.65 495.48,-533.66 496.57,-526.75"/>
</g>
<!-- PyFile -->
<g id="node35" class="node">
<g id="node37" class="node">
<title>PyFile</title>
<polygon fill="#7fc97f" stroke="black" points="524,-615 476,-615 476,-579 530,-579 530,-609 524,-615"/>
<polyline fill="none" stroke="black" points="524,-615 524,-609 "/>
<polyline fill="none" stroke="black" points="530,-609 524,-609 "/>
<text text-anchor="middle" x="503" y="-593.3" font-family="Times,serif" font-size="14.00">.py</text>
<polygon fill="#7fc97f" stroke="black" points="550.5,-615 502.5,-615 502.5,-579 556.5,-579 556.5,-609 550.5,-615"/>
<polyline fill="none" stroke="black" points="550.5,-615 550.5,-609 "/>
<polyline fill="none" stroke="black" points="556.5,-609 550.5,-609 "/>
<text text-anchor="middle" x="529.5" y="-593.3" font-family="Times,serif" font-size="14.00">.py</text>
</g>
<!-- FIRFile&#45;&gt;PyFile -->
<!-- SVVHDL -->
<g id="node34" class="node">
<g id="node36" class="node">
<title>SVVHDL</title>
<polygon fill="#7fc97f" stroke="black" points="550,-399 484,-399 484,-363 556,-363 556,-393 550,-399"/>
<polyline fill="none" stroke="black" points="550,-399 550,-393 "/>
<polyline fill="none" stroke="black" points="556,-393 550,-393 "/>
<text text-anchor="middle" x="520" y="-377.3" font-family="Times,serif" font-size="14.00">.sv/.vhd</text>
<polygon fill="#7fc97f" stroke="black" points="576.5,-399 510.5,-399 510.5,-363 582.5,-363 582.5,-393 576.5,-399"/>
<polyline fill="none" stroke="black" points="576.5,-399 576.5,-393 "/>
<polyline fill="none" stroke="black" points="582.5,-393 576.5,-393 "/>
<text text-anchor="middle" x="546.5" y="-377.3" font-family="Times,serif" font-size="14.00">.sv/.vhd</text>
</g>
<!-- SVVHDL&#45;&gt;Moore -->
<g id="edge22" class="edge">
<g id="edge25" class="edge">
<title>SVVHDL&#45;&gt;Moore</title>
<path fill="none" stroke="black" d="M520,-362.7C520,-354.25 520,-343.87 520,-334.37"/>
<polygon fill="black" stroke="black" points="523.5,-334.18 520,-324.18 516.5,-334.18 523.5,-334.18"/>
<path fill="none" stroke="black" d="M546.5,-362.7C546.5,-354.25 546.5,-343.87 546.5,-334.37"/>
<polygon fill="black" stroke="black" points="550,-334.18 546.5,-324.18 543,-334.18 550,-334.18"/>
</g>
<!-- PyFile&#45;&gt;PyCDE -->
<g id="edge37" class="edge">
<g id="edge41" class="edge">
<title>PyFile&#45;&gt;PyCDE</title>
<path fill="none" stroke="black" d="M483.97,-578.7C474.46,-570.05 462.79,-559.45 452.43,-550.03"/>
<polygon fill="black" stroke="black" points="454.57,-547.24 444.81,-543.1 449.86,-552.42 454.57,-547.24"/>
<path fill="none" stroke="black" d="M502.21,-580.66C500.64,-580.05 499.06,-579.48 497.5,-579 362.5,-537.11 319.99,-571.31 181.5,-543 177.05,-542.09 172.46,-540.99 167.89,-539.8"/>
<polygon fill="black" stroke="black" points="168.58,-536.36 158.01,-537.06 166.71,-543.1 168.58,-536.36"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,30 @@
//===- HWToSystemC.h - HW to SystemC pass entry point ---------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This header file defines prototypes that expose the HWToSystemC pass
// constructors.
//
//===----------------------------------------------------------------------===//
#ifndef CIRCT_CONVERSION_HWTOSYSTEMC_HWTOSYSTEMC_H_
#define CIRCT_CONVERSION_HWTOSYSTEMC_HWTOSYSTEMC_H_
#include <memory>
namespace mlir {
template <typename T>
class OperationPass;
class ModuleOp;
} // namespace mlir
namespace circt {
std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
createConvertHWToSystemCPass();
} // namespace circt
#endif // CIRCT_CONVERSION_HWTOSYSTEMC_HWTOSYSTEMC_H_

View File

@ -20,6 +20,7 @@
#include "circt/Conversion/FSMToSV.h"
#include "circt/Conversion/HWArithToHW.h"
#include "circt/Conversion/HWToLLHD.h"
#include "circt/Conversion/HWToSystemC.h"
#include "circt/Conversion/HandshakeToFIRRTL.h"
#include "circt/Conversion/HandshakeToHW.h"
#include "circt/Conversion/LLHDToLLVM.h"

View File

@ -264,6 +264,19 @@ def ConvertHWToLLHD : Pass<"convert-hw-to-llhd", "mlir::ModuleOp"> {
let dependentDialects = ["llhd::LLHDDialect"];
}
//===----------------------------------------------------------------------===//
// HWToSystemC
//===----------------------------------------------------------------------===//
def ConvertHWToSystemC : Pass<"convert-hw-to-systemc", "mlir::ModuleOp"> {
let summary = "Convert HW to SystemC";
let description = [{
This pass translates a HW design into an equivalent SystemC design.
}];
let constructor = "circt::createConvertHWToSystemCPass()";
let dependentDialects = ["systemc::SystemCDialect"];
}
//===----------------------------------------------------------------------===//
// StandardToHandshake
//===----------------------------------------------------------------------===//

View File

@ -23,3 +23,4 @@ add_subdirectory(Seq)
add_subdirectory(SV)
add_subdirectory(StaticLogic)
add_subdirectory(HWArith)
add_subdirectory(SystemC)

View File

@ -0,0 +1,16 @@
add_circt_dialect(SystemC systemc)
add_circt_dialect_doc(SystemC systemc)
set(LLVM_TARGET_DEFINITIONS SystemC.td)
mlir_tablegen(SystemCEnums.h.inc -gen-enum-decls)
mlir_tablegen(SystemCEnums.cpp.inc -gen-enum-defs)
add_public_tablegen_target(CIRCTSystemCEnumsIncGen)
add_dependencies(circt-headers CIRCTSystemCEnumsIncGen)
mlir_tablegen(SystemCAttributes.h.inc -gen-attrdef-decls
-attrdefs-dialect SystemCDialect)
mlir_tablegen(SystemCAttributes.cpp.inc -gen-attrdef-defs
-attrdefs-dialect SystemCDialect)
add_public_tablegen_target(CIRCTSystemCAttributesIncGen)
add_dependencies(circt-headers CIRCTSystemCAttributesIncGen)

View File

@ -0,0 +1,33 @@
//===- SystemC.td - SystemC dialect definition -------------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This is the top level file for the SystemC dialect.
//
//===----------------------------------------------------------------------===//
#ifndef CIRCT_DIALECT_SYSTEMC_SYSTEMC
#define CIRCT_DIALECT_SYSTEMC_SYSTEMC
include "mlir/IR/AttrTypeBase.td"
include "mlir/IR/OpBase.td"
include "mlir/IR/SymbolInterfaces.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
include "circt/Dialect/SystemC/SystemCDialect.td"
// Base class for the operations in this dialect.
class SystemCOp<string mnemonic, list<Trait> traits = []> :
Op<SystemCDialect, mnemonic, traits>;
include "circt/Dialect/SystemC/SystemCTypesImpl.td"
include "circt/Dialect/SystemC/SystemCTypes.td"
include "circt/Dialect/SystemC/SystemCExpressions.td"
include "circt/Dialect/SystemC/SystemCStatements.td"
include "circt/Dialect/SystemC/SystemCStructure.td"
#endif // CIRCT_DIALECT_SYSTEMC_SYSTEMC

View File

@ -0,0 +1,21 @@
//===- SystemCDialect.h - SystemC dialect declaration -----------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file defines a SystemC MLIR dialect.
//
//===----------------------------------------------------------------------===//
#ifndef CIRCT_DIALECT_SYSTEMC_SYSTEMCDIALECT_H
#define CIRCT_DIALECT_SYSTEMC_SYSTEMCDIALECT_H
#include "mlir/IR/Dialect.h"
// Pull in the dialect definition.
#include "circt/Dialect/SystemC/SystemCDialect.h.inc"
#endif // CIRCT_DIALECT_SYSTEMC_SYSTEMCDIALECT_H

View File

@ -0,0 +1,32 @@
//===- SystemCDialect.td - SystemC dialect definition ------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This contains the SystemC dialect definition to be included in other files.
//
//===----------------------------------------------------------------------===//
#ifndef CIRCT_DIALECT_SYSTEMC_SYSTEMCDIALECT
#define CIRCT_DIALECT_SYSTEMC_SYSTEMCDIALECT
def SystemCDialect : Dialect {
let name = "systemc";
let summary = "Types and operations for the SystemC dialect";
let description = [{
This dialect defines the `systemc` dialect, which represents various
constructs of the SystemC library (IEEE 1666-2011) useful for emission.
}];
let cppNamespace = "::circt::systemc";
let extraClassDeclaration = [{
/// Register all SystemC types.
void registerTypes();
}];
int emitAccessorPrefix = kEmitAccessorPrefix_Prefixed;
}
#endif // CIRCT_DIALECT_SYSTEMC_SYSTEMCDIALECT

View File

@ -0,0 +1,12 @@
//===- SystemCExpressions.td - SystemC expression ops ------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This describes the ops for SystemC expressions.
//
//===----------------------------------------------------------------------===//

View File

@ -0,0 +1,25 @@
//===- SystemCOps.h - Declare SystemC dialect operations --------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file declares the operation classes for the SystemC dialect.
//
//===----------------------------------------------------------------------===//
#ifndef CIRCT_DIALECT_SYSTEMC_SYSTEMCOPS_H
#define CIRCT_DIALECT_SYSTEMC_SYSTEMCOPS_H
#include "circt/Dialect/SystemC/SystemCDialect.h"
#include "circt/Dialect/SystemC/SystemCTypes.h"
#include "mlir/IR/OpImplementation.h"
#define GET_OP_CLASSES
#include "circt/Dialect/SystemC/SystemCEnums.h.inc"
// Clang format shouldn't reorder these headers.
#include "circt/Dialect/SystemC/SystemC.h.inc"
#endif // CIRCT_DIALECT_SYSTEMC_SYSTEMCOPS_H

View File

@ -0,0 +1,12 @@
//===- SystemCStatements.td - SystemC statements ops -------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This describes the ops for SystemC statements.
//
//===----------------------------------------------------------------------===//

View File

@ -0,0 +1,25 @@
//===- SystemCStructure.td - SystemC structure ops ---------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This describes ops with regions for SystemC to structure other ops, such as
// modules, methods, etc.
//
//===----------------------------------------------------------------------===//
def CtorOp : SystemCOp<"ctor", [SingleBlock, NoTerminator]> {
let summary = "A constructor definition.";
let description = [{
Represents the SC_CTOR macro as described in IEEE 1666-2011 §5.2.7.
The name of the module being constructed does not have to be passed
to this operation, but is automatically added during emission.
}];
let regions = (region SizedRegion<1>:$body);
let assemblyFormat = "$body attr-dict";
}

View File

@ -0,0 +1,23 @@
//===- SystemCTypes.h - Declare SystemC dialect types ------------*- C++-*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file declares the types for the SystemC dialect.
//
//===----------------------------------------------------------------------===//
#ifndef CIRCT_DIALECT_SYSTEMC_SYSTEMCTYPES_H
#define CIRCT_DIALECT_SYSTEMC_SYSTEMCTYPES_H
#include "mlir/IR/Attributes.h"
#include "mlir/IR/Types.h"
// Include generated types.
#define GET_TYPEDEF_CLASSES
#include "circt/Dialect/SystemC/SystemCTypes.h.inc"
#endif // CIRCT_DIALECT_SYSTEMC_SYSTEMCTYPES_H

View File

@ -0,0 +1,21 @@
//===- SystemCTypes.td - SystemC type definitions ----------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Types for the SystemC dialect. Includable in other dialects.
//
//===----------------------------------------------------------------------===//
#ifndef CIRCT_DIALECT_SYSTEMC_SYSTEMCTYPES
#define CIRCT_DIALECT_SYSTEMC_SYSTEMCTYPES
include "circt/Dialect/SystemC/SystemCDialect.td"
class SystemCType<Pred condition, string description, string cppClassName>
: DialectType<SystemCDialect, condition, description, cppClassName>;
#endif // CIRCT_DIALECT_SYSTEMC_SYSTEMCTYPES

View File

@ -0,0 +1,15 @@
//===- SystemCTypesImpl.td - SystemC type implementations --*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Type implementations for the SystemC dialect.
//
//===----------------------------------------------------------------------===//
include "mlir/IR/EnumAttr.td"
class SystemCTypeDef<string name> : TypeDef<SystemCDialect, name> { }

View File

@ -29,6 +29,7 @@
#include "circt/Dialect/SV/SVDialect.h"
#include "circt/Dialect/Seq/SeqDialect.h"
#include "circt/Dialect/StaticLogic/StaticLogic.h"
#include "circt/Dialect/SystemC/SystemCDialect.h"
#include "mlir/IR/Dialect.h"
namespace circt {
@ -51,7 +52,8 @@ inline void registerAllDialects(mlir::DialectRegistry &registry) {
seq::SeqDialect,
staticlogic::StaticLogicDialect,
sv::SVDialect,
hwarith::HWArithDialect
hwarith::HWArithDialect,
systemc::SystemCDialect
>();
// clang-format on
}

View File

@ -4,6 +4,7 @@ add_subdirectory(ExportVerilog)
add_subdirectory(FIRRTLToHW)
add_subdirectory(HWArithToHW)
add_subdirectory(HWToLLHD)
add_subdirectory(HWToSystemC)
add_subdirectory(HandshakeToFIRRTL)
add_subdirectory(HandshakeToHW)
add_subdirectory(LLHDToLLVM)

View File

@ -0,0 +1,14 @@
add_circt_conversion_library(CIRCTHWToSystemC
HWToSystemC.cpp
DEPENDS
CIRCTConversionPassIncGen
LINK_COMPONENTS
Core
LINK_LIBS PUBLIC
CIRCTSystemC
CIRCTHW
MLIRTransforms
)

View File

@ -0,0 +1,62 @@
//===- HWToSystemC.cpp - HW To SystemC Conversion Pass --------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This is the main HW to SystemC Conversion Pass Implementation.
//
//===----------------------------------------------------------------------===//
#include "circt/Conversion/HWToSystemC.h"
#include "../PassDetail.h"
#include "circt/Dialect/HW/HWOps.h"
#include "circt/Dialect/SystemC/SystemCOps.h"
#include "mlir/IR/BuiltinDialect.h"
#include "mlir/Transforms/DialectConversion.h"
#include "llvm/ADT/TypeSwitch.h"
using namespace mlir;
using namespace circt;
using namespace hw;
//===----------------------------------------------------------------------===//
// Conversion Infrastructure
//===----------------------------------------------------------------------===//
static void populateLegality(ConversionTarget &target) {
target.addIllegalDialect<HWDialect>();
target.addLegalDialect<mlir::BuiltinDialect>();
target.addLegalDialect<systemc::SystemCDialect>();
}
//===----------------------------------------------------------------------===//
// HW to SystemC Conversion Pass
//===----------------------------------------------------------------------===//
namespace {
struct HWToSystemCPass : public ConvertHWToSystemCBase<HWToSystemCPass> {
void runOnOperation() override;
};
} // namespace
/// Create a HW to SystemC dialects conversion pass.
std::unique_ptr<OperationPass<ModuleOp>> circt::createConvertHWToSystemCPass() {
return std::make_unique<HWToSystemCPass>();
}
/// This is the main entrypoint for the HW to SystemC conversion pass.
void HWToSystemCPass::runOnOperation() {
MLIRContext &context = getContext();
ModuleOp module = getOperation();
ConversionTarget target(context);
TypeConverter typeConverter;
RewritePatternSet patterns(&context);
populateLegality(target);
if (failed(applyFullConversion(module, target, std::move(patterns))))
signalPassFailure();
}

View File

@ -98,6 +98,10 @@ namespace fsm {
class FSMDialect;
} // namespace fsm
namespace systemc {
class SystemCDialect;
} // namespace systemc
// Generate the classes which represent the passes
#define GEN_PASS_CLASSES
#include "circt/Conversion/Passes.h.inc"

View File

@ -23,3 +23,4 @@ add_subdirectory(Seq)
add_subdirectory(SV)
add_subdirectory(StaticLogic)
add_subdirectory(HWArith)
add_subdirectory(SystemC)

View File

@ -0,0 +1,22 @@
add_circt_dialect_library(CIRCTSystemC
SystemCDialect.cpp
SystemCTypes.cpp
SystemCOps.cpp
ADDITIONAL_HEADER_DIRS
${CIRCT_MAIN_INCLUDE_DIR}/circt/Dialect/SystemC
DEPENDS
MLIRSystemCIncGen
CIRCTSystemCAttributesIncGen
CIRCTSystemCEnumsIncGen
LINK_COMPONENTS
Support
LINK_LIBS PUBLIC
MLIRIR
MLIRInferTypeOpInterface
)
add_dependencies(circt-headers MLIRSystemCIncGen)

View File

@ -0,0 +1,33 @@
//===- SystemCDialect.cpp - Implement the SystemC dialect -----------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file implements the SystemC dialect.
//
//===----------------------------------------------------------------------===//
#include "circt/Dialect/SystemC/SystemCOps.h"
using namespace circt;
using namespace circt::systemc;
//===----------------------------------------------------------------------===//
// Dialect specification.
//===----------------------------------------------------------------------===//
void SystemCDialect::initialize() {
// Register types.
registerTypes();
// Register operations.
addOperations<
#define GET_OP_LIST
#include "circt/Dialect/SystemC/SystemC.cpp.inc"
>();
}
#include "circt/Dialect/SystemC/SystemCDialect.cpp.inc"

View File

@ -0,0 +1,26 @@
//===- SystemCOps.cpp - Implement the SystemC operations ------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file implements the SystemC ops.
//
//===----------------------------------------------------------------------===//
#include "circt/Dialect/SystemC/SystemCOps.h"
#include "mlir/IR/Builders.h"
using namespace circt;
using namespace circt::systemc;
//===----------------------------------------------------------------------===//
// TableGen generated logic.
//===----------------------------------------------------------------------===//
// Provide the autogenerated implementation guts for the Op classes.
#define GET_OP_CLASSES
#include "circt/Dialect/SystemC/SystemC.cpp.inc"
#include "circt/Dialect/SystemC/SystemCEnums.cpp.inc"

View File

@ -0,0 +1,31 @@
//===- SystemCTypes.cpp - Implement the SystemC types ---------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file implements the SystemC dialect type system.
//
//===----------------------------------------------------------------------===//
#include "circt/Dialect/SystemC/SystemCTypes.h"
#include "circt/Dialect/SystemC/SystemCDialect.h"
using namespace circt;
using namespace circt::systemc;
//===----------------------------------------------------------------------===//
// Generated logic
//===----------------------------------------------------------------------===//
#define GET_TYPEDEF_CLASSES
#include "circt/Dialect/SystemC/SystemCTypes.cpp.inc"
void SystemCDialect::registerTypes() {
addTypes<
#define GET_TYPEDEF_LIST
#include "circt/Dialect/SystemC/SystemCTypes.cpp.inc"
>();
}

View File

@ -0,0 +1,9 @@
// RUN: circt-opt %s | FileCheck %s
// CHECK-LABEL: @ctor
hw.module @ctor () {
//CHECK-NEXT: systemc.ctor {
systemc.ctor {
//CHECK-NEXT: }
}
}

View File

@ -27,3 +27,4 @@
// DIALECT-NEXT: seq
// DIALECT-NEXT: staticlogic
// DIALECT-NEXT: sv
// DIALECT-NEXT: systemc

View File

@ -35,6 +35,7 @@ target_link_libraries(circt-opt
CIRCTHWArith
CIRCTHWArithToHW
CIRCTHWToLLHD
CIRCTHWToSystemC
CIRCTHWTransforms
CIRCTSCFToCalyx
CIRCTScheduling
@ -47,6 +48,8 @@ target_link_libraries(circt-opt
CIRCTStaticLogicToCalyx
CIRCTSV
CIRCTSVTransforms
CIRCTHWArith
CIRCTSystemC
CIRCTTransforms
MLIRIR

View File

@ -26,6 +26,7 @@ target_link_libraries(circt-reduce
CIRCTStaticLogicOps
CIRCTHWArith
CIRCTSV
CIRCTSystemC
MLIRIR
MLIRParser