Skip to content

Commit 26a6387

Browse files
authored
Merge branch 'master' into fix_mult
2 parents e20ee6f + b8c96bc commit 26a6387

File tree

262 files changed

+14073
-9086
lines changed

Some content is hidden

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

262 files changed

+14073
-9086
lines changed

doc/src/Images/Overall_view.png

-125 KB
Loading
27 KB
Loading

doc/src/arch/reference.rst

Lines changed: 88 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -582,10 +582,12 @@ Grid Layout Example
582582
Example FPGA grid
583583
584584
585-
.. arch:tag:: <interposer_cut dim=x|y loc="int"/>
585+
.. arch:tag:: <interposer_cut x="int" y="int"/>
586586
587-
:req_param dim: Dimension or axis of the cut. 'X' or 'x' means a horizontal cut while 'Y' or 'y' means a vertical cut.
588-
:req_param loc: Location of the cut. Cuts are done above or to the right of the tiles at coordinate 'loc'. For example a cut with dim=x and loc=0 would cut the vertical wires above tiles in the 0th row. Currently only integer values are supported.
587+
:opt_param x: Specifies the x-coordinate of a vertical interposer cut.
588+
:opt_param y: Specifies the y-coordinate of a horizontal interposer cut.
589+
590+
.. note:: Exactly one of the ``x`` or ``y`` attributes must be specified.
589591
590592
.. note:: Interposers are experimental and are currently not supported by VPR and using the related tags will not actually result in any changes to the flow.
591593
Defines an interposer cut for modelling 2.5D interposer-based architectures. An interposer cut will cut all connections at location 'loc' along the axis 'dim' Leaving the two sides completely unconnected.
@@ -2363,6 +2365,8 @@ Direct Inter-block Connections
23632365
The content within the ``<directlist>`` tag consists of a group of ``<direct>`` tags.
23642366
The ``<direct>`` tag and its contents are described below.
23652367

2368+
.. note:: ``from_pin`` and ``to_pin`` only support big endian! For example, ``clb.out[8:0]``
2369+
23662370
.. arch:tag:: <direct name="string" from_pin="string" to_pin="string" x_offset="int" y_offset="int" z_offset="int" switch_name="string" from_side="{left|right|top|bottom}" to_side="{left|right|top|bottom}"/>
23672371
23682372
:req_param name: is a unique alphanumeric string to name the connection.
@@ -2382,12 +2386,89 @@ The ``<direct>`` tag and its contents are described below.
23822386
The ``from_side`` and ``to_side`` options can usually be left unspecified.
23832387
However they can be used to explicitly control how direct connections to physically equivalent pins (which may appear on multiple sides) are handled.
23842388

2385-
**Example:**
2386-
Consider a carry chain where the ``cout`` of each CLB drives the ``cin`` of the CLB immediately below it, using the delay-less switch one would enter the following:
2389+
**Example: Inter-tile connection**
2390+
Consider a carry chain where the ``cout`` of each CLB drives the ``cin`` of the CLB immediately below it, using the delay-less switch one would enter the following:
23872391

