Skip to content

Global Nets Routing constraints #2446

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 71 commits into from
Jun 4, 2024
Merged
Show file tree
Hide file tree
Changes from 58 commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
dda93e6
Add a new variable to t_segment_inf_struct that sets whether the segm…
kimiatkh Jul 26, 2023
e9ceea4
Update the architecture XML parser to add support for res_type attrib…
kimiatkh Jul 26, 2023
0b546ac
Update the RRGraph XML parser to add support for res_type attribute a…
kimiatkh Jul 26, 2023
1b71564
Add setter and getter for res_type attribute in t_segment_inf
kimiatkh Jul 26, 2023
204e93c
Set res_type attribute to GCLK for segments added during creation of …
kimiatkh Jul 26, 2023
b4ba730
Merge branch 'master' into clock_resource_detection
kimiatkh Jul 26, 2023
7ba41d8
Fix a bug in segment_res_type setter
kimiatkh Jul 31, 2023
3095426
Add clk_res_type attribute to rr node tag to detect the virtual sink …
kimiatkh Jul 31, 2023
f4e3c64
Move the clock virtual sink node id from device context to rr_graph_s…
kimiatkh Jul 31, 2023
3c1fd46
Add getters and setters for clk_res_type and write the attribute to t…
kimiatkh Aug 1, 2023
d463cdd
Rename the segment resource type from GENERIC to GENERAL as GENERIC c…
kimiatkh Aug 1, 2023
dc268cb
Undo unwanted changes
kimiatkh Aug 1, 2023
1c71627
Merge
kimiatkh Aug 1, 2023
ca5ba48
Changing the type of virtual sink node id from int to RRNodeId
kimiatkh Aug 2, 2023
1200f7a
Add a new optional attribute called name to rr_nodes that can be used…
kimiatkh Aug 8, 2023
fad6d66
Fix a bug in router that caused the second stage of the two stage rou…
kimiatkh Aug 8, 2023
af2c801
Create an unordered map to store more than one virtual sink ids
kimiatkh Aug 8, 2023
e79d3c5
Modify the parser to add support for attribute name and clk_res_type
kimiatkh Aug 14, 2023
71910f3
Fix a segmentation fault when writing the rr node names
kimiatkh Aug 15, 2023
b3689e4
Update the capnp parser to support new attributes name and clk_res_ty…
kimiatkh Aug 15, 2023
7e5ff68
Update the capnp parser to support new attributes name and clk_res_ty…
kimiatkh Aug 15, 2023
460b2a7
Modify rr graph parser not to throw an error when string name is empty
kimiatkh Aug 15, 2023
b4e7e33
Added the RouteConstraint class containing the routing constraint for…
Tulong4Dev Jan 26, 2023
1611242
make format
amin1377 Aug 24, 2023
8f9399d
Redefine the route constraints class
kimiatkh Aug 31, 2023
bbe9076
Encapsulate the floorplan constraints in user_place_constraints class…
kimiatkh Aug 31, 2023
b969445
Update the files using floor plan constraints file to point to the ne…
kimiatkh Aug 31, 2023
cd38989
Add a function that applies the routing constraints read from the con…
kimiatkh Aug 31, 2023
9736316
Update the VPR constraints paraser to process the routing constraints…
kimiatkh Aug 31, 2023
570947a
Update the clock network builder to assign a default name to the virt…
kimiatkh Aug 31, 2023
71c05cf
Update the router to repect the routing constraints provided by the u…
kimiatkh Aug 31, 2023
99c2a53
Add a regression tests for routing constraints
kimiatkh Aug 31, 2023
f9789b2
Merge
kimiatkh Nov 16, 2023
f2200f1
Merge branch 'clock_resource_detection' of https://github.com/verilog…
kimiatkh Nov 16, 2023
d700aa4
Merge
kimiatkh Nov 16, 2023
55e3445
Merge
kimiatkh Nov 16, 2023
37fcafc
Fix the compile errors after merging master
kimiatkh Nov 20, 2023
9541a86
Add routing constraint reg test to the task list
kimiatkh Nov 21, 2023
ce7dbc3
Fix the comments for the newly added functions related to clock network
kimiatkh Nov 27, 2023
06360f6
Convert enum r_seg_res_type to enum class
kimiatkh Nov 27, 2023
d85311d
Update the documentation for segment tag to include the new attribute…
kimiatkh Nov 27, 2023
342784f
Convert all function and class comments to doxygen format
kimiatkh Nov 28, 2023
fd0af8e
Add comments for apply_route_constraints function
kimiatkh Nov 28, 2023
c2e6a55
Convert comments to doxygen format
kimiatkh Nov 28, 2023
c336f09
Fix the compile errors caused by converting SegResType to enum class
kimiatkh Nov 28, 2023
9c862ec
Call place and route methods after fetching constraints instance thro…
kimiatkh Nov 28, 2023
b9c8775
Add the code that allows VPR to respect the global net routing constr…
kimiatkh Nov 30, 2023
8bbd7e9
Fix a syntax error in log printing of routing constraints
kimiatkh Nov 30, 2023
9364e9f
Change the default_clock_network_name from extern variable to a membe…
kimiatkh Nov 30, 2023
f217f82
Merge branch 'master' into routing_constraints
kimiatkh Nov 30, 2023
c8c8865
Update the golden results for routing constraints test
kimiatkh Jan 5, 2024
f1e513c
Merge branch 'master' into routing_constraints
kimiatkh Jan 5, 2024
70b911f
Add documentation for global routing constraints
kimiatkh Jan 9, 2024
1882daa
Add a section to documentation for global route constraints
kimiatkh Jan 9, 2024
fe5b660
Create a new documentation page for VPR constraints with references t…
kimiatkh Jan 9, 2024
835f4d0
Add a new custom domain for vpr constraints file format
kimiatkh Jan 9, 2024
60cc65b
Update references to vpr placement constraints documentation page
kimiatkh Jan 9, 2024
925834f
Add a reference to global routing constraints file in clock network d…
kimiatkh Jan 9, 2024
d3c17e5
Add an exception in update_from_heap to not set _is_isink_reached whe…
kimiatkh Apr 26, 2024
9d9f14a
Remove a depracted warning from packer
kimiatkh Apr 26, 2024
ff06e15
Merge
kimiatkh Jun 2, 2024
904d190
Fix the regression test for routing constraints
kimiatkh Jun 2, 2024
a1d213e
Remove the input argument from the function alloc_and_load_is_clock w…
kimiatkh Jun 2, 2024
a4a4a42
Fix the compile error
kimiatkh Jun 2, 2024
1e7c90d
Fix compile error
kimiatkh Jun 3, 2024
b70e728
Fix typos in the added documentation
kimiatkh Jun 3, 2024
1afe1c5
Don't compare expected node count with the rr_nodes count in the pres…
kimiatkh Jun 3, 2024
9de1631
Add an example for clock network definition in rr graphs
kimiatkh Jun 4, 2024
5c65093
Update the golden results for routing constraints regression tests
kimiatkh Jun 4, 2024
f976e9c
Merge branch 'master' into routing_constraints
vaughnbetz Jun 4, 2024
32983bc
Merge remote-tracking branch 'origin/master' into routing_constraints
AlexandreSinger Jun 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dev/pylint_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
repo_path / "doc/_exts/rrgraphdomain/__init__.py",
repo_path / "doc/_exts/sdcdomain/__init__.py",
repo_path / "doc/_exts/archdomain/__init__.py",
repo_path / "doc/_exts/constraintsdomain/__init__.py",
repo_path / "vpr/scripts/compare_timing_reports.py",
repo_path / "vpr/scripts/profile/util.py",
repo_path / "vpr/scripts/profile/parse_and_plot_detailed.py",
Expand Down
27 changes: 27 additions & 0 deletions doc/_exts/constraintsdomain/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from sphinxcontrib.domaintools import custom_domain
from sphinx.util.docfields import *


