Skip to content

Commit 130ec92

Browse files
authored
Merge pull request #2066 from verilog-to-routing/flat_routing
Add Intra-Cluster Pins & Connections to RR Graph
2 parents b907821 + ecd1aef commit 130ec92

File tree

86 files changed

+2652
-568
lines changed

Some content is hidden

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

86 files changed

+2652
-568
lines changed

libs/libarchfpga/src/physical_types.h

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,10 @@ struct t_class {
450450
struct t_class_range {
451451
int low = 0;
452452
int high = 0;
453+
// Returns the total number of classes
454+
int total_num() const {
455+
return high - low + 1;
456+
}
453457
};
454458

455459
enum e_power_wire_type {
@@ -613,11 +617,14 @@ struct t_physical_tile_type {
613617

614618
std::vector<t_class> class_inf; /* [0..num_class-1] */
615619

620+
std::unordered_map<int, t_class> internal_class_inf;
621+
616622
std::vector<int> pin_width_offset; // [0..num_pins-1]
617623
std::vector<int> pin_height_offset; // [0..num_pins-1]
618624
std::vector<int> pin_class; // [0..num_pins-1]
619-
std::vector<bool> is_ignored_pin; // [0..num_pins-1]
620-
std::vector<bool> is_pin_global; // [0..num_pins-1]
625+
std::unordered_map<int, int> internal_pin_class;
626+
std::vector<bool> is_ignored_pin; // [0..num_pins-1]
627+
std::vector<bool> is_pin_global; // [0..num_pins-1]
621628

622629
std::vector<t_fc_specification> fc_specs;
623630

@@ -725,6 +732,9 @@ struct t_sub_tile {
725732
///> indices ranging from 4 to 7.
726733
t_class_range class_range;
727734

735+
std::vector<std::unordered_map<t_logical_block_type_ptr, int>> starting_internal_class_idx;
736+
std::vector<std::unordered_map<t_logical_block_type_ptr, int>> starting_internal_pin_idx;
737+
728738
int num_phy_pins = 0;
729739

730740
int index = -1;
@@ -818,6 +828,15 @@ struct t_physical_tile_port {
818828
* index: Keep track of type in array for easy access
819829
* physical_tile_index: index of the corresponding physical tile type
820830
*
831+
* pin_logical_num_to_pb_pin_mapping: Contains all the pins, including pins on the root-level block and internal pins, in
832+
* the logical block. The key of this map is the logical number of the pin, and the value is a pointer to the
833+
* corresponding pb_graph_pin
834+
*
835+
* pb_pin_to_class_logical_num_mapping: Maps each pin to its corresponding class's logical number. To retrieve the actual class, use this number as an
836+
* index to logical_class_inf.
837+
*
838+
* logical_class_inf: Contains all the classes inside the logical block. The index of each class is the logical number associate with the class.
839+
*
821840
* A logical block is the implementation of a component's functionality of the FPGA device
822841
* and it identifies its logical behaviour and internal connections.
823842
*
@@ -840,6 +859,10 @@ struct t_logical_block_type {
840859
std::vector<t_physical_tile_type_ptr> equivalent_tiles; ///>List of physical tiles at which one could
841860
///>place this type of netlist block.
842861

862+
std::unordered_map<int, const t_pb_graph_pin*> pin_logical_num_to_pb_pin_mapping; /* pin_logical_num_to_pb_pin_mapping[pin logical number] -> pb_graph_pin ptr} */
863+
std::unordered_map<const t_pb_graph_pin*, int> pb_pin_to_class_logical_num_mapping; /* pb_pin_to_class_logical_num_mapping[pb_graph_pin ptr] -> class logical number */
864+
std::vector<t_class> logical_class_inf; /* logical_class_inf[class_logical_number] -> class */
865+
843866
// Is this t_logical_block_type empty?
844867
bool is_empty() const;
845868
};

libs/libarchfpga/src/physical_types_util.cpp

Lines changed: 698 additions & 33 deletions
Large diffs are not rendered by default.

libs/libarchfpga/src/physical_types_util.h

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ int get_physical_pin_from_capacity_location(t_physical_tile_type_ptr physical_ti
160160
std::pair<int, int> get_capacity_location_from_physical_pin(t_physical_tile_type_ptr physical_tile, int pin);
161161

162162
///@brief Returns the name of the pin_index'th pin on the specified block type
163-
std::string block_type_pin_index_to_name(t_physical_tile_type_ptr type, int pin_index);
163+
// #TODO: is_flat shouldn't have a default value - This should be modified ASAP!
164+
std::string block_type_pin_index_to_name(t_physical_tile_type_ptr type, int pin_physical_num, bool is_flat = false);
164165

165166
///@brief Returns the name of the class_index'th pin class on the specified block type
166167
std::vector<std::string> block_type_class_index_to_pin_names(t_physical_tile_type_ptr type, int class_index);
@@ -301,4 +302,80 @@ const t_physical_tile_port* get_port_by_pin(const t_sub_tile* sub_tile, int pin)
301302
*/
302303
const t_port* get_port_by_pin(t_logical_block_type_ptr type, int pin);
303304

305+
/************************************ Access to intra-block resources ************************************/
306+
307+
/* Access information related to pin classes */
308+
309+
/** get information given class physical num **/
310+
std::tuple<const t_sub_tile*, int> get_sub_tile_from_class_physical_num(t_physical_tile_type_ptr physical_tile, int physical_class_num);
311+
312+
t_logical_block_type_ptr get_logical_block_from_class_physical_num(t_physical_tile_type_ptr physical_tile, int physical_class_num);
313+
314+
std::vector<int> get_pin_list_from_class_physical_num(t_physical_tile_type_ptr physical_tile, int class_physical_num);
315+
316+
PortEquivalence get_port_equivalency_from_class_physical_num(t_physical_tile_type_ptr physical_tile, int class_physical_num);
317+
318+
e_pin_type get_class_type_from_class_physical_num(t_physical_tile_type_ptr physical_tile, int class_physical_num);
319+
320+
int get_class_num_pins_from_class_physical_num(t_physical_tile_type_ptr physical_tile, int class_physical_num);
321+
322+
int get_pin_physical_num_from_class_physical_num(t_physical_tile_type_ptr physical_tile, int physical_class_num, int pin_logical_num);
323+
324+
bool is_class_on_tile(t_physical_tile_type_ptr physical_tile, int class_physical_num);
325+
/** **/
326+
327+
/** get classes under different blocks **/
328+
std::unordered_map<int, const t_class*> get_pb_graph_node_num_class_pairs(t_physical_tile_type_ptr physical_tile,
329+
const t_sub_tile* sub_tile,
330+
t_logical_block_type_ptr logical_block,
331+
int sub_tile_relative_cap,
332+
const t_pb_graph_node* pb_graph_node);
333+
/** **/
334+
int get_total_num_sub_tile_internal_classes(const t_sub_tile* sub_tile);
335+
336+
int get_total_num_tile_internal_classes(t_physical_tile_type_ptr physical_tile);
337+
338+
int get_tile_class_max_ptc(t_physical_tile_type_ptr tile, bool is_flat);
339+
340+
/* */
341+
342+
/* Access information related to pins */
343+
344+
/** get information given pin physical number **/
345+
std::tuple<const t_sub_tile*, int> get_sub_tile_from_pin_physical_num(t_physical_tile_type_ptr physical_tile, int physical_num);
346+
347+
t_logical_block_type_ptr get_logical_block_from_pin_physical_num(t_physical_tile_type_ptr physical_tile, int physical_num);
348+
349+
const t_pb_graph_pin* get_pb_pin_from_pin_physical_num(t_physical_tile_type_ptr physical_tile, int physical_num);
350+
351+
PortEquivalence get_port_equivalency_from_pin_physical_num(t_physical_tile_type_ptr physical_tile, int pin_physical_num);
352+
353+
e_pin_type get_pin_type_from_pin_physical_num(t_physical_tile_type_ptr physical_tile, int physical_num);
354+
355+
int get_class_num_from_pin_physical_num(t_physical_tile_type_ptr physical_tile, int pin_physical_num);
356+
357+
bool is_pin_on_tile(t_physical_tile_type_ptr physical_tile, int physical_num);
358+
359+
std::vector<int> get_pb_graph_node_pins(const t_sub_tile* sub_tile,
360+
t_logical_block_type_ptr logical_block,
361+
int relative_cap,
362+
const t_pb_graph_node* pb_graph_node);
363+
364+
std::vector<int> get_physical_pin_driving_pins(t_physical_tile_type_ptr physical_type,
365+
t_logical_block_type_ptr logical_block,
366+
int pin_physical_num);
367+
368+
int get_pb_pin_physical_num(const t_sub_tile* sub_tile,
369+
t_logical_block_type_ptr logical_block,
370+
int relative_cap,
371+
const t_pb_graph_pin* pin);
372+
373+
int get_total_num_sub_tile_internal_pins(const t_sub_tile* sub_tile);
374+
375+
int get_total_num_tile_internal_pins(t_physical_tile_type_ptr tile);
376+
377+
int get_tile_ipin_opin_max_ptc(t_physical_tile_type_ptr tile, bool is_flat);
378+
379+
/* */
380+
304381
#endif

libs/libarchfpga/src/read_xml_arch_file.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -534,12 +534,12 @@ static void LoadPinLoc(pugi::xml_node Locations,
534534
std::vector<int> input_pins;
535535
std::vector<int> output_pins;
536536
for (int pin_num = 0; pin_num < type->num_pins; ++pin_num) {
537-
int iclass = type->pin_class[pin_num];
537+
auto class_type = get_pin_type_from_pin_physical_num(type, pin_num);
538538

539-
if (type->class_inf[iclass].type == RECEIVER) {
539+
if (class_type == RECEIVER) {
540540
input_pins.push_back(pin_num);
541541
} else {
542-
VTR_ASSERT(type->class_inf[iclass].type == DRIVER);
542+
VTR_ASSERT(class_type == DRIVER);
543543
output_pins.push_back(pin_num);
544544
}
545545
}

0 commit comments

Comments
 (0)