2388-
.. code-block:: xml
2392+
.. code-block:: xml
2393+
2394+
<direct name="adder_carry" from_pin="clb.cout" to_pin="clb.cin" x_offset="0" y_offset="-1" z_offset="0"/>
2395+
2396+
**Example: Inner-tile feedback**
2397+
2398+
Consider a feedback connection where the ``out`` of each CLB drives the ``in`` of the CLB in the same location, using the connection block switch one would enter the following:
2399+
2400+
.. code-block:: xml
2401+
2402+
<direct name="feedback" from_pin="clb.out" to_pin="clb.in" x_offset="0" y_offset="0" z_offset="0" switch_name="cb_mux"/>
2403+
2404+
**Example: Cross-sub-tile connection**
2405+
2406+
In this example, a tile ``cim8_1k`` is defined, under which there are two types of sub-tiles:
2407+
2408+
- ``mult_8``: the first sub-tile
2409+
- ``memory``: the second, and the third sub-tile
2410+
2411+
.. code-block:: xml
2412+
2413+
<tile name="cim8_1k" height="2" area="396000">
2414+
<sub_tile name="mult_8" capacity="1">
2415+
<equivalent_sites>
2416+
<site pb_type="mult_8" pin_mapping="direct"/>
2417+
</equivalent_sites>
2418+
<input name="a" num_pins="8"/>
2419+
<input name="b" num_pins="8"/>
2420+
<output name="out" num_pins="16"/>
2421+
<fc in_type="frac" in_val="0.15" out_type="frac" out_val="0.10">
2422+
<fc_override port_name="out" fc_type="frac" fc_val="0"/>
2423+
</fc>
2424+
<pinlocations pattern="custom">
2425+
<loc side="left"/>
2426+
<loc side="top"/>
2427+
<loc side="right" yoffset="0">mult_8.a[0:2] mult_8.b[0:2] mult_8.out[0:5]</loc>
2428+
<loc side="right" yoffset="1">mult_8.a[3:5] mult_8.b[3:5] mult_8.out[6:10]</loc>
2429+
<loc side="bottom">mult_8.a[6:7] mult_8.b[6:7] mult_8.out[11:15]</loc>
2430+
</pinlocations>
2431+
</sub_tile>
2432+
<sub_tile name="memory" capacity="2">
2433+
<equivalent_sites>
2434+
<site pb_type="memory"/>
2435+
</equivalent_sites>
2436+
<input name="waddr" num_pins="7"/>
2437+
<input name="raddr" num_pins="7"/>
2438+
<input name="data_in" num_pins="8"/>
2439+
<input name="wen" num_pins="1"/>
2440+
<input name="ren" num_pins="1"/>
2441+
<output name="data_out" num_pins="8"/>
2442+
<clock name="clk" num_pins="1"/>
2443+
<fc in_type="frac" in_val="0.15" out_type="frac" out_val="0.10">
2444+
<fc_override port_name="clk" fc_type="frac" fc_val="0"/>
2445+
<fc_override port_name="data_in" fc_type="frac" fc_val="0"/>
2446+
</fc>
2447+
<pinlocations pattern="custom">
2448+
<loc side="left" yoffset="0">memory.clk memory.waddr[0:0] memory.raddr[0:0] memory.data_in[0:0] memory.data_out[0:0]</loc>
2449+
<loc side="left" yoffset="1">memory.waddr[1:1] memory.raddr[1:1] memory.data_in[1:1] memory.data_out[1:1]</loc>
2450+
<loc side="top" yoffset="1">memory.waddr[2:2] memory.raddr[2:2] memory.data_in[2:2] memory.data_out[2:2] memory.waddr[3:3] memory.raddr[3:3] memory.data_in[3:3] memory.data_out[3:3]</loc>
2451+
<loc side="right" yoffset="0">memory.waddr[4:4] memory.raddr[4:4] memory.data_in[4:4] memory.data_out[4:4]</loc>
2452+
<loc side="right" yoffset="1">memory.waddr[5:5] memory.raddr[5:5] memory.data_in[5:5] memory.data_out[5:5]</loc>
2453+
<loc side="bottom" yoffset="0">memory.wen memory.waddr[6:6] memory.raddr[6:6] memory.data_in[6:6] memory.data_out[6:6] memory.ren memory.data_in[7:7] memory.data_out[7:7]</loc>
2454+
</pinlocations>
2455+
</sub_tile>
2456+
</tile>
2457+
2458+
As shown in :numref:`fig_example_subtile_direct_connection`, consider a connection where the ``out`` of a sub tile ``mult_8`` of tile ``cim8_1k`` drives the ``data_in`` of the sub tile ``memory`` of tile ``cim8_1k`` with an offset, using the delayless switch one would enter the following:
2459+
2460+
.. code-block:: xml
2461+
2462+
<direct name="cim_direct0" from_pin="cim8_1k.out[7:0]" to_pin="cim8_1k.data_in[7:0]" x_offset="0" y_offset="0" z_offset="1"/>
2463+
<direct name="cim_direct1" from_pin="cim8_1k.out[15:8]" to_pin="cim8_1k.data_in[7:0]" x_offset="0" y_offset="0" z_offset="2"/>
2464+
2465+
.. _fig_example_subtile_direct_connection:
2466+
2467+
.. figure:: ./example_subtile_direct_connection.png
2468+
:width: 60%
2469+
:alt: Example of direct connections across sub-tiles
23892470

2390-
<direct name="adder_carry" from_pin="clb.cout" to_pin="clb.cin" x_offset="0" y_offset="-1" z_offset="0"/>
2471+
Example of direct connections across sub-tiles
23912472

23922473
.. _custom_switch_blocks:
23932474

doc/src/vpr/command_line_usage.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,7 @@ If any of init_t, exit_t or alpha_t is specified, the user schedule, with a fixe
850850
* ``cost_variance``: Estimates the initial temperature using the variance of cost after a set of trial swaps. The initial temperature is set to a value proportional to the variance.
851851
* ``equilibrium``: Estimates the initial temperature by trying to predict the equilibrium temperature for the initial placement (i.e. the temperature that would result in no change in cost).
852852

853-
**Default** ``cost_variance``
853+
**Default** ``equilibrium``
854854

855855
.. option:: --init_t <float>
856856

doc/src/vpr/graphics.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ Manual Moves
308308

309309
The manual moves feature allows the user to specify the next move in placement. If the move is legal, blocks are swapped and the new move is shown on the architecture.
310310

311+
.. _fig-misc-tab:
311312
.. figure:: ../Images/manual_move.png
312313
:align: center
313314
:width: 25%
@@ -335,3 +336,15 @@ If the manual move is legal, the cost summary window will display the delta cost
335336

336337
The user can Accept or Reject the manual move based on the values provided. If accepted the block's new location is shown.
337338