def setup(app):
app.add_domain(
custom_domain(
"VPRConstraintsDomain",
name="vpr_constraints",
label="Place and Route Constraints",
elements=dict(
tag=dict(
objname="Attribute",
indextemplate="pair: %s; Tag Attribute",
fields=[
GroupedField(
"required_parameter", label="Required Attributes", names=["req_param"]
),
GroupedField(
"optional_parameter", label="Optional Attributes", names=["opt_param"]
),
Field("required", label="Tag Required", names=["required"]),
],
),
),
)
)
7 changes: 6 additions & 1 deletion doc/src/arch/reference.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1955,7 +1955,7 @@ Wire Segments
The content within the ``<segmentlist>`` tag consists of a group of ``<segment>`` tags.
The ``<segment>`` tag and its contents are described below.

.. arch:tag:: <segment axis="{x|y}" name="unique_name" length="int" type="{bidir|unidir}" freq="float" Rmetal="float" Cmetal="float">content</segment>
.. arch:tag:: <segment axis="{x|y}" name="unique_name" length="int" type="{bidir|unidir}" res_type="{GCLK|GENERAL}" freq="float" Rmetal="float" Cmetal="float">content</segment>


:opt_param axis:
Expand All @@ -1975,6 +1975,10 @@ The ``<segment>`` tag and its contents are described below.

