Skip to content

Commit 5f90e53

Browse files
Merge branch 'master' into temp_net_cost_ref
2 parents d2e9d85 + a342b67 commit 5f90e53

File tree

833 files changed

+62993
-18398
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

833 files changed

+62993
-18398
lines changed

.github/workflows/nightly_test.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ jobs:
6262
- {test: "vtr_reg_strong", cores: "16", options: "", cmake: "-DVTR_ASSERT_LEVEL=3", extra_pkgs: "libeigen3-dev"}
6363
- {test: "vtr_reg_strong_odin", cores: "16", options: "", cmake: "-DVTR_ASSERT_LEVEL=3 -DWITH_ODIN=ON", extra_pkgs: "libeigen3-dev"}
6464
- {test: "vtr_reg_strong_odin", cores: "16", options: "-skip_qor", cmake: "-DVTR_ASSERT_LEVEL=3 -DVTR_ENABLE_SANITIZE=ON -DWITH_ODIN=ON", extra_pkgs: "libeigen3-dev"}
65-
- {test: "vtr_reg_system_verilog", cores: "16", options: "", cmake: "-DYOSYS_F4PGA_PLUGINS=ON", extra_pkgs: ""}
65+
# - {test: "vtr_reg_system_verilog", cores: "16", options: "", cmake: "-DYOSYS_F4PGA_PLUGINS=ON", extra_pkgs: ""} # Test turned off -> F4PGA conflicts with Yosys (version 42)
6666
- {test: "odin_reg_strong", cores: "16", options: "", cmake: "-DWITH_ODIN=ON", extra_pkgs: ""}
67-
- {test: "parmys_reg_strong", cores: "16", options: "", cmake: "-DYOSYS_F4PGA_PLUGINS=ON", extra_pkgs: ""}
67+
- {test: "parmys_reg_strong", cores: "16", options: "", cmake: "-DYOSYS_F4PGA_PLUGINS=OFF", extra_pkgs: ""}
6868

6969
env:
7070
DEBIAN_FRONTEND: "noninteractive"

doc/src/arch/reference.rst

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2031,17 +2031,40 @@ The ``<segment>`` tag and its contents are described below.
20312031
.. arch:tag:: <mux name="string"/>
20322032
20332033
:req_param name: Name of the mux switch type used to drive this type of segment by default, from both block outputs and other wires. This information is used during rr-graph construction, and a custom switch block can override this switch type for specific connections if desired.
2034+
The switch type specified with the <mux> tag will be used for both the incrementing and decrementing wires within this segment.
2035+
If more control is needed, the mux_inc and mux_dec tags can be used to assign different muxes to drive incremental and decremental wires within the segment.
20342036
20352037
.. note:: For UNIDIRECTIONAL only.
20362038
20372039
Tag must be included and ``name`` must be the same as the name you give in ``<switch type="mux" name="...``
20382040
2041+
.. arch:tag:: <mux_inc name="string"/>
2042+
2043+
:req_param name:
2044+
Name of the mux switch type used to drive the incremental wires in this segment from both block outputs and other wires.
2045+
Incremental wires are tracks within this segment that are heading in the "right" direction on the x-axis and the "top" direction on the y-axis.
2046+
This information is used during rr-graph construction, and a custom switch block can override this switch type for specific connections if desired.
2047+
2048+
.. note:: For UNIDIRECTIONAL only.
2049+
2050+
.. arch:tag:: <mux_dec name="string">
2051+
2052+
:req_param name:
2053+
Name of the mux switch type used to drive the decremental wires in this segment from both block outputs and other wires.
2054+
Incremental wires are tracks within this segment that are heading in the "left" direction on the x-axis and the "bottom" direction on the y-axis.
2055+
This information is used during rr-graph construction, and a custom switch block can override this switch type for specific connections if desired.
2056+
2057+
.. note:: For UNIDIRECTIONAL only.
2058+
2059+
.. note:: For unidirectional segments, either <mux> tag or both <mux_inc> and <mux_dec> should be defined in the architecture file. If only the <mux> tag is defined, we assume that the same mux drives both incremental and decremental wires within this segment.
2060+
20392061
.. arch:tag:: <mux_inter_die name="string"/>
20402062
20412063
:req_param name: Name of the mux switch type used to drive this segment type when the driver (block outputs and other wires) is located on a different die than the segment. This information is utilized during rr-graph construction.
20422064

20432065
Tag must be included and ``name`` must be the same as the name you give in ``<switch type="mux" name="...``
20442066