339+
Pause Button
340+
------------
341+
342+
The pause button allows the user to temporarily stop the program during placement or routing.
343+
When clicked during the placement stage, the program will pause at the next temperature update.
344+
When clicked during the routing stage, it will pause at the next router iteration.
345+
346+
The button can be pressed at any time while the program is running. To enable the feature, click the **Pause** button under the **Misc.** tab (see :ref:`fig-misc-tab`).
347+
Once the program reaches the next temperature update or router iteration after the button is pressed, it will automatically pause.
348+
349+
After the program has paused, clicking **Next Step** allows the user to resume execution from the point where the program was paused.
350+
This can be continuing from the current temperature in placement or from the current router iteration in routing.

doc/src/vtr/get_vtr.rst

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ How to Cite
99
Citations are important in academia, as they ensure contributors receive credit for their efforts.
1010
Therefore please use the following paper as a general citation whenever you use VTR:
1111

12-
M. A. Elgammal, A. Mohaghegh, S. G. Shahrouz, F. Mahmoudi, F. Koşar, K. Talaei, J. Fife, D. Khadivi, K. E. Murray, A. Boutros, K.B. Kent, J. Goeders, V. Betz "VTR 9: Open-Source CAD for Fabric and Beyond FPGA Architecture Exploration" ACM TRETS, 2025
12+
M. A. Elgammal, A. Mohaghegh, S. G. Shahrouz, F. Mahmoudi, F. Koşar, K. Talaei, J. Fife, D. Khadivi, K. E. Murray, A. Boutros, K.B. Kent, J. Goeders, V. Betz "VTR 9: Open-Source CAD for Fabric and Beyond FPGA Architecture Exploration" ACM TRETS, Vol. 13, No. 3, Sept. 2025, pp. 1 - 53.
1313

1414
Bibtex:
1515

@@ -19,6 +19,10 @@ Bibtex:
1919
title={VTR 9: Open-Source CAD for Fabric and Beyond FPGA Architecture Exploration},
2020
author={Elgammal, Mohamed A. and Mohaghegh, Amin and Shahrouz, Soheil G. and Mahmoudi, Fatemehsadat and Kosar, Fahrican and Talaei, Kimia and Fife, Joshua and Khadivi, Daniel and Murray, Kevin and Boutros, Andrew and Kent, Kenneth B. and Goeders, Jeff and Betz, Vaughn},
2121
journal={ACM Trans. Reconfigurable Technol. Syst.},
22+
issue_date = {September 2025},
23+
volume = {18},
24+
number = {3},
25+
numpages = {53},
2226
year={2025}
2327
}
2428

libs/libarchfpga/src/arch_check.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,11 @@ bool check_leaf_pb_model_timing_consistency(const t_pb_type* pb_type, const t_ar
163163
if (annotation.type == E_ANNOT_PIN_TO_PIN_DELAY) {
164164
//Check that any combinational delays specified match the 'combinational_sinks_ports' in the model
165165

166-
if (annotation.clock) {
166+
if (!annotation.clock.empty()) {
167167
//Sequential annotation, check that the clock on the specified port matches the model
168168

169-
//Annotations always put the pin in the input_pins field
170-
VTR_ASSERT(annotation.input_pins);
169+
// Annotations always put the pin in the input_pins field
170+
VTR_ASSERT(!annotation.input_pins.empty());
171171
for (const std::string& input_pin : vtr::StringToken(annotation.input_pins).split(" \t\n")) {
172172
InstPort annot_port(input_pin);
173173
for (const std::string& clock : vtr::StringToken(annotation.clock).split(" \t\n")) {
@@ -207,15 +207,15 @@ bool check_leaf_pb_model_timing_consistency(const t_pb_type* pb_type, const t_ar
207207
}
208208
}
209209

210-
} else if (annotation.input_pins && annotation.output_pins) {
211-
//Combinational annotation
212-
VTR_ASSERT_MSG(!annotation.clock, "Combinational annotations should have no clock");
210+
} else if (!annotation.input_pins.empty() && !annotation.output_pins.empty()) {
211+
// Combinational annotation
212+
VTR_ASSERT_MSG(annotation.clock.empty(), "Combinational annotations should have no clock");
213213
for (const std::string& input_pin : vtr::StringToken(annotation.input_pins).split(" \t\n")) {
214214
InstPort annot_in(input_pin);
215215
for (const std::string& output_pin : vtr::StringToken(annotation.output_pins).split(" \t\n")) {
216216
InstPort annot_out(output_pin);
217217

218-
//Find the input model port
218+
// Find the input model port
219219
const t_model_ports* model_port = nullptr;
220220
for (const t_model_ports* port = model.inputs; port != nullptr; port = port->next) {
221221
if (port->name == annot_in.port_name()) {
@@ -230,7 +230,7 @@ bool check_leaf_pb_model_timing_consistency(const t_pb_type* pb_type, const t_ar
230230
annot_in.port_name().c_str(), annot_in.instance_name().c_str());
231231
}
232232

233-
//Check that the output port is listed in the model's combinational sinks
233+
// Check that the output port is listed in the model's combinational sinks
234234
auto b = model_port->combinational_sink_ports.begin();
235235
auto e = model_port->combinational_sink_ports.end();
236236
auto iter = std::find(b, e, annot_out.port_name());

0 commit comments

Comments
 (0)