.. note:: ``longline`` is only supported on with ``bidir`` routing

:opt_param res_type:
Specifies whether the segment belongs to the general or a clock routing network. If this tag is not specified, the resource type for
the segment is considered to be GENERAL.

:req_param freq:
The supply of routing tracks composed of this type of segment.
VPR automatically determines the percentage of tracks for each segment type by taking the frequency for the type specified and dividing with the sum of all frequencies.
Expand Down Expand Up @@ -2092,6 +2096,7 @@ Specifing a Clock Architecture

The element ``<clocknetworks>`` contains three sub-elements that collectively describe the clock architecture: the wiring parameters ``<metal_layers>``, the clock distribution ``<clock_network>``, and the clock connectivity ``<clock_routing>``.

.. note:: The clock network architecture defined in this structure is assigned the fixed default name ``"clock_network"``. When the user wants to specify a net to be routed through the defined clock architecture using a :ref:`global routing constraints file <global_routing_constraints>`, the network name attribute in the constraint tag must be set to ``"clock_network"``.

.. _clock_arch_example:

Expand Down
1 change: 1 addition & 0 deletions doc/src/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"sphinx_markdown_tables",
"sdcdomain",
"archdomain",
"constraintsdomain",
"rrgraphdomain",
"myst_parser",
"sphinx.ext.autodoc",
Expand Down
4 changes: 2 additions & 2 deletions doc/src/vpr/command_line_usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -360,11 +360,11 @@ Use the options below to override this default naming behaviour.

.. option:: --read_vpr_constraints <file>

Reads the :ref:`floorplanning constraints <vpr_constraints_file>` that packing and placement must respect from the specified XML file.
Reads the :ref:`VPR constraints <vpr_constraints>` that the flow must respect from the specified XML file.

.. option:: --write_vpr_constraints <file>

Writes out new :ref:`floorplanning constraints <vpr_constraints_file>` based on current placement to the specified XML file.
Writes out new :ref:`floorplanning constraints <placement_constraints>` based on current placement to the specified XML file.

.. option:: --read_router_lookahead <file>

Expand Down
66 changes: 66 additions & 0 deletions doc/src/vpr/global_routing_constraints.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
Global Routing Constraints
==========================
.. _global_routing_constraints:

VPR allows users to designate specific nets in the input netlist as global and define the routing model for the global nets by utilizing a VPR constraints XML file. These routing constraints for global nets are specified inside the VPR constraints file in XML format, as described in the following section.

A Global Routing Constraints File Example
------------------------------------------

.. code-block:: xml
:caption: An example of a global routing constraints file in XML format.
:linenos:

<vpr_constraints tool_name="vpr">
<global_route_constraints>
<set_global_signal name="clock*" route_model="dedicated_network" network_name="clock_network"/>
</global_route_constraints>
</vpr_constraints>


Global Routing Constraints File Format
---------------------------------------
.. _global_routing_constraints_file_format:

.. vpr_constraints:tag:: <global_route_constraints>content</global_route_constraints>

Content inside this tag contains a group of ``<set_global_signal>`` tags that specify the global nets and their assigned routing methods.

.. vpr_constraints:tag:: <set_global_signal name="string" route_model="{ideal|route|dedicated_network}" network_name="string"/>

:req_param name: The name of the net to be assigned as global. Regular expressions are also accepted.
:req_param route_model: The route model for the specified net.

* ``ideal``: The net is not routed. There would be no delay for the global net.

* ``route``: The net is routed similarly to other nets using generic routing resources.