2067+
20452068
.. arch:tag:: <wire_switch name="string"/>
20462069
20472070
:req_param name: Name of the switch type used by other wires to drive this type of segment by default. This information is used during rr-graph construction, and a custom switch block can override this switch type for specific connections if desired.

doc/src/vpr/file_formats.rst

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -616,27 +616,32 @@ The io pad is set to inpad mode and is driven by the inpad:
616616

617617
Placement File Format (.place)
618618
------------------------------
619+
The placement file format is used to specify the position of cluster-level blocks in an FPGA design. It includes information about the netlist and architecture files, the size of the logic block array, and the placement details of each block in the CLB netlist..
620+
619621
The first line of the placement file lists the netlist (.net) and architecture (.xml) files used to create this placement.
620-
This information is used to ensure you are warned if you accidentally route this placement with a different architecture or netlist file later.
622+
This information is used to ensure you are warned if you accidentally route this placement with a different architecture or netlist file later.
621623
The second line of the file gives the size of the logic block array used by this placement.
622-
All the following lines have the format::
623624

624-
block_name x y subtile_number
625+
All subsequent lines follow this format:
626+
627+
block_name x y subblk [layer_number] [#block_number]
628+
629+
- **block_name**: Refers to either:
630+
- The name of a clustered block, as given in the input .net formatted netlist.
631+
- The name of a primitive within a clustered block.
625632

626-
The ``block_name`` can refer to either:
633+
- **x** and **y**: Represent the row and column in which the block is placed, respectively.
627634

628-
- The name of a clustered block, as given in the input .net formatted netlist.
629-
- The name of a primitive within a clustered block.
635+
- **subblk**: Specifies which of several possible subtile locations in row **x** and column **y** contains this block, which is useful when the tile capacity is greater than 1. The subtile number should be in the range `0` to `(grid[i][j].capacity - 1)`. The subtile numbers for a particular **x, y** location do not have to be used in order.
630636

631-
``x`` and ``y`` are the row and column in which the block is placed, respectively.
637+
- **layer_number**: Indicates the layer (or die) on which the block is placed. If omitted, the block is assumed to be placed on layer `0` (a single die system). In 3D FPGA architectures, multiple dies can be stacked, with the bottom die considered as layer `0`.
638+
639+
The placement files output by VPR also include (as a comment) an extra field: the id (number) of the block in the CLB netlist. This is the internal index used by VPR to identify a CLB level block -- it may be useful to know this index if you are modifying VPR and trying to debug something.
632640

633641
.. note:: The blocks in a placement file can be listed in any order.
634642

635-
Since we can have more than one block in a row or column when the block capacity is set to be greater than 1 in the architecture file, the subtile number specifies which of the several possible subtile locations in row x and column y contains this block.
636-
Note that the subtile number used should be in the range 0 to (grid[i][j].capacity - 1). The subtile numbers for a particular x,y location do not have to be used in order.
637643

638-
The placement files output by VPR also include (as a comment) a fifth field: the block number.
639-
This is the internal index used by VPR to identify a block -- it may be useful to know this index if you are modifying VPR and trying to debug something.
644+
.. note:: A `#` character on a line indicates that all text after the `#` to the end of a line is a comment.
640645

641646
.. _fig_fpga_coord_system:
642647

@@ -653,10 +658,10 @@ All pads either have x equal to ``0`` or ``nx + 1`` or y equal to ``0`` or ``ny
653658

654659
Placement File Format Example
655660
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
656-
An example placement file is:
661+
657662

658663
.. code-block:: none
659-
:caption: Example placement file.
664+
:caption: Example 2D Placement File
660665
:linenos:
661666
662667
Netlist file: xor5.net Architecture file: sample.xml
@@ -673,6 +678,23 @@ An example placement file is:
673678
xor5 1 2 0 #6
674679
[1] 1 1 0 #7
675680
681+
.. code-block:: none
682+
:caption: Example 3D Placement File with Layer Column
683+
:linenos:
684+
685+
Netlist file: xor5.net Architecture file: sample.xml
686+
Array size: 2 x 2 logic blocks
687+
688+
#block name x y subblk layer block number
689+
#---------- -- -- ------- ------ -----------
690+
a 0 1 0 0 #0 -- NB: block number is a comment.
691+
b 1 0 0 1 #1
692+
c 0 2 1 0 #2
693+
d 1 3 0 1 #3
694+
e 1 3 1 0 #4
695+
out:xor5 0 2 0 1 #5
696+
xor5 1 2 0 0 #6
697+
[1] 1 1 0 1 #7
676698
677699
.. _vpr_route_file:
678700

libs/libarchfpga/src/physical_types.h

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,7 +1567,16 @@ enum e_Fc_type {
15671567
* relation to the switches from the architecture file, *
15681568
* not the expanded list of switches that is built *
15691569
* at the end of build_rr_graph *
1570-
* *
1570+
* @param arch_wire_switch_dec: Same as arch_wire_switch but used only for *
1571+
* decremental tracks if it is specified in the *
1572+
* architecture file. If -1, this value was not set in *
1573+
* the architecture file and arch_wire_switch should be *
1574+
* used for "DEC_DIR" wire segments. *
1575+
* @param arch_opin_switch_dec: Same as arch_opin_switch but used only for *
1576+
* decremental tracks if it is specified in the *
1577+
* architecture file. If -1, this value was not set in *
1578+
* the architecture file and arch_opin_switch should be *
1579+
* used for "DEC_DIR" wire segments. *
15711580
* @param arch_opin_between_dice_switch: Index of the switch type that *
15721581
* connects output pins (OPINs) *to* this segment from *
15731582
* *another die (layer)*. Note that this index is in *
@@ -1585,14 +1594,14 @@ enum e_Fc_type {
15851594
* Cmetal: Capacitance of a routing track, per unit logic block length. *
15861595
* Rmetal: Resistance of a routing track, per unit logic block length. *
15871596
* (UDSD by AY) drivers: How do signals driving a routing track connect to *
1588-
* the track?
1597+
* the track? *
15891598
* seg_index: The index of the segment as stored in the appropriate Segs list*
15901599
* Upon loading the architecture, we use this field to keep track *
15911600
* the segment's index in the unified segment_inf vector. This is *
15921601
* useful when building the rr_graph for different Y & X channels *
1593-
* in terms of track distribution and segment type. *
1602+
* in terms of track distribution and segment type. *
15941603
* res_type: Determines the routing network to which the segment belongs. *
1595-
* Possible values are:
1604+
* Possible values are: *
15961605
* - GENERAL: The segment is part of the general routing *
15971606
* resources. *
15981607
* - GCLK: The segment is part of the global routing network. *
@@ -1606,6 +1615,8 @@ struct t_segment_inf {
16061615
int length;
16071616
short arch_wire_switch;
16081617
short arch_opin_switch;
1618+
short arch_wire_switch_dec = -1;
1619+
short arch_opin_switch_dec = -1;
16091620
short arch_opin_between_dice_switch = -1;
16101621
float frac_cb;
16111622
float frac_sb;

libs/libarchfpga/src/read_xml_arch_file.cpp

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3766,6 +3766,10 @@ static void ProcessSegments(pugi::xml_node Parent,
37663766
//Unidir requires the following tags
37673767
expected_subtags.emplace_back("mux");
37683768
expected_subtags.emplace_back("mux_inter_die");
3769+
//with the following two tags, we can allow the architecture file to define
3770+
//different muxes with different delays for wires with different directions
3771+
expected_subtags.emplace_back("mux_inc");
3772+
expected_subtags.emplace_back("mux_dec");
37693773
}
37703774

37713775
else {
@@ -3796,28 +3800,78 @@ static void ProcessSegments(pugi::xml_node Parent,
37963800
/* Get the wire and opin switches, or mux switch if unidir */
37973801
if (UNI_DIRECTIONAL == Segs[i].directionality) {
37983802
//Get the switch name for same die wire and track connections
3799-
SubElem = get_single_child(Node, "mux", loc_data);
3800-
tmp = get_attribute(SubElem, "name", loc_data).value();
3801-
3802-
/* Match names */
3803-
for (j = 0; j < NumSwitches; ++j) {
3804-
if (0 == strcmp(tmp, Switches[j].name.c_str())) {
3805-
break; /* End loop so j is where we want it */
3803+
SubElem = get_single_child(Node, "mux", loc_data, ReqOpt::OPTIONAL);
3804+
tmp = get_attribute(SubElem, "name", loc_data, ReqOpt::OPTIONAL).as_string(nullptr);
3805+
3806+
//check if <mux> tag is defined in the architecture, otherwise we should look for <mux_inc> and <mux_dec>
3807+
if(tmp){
3808+
/* Match names */
3809+
for (j = 0; j < NumSwitches; ++j) {
3810+
if (0 == strcmp(tmp, Switches[j].name.c_str())) {
3811+
break; /* End loop so j is where we want it */
3812+
}
38063813
}
3814+
if (j >= NumSwitches) {
3815+
archfpga_throw(loc_data.filename_c_str(), loc_data.line(SubElem),
3816+
"'%s' is not a valid mux name.\n", tmp);
3817+
}
3818+
3819+
/* Unidir muxes must have the same switch
3820+
* for wire and opin fanin since there is
3821+
* really only the mux in unidir. */
3822+
Segs[i].arch_wire_switch = j;
3823+
Segs[i].arch_opin_switch = j;
38073824
}
3808-
if (j >= NumSwitches) {
3809-
archfpga_throw(loc_data.filename_c_str(), loc_data.line(SubElem),
3810-
"'%s' is not a valid mux name.\n", tmp);
3811-
}
3825+
else { //if a general mux is not defined, we should look for specific mux for each direction in the architecture file
3826+
SubElem = get_single_child(Node, "mux_inc", loc_data, ReqOpt::OPTIONAL);
3827+
tmp = get_attribute(SubElem, "name", loc_data, ReqOpt::OPTIONAL).as_string(nullptr);
3828+
if(!tmp){
3829+
archfpga_throw(loc_data.filename_c_str(), loc_data.line(SubElem),
3830+
"if mux is not specified in a wire segment, both mux_inc and mux_dec should be specified");
3831+
} else{
3832+
/* Match names */
3833+
for (j = 0; j < NumSwitches; ++j) {
3834+
if (0 == strcmp(tmp, Switches[j].name.c_str())) {
3835+
break; /* End loop so j is where we want it */
3836+
}
3837+
}
3838+
if (j >= NumSwitches) {
3839+
archfpga_throw(loc_data.filename_c_str(), loc_data.line(SubElem),
3840+
"'%s' is not a valid mux name.\n", tmp);
3841+
}
38123842

3813-
/* Unidir muxes must have the same switch
3814-
* for wire and opin fanin since there is
3815-
* really only the mux in unidir. */
3816-
Segs[i].arch_wire_switch = j;
3817-
Segs[i].arch_opin_switch = j;
3843+
/* Unidir muxes must have the same switch
3844+
* for wire and opin fanin since there is
3845+
* really only the mux in unidir. */
3846+
Segs[i].arch_wire_switch = j;
3847+
Segs[i].arch_opin_switch = j;
3848+
}
38183849

3819-
}
3850+
SubElem = get_single_child(Node, "mux_dec", loc_data, ReqOpt::OPTIONAL);
3851+
tmp = get_attribute(SubElem, "name", loc_data, ReqOpt::OPTIONAL).as_string(nullptr);
3852+
if(!tmp){
3853+
archfpga_throw(loc_data.filename_c_str(), loc_data.line(SubElem),
3854+
"if mux is not specified in a wire segment, both mux_inc and mux_dec should be specified");
3855+
} else{
3856+
/* Match names */
3857+
for (j = 0; j < NumSwitches; ++j) {
3858+
if (0 == strcmp(tmp, Switches[j].name.c_str())) {
3859+
break; /* End loop so j is where we want it */
3860+
}
3861+
}
3862+
if (j >= NumSwitches) {
3863+
archfpga_throw(loc_data.filename_c_str(), loc_data.line(SubElem),
3864+
"'%s' is not a valid mux name.\n", tmp);
3865+
}
38203866

3867+
/* Unidir muxes must have the same switch
3868+
* for wire and opin fanin since there is
3869+
* really only the mux in unidir. */
3870+
Segs[i].arch_wire_switch_dec = j;
3871+
Segs[i].arch_opin_switch_dec = j;
3872+
}
3873+
}
3874+
}
38213875
else {
38223876
VTR_ASSERT(BI_DIRECTIONAL == Segs[i].directionality);
38233877
SubElem = get_single_child(Node, "wire_switch", loc_data);

parmys/regression_test/benchmark/suite/koios_weekly_suite/task_list.conf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ regression_test/benchmark/task/koios/koios_large
22
regression_test/benchmark/task/koios/koios_large_no_hb
33
regression_test/benchmark/task/koios/koios_proxy
44
regression_test/benchmark/task/koios/koios_proxy_no_hb
5-
regression_test/benchmark/task/koios/koios_sv
6-
regression_test/benchmark/task/koios/koios_sv_no_hb
5+
#regression_test/benchmark/task/koios/koios_sv
6+
#regression_test/benchmark/task/koios/koios_sv_no_hb

0 commit comments

Comments
 (0)