@@ -575,6 +575,9 @@ constexpr int DEFAULT_SWITCH = -2;
575
575
* pinloc: Is set to true if a given pin exists on a certain position of a
576
576
* block. Derived from pin_location_distribution/pin_loc_assignments
577
577
*
578
+ * pin_layer_offset/pin_width_offset/pin_height_offset: offset from the anchor point
579
+ * of the block type in the x,y, and layer (dice number) direction.
580
+ *
578
581
* pin_location_distribution: The pin distribution type
579
582
* num_pin_loc_assignments: The number of strings within each pin_loc_assignments
580
583
* pin_loc_assignments: The strings for a custom pin location distribution.
@@ -609,17 +612,18 @@ constexpr int DEFAULT_SWITCH = -2;
609
612
* logical_tile_index: index of the corresponding logical block type
610
613
*
611
614
* In general, the physical tile is a placeable physical resource on the FPGA device,
612
- * and it is allowed to contain an heterogeneous set of logical blocks (pb_types).
615
+ * and it is allowed to contain a heterogeneous set of logical blocks (pb_types).
613
616
*
614
617
* Each physical tile must specify at least one sub tile, that is a physical location
615
618
* on the sub tiles stacks. This means that a physical tile occupies an (x, y) location on the grid,
616
619
* and it has at least one sub tile slot that allows for a placement within the (x, y) location.
617
620
*
618
621
* Therefore, to identify the location of a logical block within the device grid, we need to
619
- * specify three different coordinates:
622
+ * specify four different coordinates:
620
623
* - x : horizontal coordinate
621
624
* - y : vertical coordinate
622
625
* - sub tile : location within the sub tile stack at an (x, y) physical location
626
+ * -layer_num : the layer that block is located at. In case of a single die, layer_num is 0.
623
627
*
624
628
* A physical tile is heterogeneous as it allows the placement of different kinds of logical blocks within,
625
629
* that can share the same (x, y) placement location.
@@ -650,6 +654,7 @@ struct t_physical_tile_type {
650
654
int primitive_class_starting_idx = -1 ;
651
655
std::unordered_map<int , t_class> primitive_class_inf; // [primitive_class_num] -> primitive_class_inf
652
656
657
+ std::vector<int > pin_layer_offset; // [0..num_pins-1]
653
658
std::vector<int > pin_width_offset; // [0..num_pins-1]
654
659
std::vector<int > pin_height_offset; // [0..num_pins-1]
655
660
std::vector<int > pin_class; // [0..num_pins-1]
@@ -1531,6 +1536,14 @@ enum e_Fc_type {
1531
1536
* relation to the switches from the architecture file, *
1532
1537
* not the expanded list of switches that is built *
1533
1538
* at the end of build_rr_graph *
1539
+ * *
1540
+ * @param arch_opin_between_dice_switch: Index of the switch type that *
1541
+ * connects output pins (OPINs) *to* this segment from *
1542
+ * *another die (layer)*. Note that this index is in *
1543
+ * relation to the switches from the architecture file, *
1544
+ * not the expanded list of switches that is built at *
1545
+ * the end of build_rr_graph *
1546
+ * *
1534
1547
* frac_cb: The fraction of logic blocks along its length to which this *
1535
1548
* segment can connect. (i.e. internal population). *
1536
1549
* frac_sb: The fraction of the length + 1 switch blocks along the segment *
@@ -1554,6 +1567,7 @@ struct t_segment_inf {
1554
1567
int length;
1555
1568
short arch_wire_switch;
1556
1569
short arch_opin_switch;
1570
+ short arch_opin_between_dice_switch = -1 ;
1557
1571
float frac_cb;
1558
1572
float frac_sb;
1559
1573
bool longline;
@@ -1568,7 +1582,7 @@ struct t_segment_inf {
1568
1582
};
1569
1583
1570
1584
inline bool operator ==(const t_segment_inf& a, const t_segment_inf& b) {
1571
- return a.name == b.name && a.frequency == b.frequency && a.length == b.length && a.arch_wire_switch == b.arch_wire_switch && a.arch_opin_switch == b.arch_opin_switch && a.frac_cb == b.frac_cb && a.frac_sb == b.frac_sb && a.longline == b.longline && a.Rmetal == b.Rmetal && a.Cmetal == b.Cmetal && a.directionality == b.directionality && a.parallel_axis == b.parallel_axis && a.cb == b.cb && a.sb == b.sb ;
1585
+ return a.name == b.name && a.frequency == b.frequency && a.length == b.length && a.arch_wire_switch == b.arch_wire_switch && a.arch_opin_switch == b.arch_opin_switch && a.arch_opin_between_dice_switch == b. arch_opin_between_dice_switch && a. frac_cb == b.frac_cb && a.frac_sb == b.frac_sb && a.longline == b.longline && a.Rmetal == b.Rmetal && a.Cmetal == b.Cmetal && a.directionality == b.directionality && a.parallel_axis == b.parallel_axis && a.cb == b.cb && a.sb == b.sb ;
1572
1586
}
1573
1587
1574
1588
/* provide hashing for t_segment_inf to enable the use of many std containers.
@@ -1963,6 +1977,9 @@ struct t_arch {
1963
1977
t_power_arch* power = nullptr ;
1964
1978
t_clock_arch* clocks = nullptr ;
1965
1979
1980
+ // determine which layers in multi-die FPGAs require to build global routing resources
1981
+ std::vector<bool > layer_global_routing;
1982
+
1966
1983
// Constants
1967
1984
// VCC and GND cells are special virtual cells that are
1968
1985
// used to handle the constant network of the device.
@@ -1990,9 +2007,10 @@ struct t_arch {
1990
2007
std::unordered_map<std::string, std::vector<t_lut_element>> lut_elements;
1991
2008
1992
2009
// The name of the switch used for the input connection block (i.e. to
1993
- // connect routing tracks to block pins).
1994
- // This should correspond to a switch in Switches
1995
- std::string ipin_cblock_switch_name;
2010
+ // connect routing tracks to block pins). tracks can be connected to
2011
+ // ipins through the same die or from other dice, each of these
2012
+ // types of connections requires a different switch, all names should correspond to a switch in Switches.
2013
+ std::vector<std::string> ipin_cblock_switch_name;
1996
2014
1997
2015
std::vector<t_grid_def> grid_layouts; // Set of potential device layouts
1998
2016
0 commit comments