* ``dedicated_network``: The net will be routed through a dedicated clock network.

:req_param network_name: The name of the clock network through which the net is routed. This parameter is required when ``route_model="dedicated_network"``.


Dedicated Clock Networks
--------------------------

Users can define a clock architecture in two ways. First, through the architecture description outlined in section :ref:`Clocks <clock_architecture>`. By using the ``<clocknetworks>`` tag, users can establish a single clock architecture with the fixed default name "clock_network". When routing a net through the dedicated network described with this tag, the network name must be set to ``"clock_network"``.

Alternatively, users can define a custom clock network architecture by inputting a custom resource routing graph. In this approach, users can specify various clock routing networks, such as a global clock network and multiple regional clock networks. There are three main considerations for defining a clock network through a custom RR graph definition, as described in the following sections.

Virtual Sinks Definition for Clock Networks
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
For VPR to route global nets within defined clock networks, there needs to be a virtual sink node defined in the RR graph per each clock network. This virtual sink, which is of the type ``"SINK"``, must have incoming edges from all drive points of the clock network. The two-stage router used for global net routing will initially route to the virtual sink (which serves as the entry point of the clock network) in the first stage and then from the entry point to the actual sink of the net in the second stage.

To indicate that a node represents a clock network virtual sink, users can utilize the ``"clk_res_type"`` attribute on a node setting it to ``"VIRTUAL_SINK"``.

Distinguishing Between Clock Networks
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Given the support for multiple clock networks, VPR needs a way to distinguish between different virtual sinks belonging to various clock networks. This is achieved through the optional ``"name"`` attribute for the rr_node, accepting a string used as the clock network name. Therefore, when the ``"clk_res_type"`` is set to ``"VIRTUAL_SINK"``, the attribute ``"name"`` becomes a requried parameter to enable VPR to determine which clock netwrok the virtual sink belongs to.

When specifying the network_name in a global routing constraints file for routing a global net through a desired clock network, as described in the :ref:`above <global_routing_constraints_file_format>` section, the name defined as an attribute in the virtual sink of the clock network should be used to reference that clock network.

Segment Definition for Clock Networks
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The node types ``"CHANX"`` and ``"CHANY"`` can construct the clock routing architecture, similar to a generic routing network. However, to identify nodes that are part of a clock network, one can define unique segments for clock networks. To indicate that a segment defined is a clock network resource, users can use the optional attribute ``res_type="GCLK"``. Therefore, nodes with a segment ID of this defined segment are considered to be part of a clock network.

While VPR currently does not leverage this distinction of clock network resources, it is recommended to use the ``res_type="GCLK"`` attribute, as this preparation ensures compatibility for future support.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be good to add an example of clock network routing here. You'd give little snippets of each file that together would make sense.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have added an example at the end of the Dedicated Clock Networks section. It contains snapshots of an RR graph related to the clock network along with some explanation. Could you please take a look and let me know if you have any comments?

2 changes: 1 addition & 1 deletion doc/src/vpr/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ The purpose of VPR is to make the packing, placement, and routing stages of the
graphics

timing_constraints
placement_constraints
vpr_constraints
sdc_commands

file_formats
Expand Down
47 changes: 23 additions & 24 deletions doc/src/vpr/placement_constraints.rst
Original file line number Diff line number Diff line change
@@ -1,39 +1,40 @@

VPR Placement Constraints
=========================
.. _vpr_constraints_file:
Placement Constraints
======================
.. _placement_constraints:

VPR supports running flows with placement constraints. Placement constraints are set on primitives to lock them down to specified regions on the FPGA chip. For example, a user may use placement constraints to lock down pins to specific locations on the chip. Also, groups of primitives may be locked down to regions on the chip in CAD flows that use floorplanning or modular design, or to hand-place a timing critical piece.

The placement constraints should be specified by the user using an XML constraints file format, as described in the section below. When VPR is run with placement constraints, both the packing and placement flows are performed in such a way that the constraints are respected. The packing stage does not pack any primitives together that have conflicting floorplan constraints. The placement stage considers the floorplan constraints when choosing a location for each clustered block during initial placement, and does not move any block outside of its constraint boundaries during place moves.

A Constraints File Example
--------------------------
A Placement Constraints File Example
------------------------------------

.. code-block:: xml
:caption: An example of a placement constraints file in XML format.
:linenos:

<vpr_constraints tool_name="vpr">
<partition_list>
<partition name="Part0">
<add_atom name_pattern="li354"/>
<add_atom name_pattern="alu*"/> <!-- Regular expressions can be used to provide name patterns of the primitives to be added -->
<add_atom name_pattern="n877"/>
<add_region x_low="3" y_low="1" x_high="7" y_high="2"/> <!-- Two rectangular regions are specified, together describing an L-shaped region -->
<add_region x_low="7" y_low="3" x_high="7" y_high="6"/>
</partition>
<partition name="Part1">
<add_region x_low="3" y_low="3" x_high="7" y_high="7" subtile="0"/> <!-- One specific location is specified -->
<add_atom name_pattern="n4917"/>
<add_atom name_pattern="n6010"/>
</partition>
</partition_list>
<partition_list>
<partition name="Part0">
<add_atom name_pattern="li354"/>
<add_atom name_pattern="alu*"/> <!-- Regular expressions can be used to provide name patterns of the primitives to be added -->
<add_atom name_pattern="n877"/>
<add_region x_low="3" y_low="1" x_high="7" y_high="2"/> <!-- Two rectangular regions are specified, together describing an L-shaped region -->
<add_region x_low="7" y_low="3" x_high="7" y_high="6"/>
</partition>
<partition name="Part1">
<add_region x_low="3" y_low="3" x_high="7" y_high="7" subtile="0"/> <!-- One specific location is specified -->
<add_atom name_pattern="n4917"/>
<add_atom name_pattern="n6010"/>
</partition>
</partition_list>
</vpr_constraints>

.. _end:

Constraints File Format
-----------------------
Placement Constraints File Format
---------------------------------

VPR has a specific XML format which must be used when creating a placement constraints file. The purpose of this constraints file is to specify

Expand All @@ -42,9 +43,7 @@ VPR has a specific XML format which must be used when creating a placement const

The file is passed as an input to VPR when running with placement constraints. When the file is read in, its information is used during the packing and placement stages of VPR. The hierarchy of the file is set up as follows.

.. note:: Use the VPR option :vpr:option:`--read_vpr_constraints` to specify the VPR placement constraints file that is to be loaded.

The top level tag is the ``<vpr_constraints>`` tag. This tag contains one ``<partition_list>`` tag. The ``<partition_list>`` tag can be made up of an unbounded number of ``<partition>`` tags. The ``<partition>`` tags contains all of the detailed information of the placement constraints, and is described in detail below.
The top level tag is the ``<vpr_constraints>`` tag. This tag can contain one ``<partition_list>`` tag. The ``<partition_list>`` tag can be made up of an unbounded number of ``<partition>`` tags. The ``<partition>`` tags contains all of the detailed information of the placement constraints, and is described in detail below.

Partitions, Atoms, and Regions
------------------------------
Expand Down
32 changes: 32 additions & 0 deletions doc/src/vpr/vpr_constraints.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
VPR Constraints
=========================
.. _vpr_constraints:

VPR allows users to run the flow with placement constraints that enable primitives to be locked down to a specific region on the chip and global routing constraints that facilitate the routing of global nets through clock networks.

Users can specify these constraints through a constraints file in XML format, as shown in the format below.

.. code-block:: xml
:caption: The overall format of a VPR constraints file
:linenos:

<vpr_constraints tool_name="vpr">
<partition_list>
<!-- Placement constraints are specified inside this tag -->
</partition_list>
<global_route_constraints>
<!-- Global routing constraints are specified inside this tag -->
</global_route_constraints>
</vpr_constraints>

.. note:: Use the VPR option :option:`vpr --read_vpr_constraints` to specify the VPR constraints file that is to be loaded.

The top-level tag is the ``<vpr_constraints>`` tag. This tag can contain ``<partition_list>`` and ``<global_route_constraints>`` tags. The ``<partition_list>`` tag contains information related to placement constraints, while ``<global_route_constraints>`` contains information about global routing constraints. The details for each of these constraints are given in the respective sections :ref:`Placement Constraints <placement_constraints>` and :ref:`Global Route Constraints <global_routing_constraints>`.

.. toctree::
:maxdepth: 2

placement_constraints
global_routing_constraints


26 changes: 26 additions & 0 deletions libs/libarchfpga/src/physical_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -1508,6 +1508,22 @@ enum e_parallel_axis {
Y_AXIS,
BOTH_AXIS
};

/**
* @brief An attribute of a segment that defines the general category of the wire segment type.
*
* @details
* - `GCLK`: A segment type that is part of the global routing network for clocks.
* - `GENERAL`: Describes a segment type that is part of the regular routing network.
*/
enum class SegResType {
GCLK = 0,
GENERAL = 1,
NUM_RES_TYPES
};

constexpr std::array<const char*, static_cast<size_t>(SegResType::NUM_RES_TYPES)> RES_TYPE_STRING = {{"GCLK", "GENERAL"}}; //String versions of segment resource types

enum e_switch_block_type {
SUBSET,
WILTON,
Expand Down Expand Up @@ -1560,6 +1576,14 @@ enum e_Fc_type {
* the segment's index in the unified segment_inf vector. This is *
* usefull when building the rr_graph for different Y & X channels*
* interms of track distribution and segment type. *
* res_type: Determines the routing network to which the segment belongs. *
* Possible values are:
* - GENERAL: The segment is part of the general routing *
* resources. *
* - GCLK: The segment is part of the global routing network. *
* For backward compatibility, this attribute is optional. If not *
* specified, the resource type for the segment is considered to *
* be GENERAL. *
* meta: Table storing extra arbitrary metadata attributes. */
struct t_segment_inf {
std::string name;
Expand All @@ -1578,6 +1602,7 @@ struct t_segment_inf {
std::vector<bool> cb;
std::vector<bool> sb;
int seg_index;
enum SegResType res_type = SegResType::GENERAL;
//float Cmetal_per_m; /* Wire capacitance (per meter) */
};

Expand Down Expand Up @@ -2001,6 +2026,7 @@ struct t_arch {

std::string gnd_net = "$__gnd_net";
std::string vcc_net = "$__vcc_net";
std::string default_clock_network_name = "clock_network";

// Luts
std::vector<t_lut_cell> lut_cells;
Expand Down
12 changes: 12 additions & 0 deletions libs/libarchfpga/src/read_xml_arch_file.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3722,6 +3722,18 @@ static void ProcessSegments(pugi::xml_node Parent,
y_axis_seg_found = true;
}

/*Get segment resource type*/
tmp = get_attribute(Node, "res_type", loc_data, ReqOpt::OPTIONAL).as_string(nullptr);

if (tmp) {
auto it = std::find(RES_TYPE_STRING.begin(), RES_TYPE_STRING.end(), tmp);
if (it != RES_TYPE_STRING.end()) {
Segs[i].res_type = static_cast<SegResType>(std::distance(RES_TYPE_STRING.begin(), it));
} else {
archfpga_throw(loc_data.filename_c_str(), loc_data.line(Node), "Unsopported segment res_type: %s\n", tmp);
}
}

/* Get Power info */
/*
* (*Segs)[i].Cmetal_per_m = get_attribute(Node, "Cmetal_per_m", false,
Expand Down
3 changes: 1 addition & 2 deletions libs/librrgraph/src/base/check_rr_graph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ void check_rr_graph(const RRGraphView& rr_graph,
const DeviceGrid& grid,
const t_chan_width& chan_width,
const t_graph_type graph_type,
const int virtual_clock_network_root_idx,
bool is_flat) {
e_route_type route_type = DETAILED;
if (graph_type == GRAPH_GLOBAL) {
Expand All @@ -76,7 +75,7 @@ void check_rr_graph(const RRGraphView& rr_graph,
}

// Virtual clock network sink is special, ignore.
if (virtual_clock_network_root_idx == int(inode)) {
if (rr_graph.is_virtual_clock_network_root(rr_node)) {
continue;
}

Expand Down
1 change: 0 additions & 1 deletion libs/librrgraph/src/base/check_rr_graph.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ void check_rr_graph(const RRGraphView& rr_graph,
const DeviceGrid& grid,
const t_chan_width& chan_width,
const t_graph_type graph_type,
const int virtual_clock_network_root_idx,
bool is_flat);

void check_rr_node(const RRGraphView& rr_graph,
Expand Down
Loading