Added a is_pin_global flag and used it to mark nets as global
diff --git a/libs/libarchfpga/src/arch_util.cpp b/libs/libarchfpga/src/arch_util.cpp
index 4b52bd9..074d06f 100644
--- a/libs/libarchfpga/src/arch_util.cpp
+++ b/libs/libarchfpga/src/arch_util.cpp
@@ -141,6 +141,7 @@
}
vtr::free(type_descriptors[i].class_inf);
vtr::free(type_descriptors[i].is_ignored_pin);
+ vtr::free(type_descriptors[i].is_pin_global);
vtr::free(type_descriptors[i].pin_class);
free_pb_type(type_descriptors[i].pb_type);
diff --git a/libs/libarchfpga/src/physical_types.h b/libs/libarchfpga/src/physical_types.h
index 4c491fb..0180374 100644
--- a/libs/libarchfpga/src/physical_types.h
+++ b/libs/libarchfpga/src/physical_types.h
@@ -440,6 +440,8 @@
* This is usually the case for clock pins and other global pins unless the
* clock_modeling option is set to route the clock through regular inter-block
* wiring or through a dedicated clock network.
+ * is_pin_global: Whether or not this pin is marked as global. Clock pins and other specified
+ * global pins in the architecture file are marked as global.
*
* fc_specs: The Fc specifications for all pins
*
@@ -481,6 +483,7 @@
std::vector<int> pin_height_offset; //[0..num_pins-1]
int *pin_class = nullptr; /* [0..num_pins-1] */
bool *is_ignored_pin = nullptr; /* [0..num_pins-1] */
+ bool *is_pin_global = nullptr; /* [0..num_pins -1] */
std::vector<t_fc_specification> fc_specs;
diff --git a/libs/libarchfpga/src/read_xml_arch_file.cpp b/libs/libarchfpga/src/read_xml_arch_file.cpp
index 1622924..378c8db 100644
--- a/libs/libarchfpga/src/read_xml_arch_file.cpp
+++ b/libs/libarchfpga/src/read_xml_arch_file.cpp
@@ -567,9 +567,11 @@
Type->num_class = num_class;
Type->pin_class = (int*) vtr::malloc(Type->num_pins * sizeof(int) * capacity);
Type->is_ignored_pin = (bool*) vtr::malloc( Type->num_pins * sizeof(bool)* capacity);
+ Type->is_pin_global = (bool*) vtr::malloc( Type->num_pins * sizeof(bool)* capacity);
for (i = 0; i < Type->num_pins * capacity; i++) {
Type->pin_class[i] = OPEN;
Type->is_ignored_pin[i] = true;
+ Type->is_pin_global[i] = true;
}
pin_count = 0;
@@ -601,8 +603,14 @@
Type->class_inf[num_class].type = DRIVER;
}
Type->pin_class[pin_count] = num_class;
+ // clock pins and other specified global ports are initially specified
+ // as ignored pins (i.e. connections are not created in the rr_graph and
+ // nets connected to the port are ignored as well).
Type->is_ignored_pin[pin_count] = Type->pb_type->ports[j].is_clock ||
Type->pb_type->ports[j].is_non_clock_global;
+ // clock pins and other specified global ports are flaged as global
+ Type->is_pin_global[pin_count] = Type->pb_type->ports[j].is_clock ||
+ Type->pb_type->ports[j].is_non_clock_global;
pin_count++;
if (Type->pb_type->ports[j].equivalent == PortEquivalence::NONE) {
diff --git a/vpr/src/base/clustered_netlist.cpp b/vpr/src/base/clustered_netlist.cpp
index 7bb8470..394d23b 100644
--- a/vpr/src/base/clustered_netlist.cpp
+++ b/vpr/src/base/clustered_netlist.cpp
@@ -102,6 +102,12 @@
return net_is_ignored_[id];
}
+bool ClusteredNetlist::is_global_net(const ClusterNetId id) const {
+ VTR_ASSERT_SAFE(valid_net_id(id));
+
+ return is_global_net_[id];
+}
+
/*
*
* Mutators
@@ -184,6 +190,7 @@
if (net_id == ClusterNetId::INVALID()) {
net_id = Netlist::create_net(name);
net_is_ignored_.push_back(false);
+ is_global_net_.push_back(false);
}
VTR_ASSERT(validate_net_sizes());
@@ -197,6 +204,12 @@
net_is_ignored_[net_id] = state;
}
+void ClusteredNetlist::set_is_global_net(ClusterNetId net_id, bool state) {
+ VTR_ASSERT(valid_net_id(net_id));
+
+ is_global_net_[net_id] = state;
+}
+
void ClusteredNetlist::remove_block_impl(const ClusterBlockId blk_id) {
//Remove & invalidate pointers
free_pb(block_pbs_[blk_id]);
@@ -239,6 +252,7 @@
void ClusteredNetlist::clean_nets_impl(const vtr::vector_map<ClusterNetId, ClusterNetId>& net_id_map) {
//Update all the net values
net_is_ignored_ = clean_and_reorder_values(net_is_ignored_, net_id_map);
+ is_global_net_ = clean_and_reorder_values(is_global_net_, net_id_map);
}
void ClusteredNetlist::rebuild_block_refs_impl(const vtr::vector_map<ClusterPinId, ClusterPinId>& /*pin_id_map*/,
@@ -277,6 +291,7 @@
//Net data
net_is_ignored_.shrink_to_fit();
+ is_global_net_.shrink_to_fit();
}
@@ -307,7 +322,7 @@
}
bool ClusteredNetlist::validate_net_sizes_impl(size_t num_nets) const {
- if (net_is_ignored_.size() != num_nets) {
+ if (net_is_ignored_.size() != num_nets && is_global_net_.size() != num_nets) {
return false;
}
return true;
diff --git a/vpr/src/base/clustered_netlist.h b/vpr/src/base/clustered_netlist.h
index 56fbab6..045bd60 100644
--- a/vpr/src/base/clustered_netlist.h
+++ b/vpr/src/base/clustered_netlist.h
@@ -165,6 +165,9 @@
//Returns whether the net is ignored i.e. not routed
bool net_is_ignored(const ClusterNetId id) const;
+ //Returns whether the net is global
+ bool is_global_net(const ClusterNetId id) const;
+
public: //Public Mutators
//Create or return an existing block in the netlist
// name : The unique name of the block
@@ -197,9 +200,12 @@
// name : The unique name of the net
ClusterNetId create_net(const std::string name);
- //Sets the flag in net_global_ = state
+ //Sets the flag in net_ignored_ = state
void set_net_is_ignored(ClusterNetId net_id, bool state);
+ //Sets the flag in is_global_net_ = state
+ void set_is_global_net(ClusterNetId net_id, bool state);
+
private: //Private Members
/*
* Netlist compression/optimization
@@ -250,7 +256,8 @@
//in t_type_descriptor) of logical pins
//Nets
- vtr::vector_map<ClusterNetId, bool> net_is_ignored_; //Boolean mapping indicating if the net is global
+ vtr::vector_map<ClusterNetId, bool> net_is_ignored_; //Boolean mapping indicating if the net is ignored
+ vtr::vector_map<ClusterNetId, bool> is_global_net_; //Boolean mapping indicating if the net is global
};
#endif
diff --git a/vpr/src/base/read_netlist.cpp b/vpr/src/base/read_netlist.cpp
index fd70b51..e889f80 100644
--- a/vpr/src/base/read_netlist.cpp
+++ b/vpr/src/base/read_netlist.cpp
@@ -945,6 +945,11 @@
VTR_ASSERT(j == clb_nlist.pin_physical_index(*(clb_nlist.net_pins(clb_net_id).begin() + count[clb_net_id])));
VTR_ASSERT(j == clb_nlist.net_pin_physical_index(clb_net_id, count[clb_net_id]));
+ // nets connecting to global pins are marked as global nets
+ if (clb_nlist.block_type(blk_id)->is_pin_global[j]) {
+ clb_nlist.set_is_global_net(clb_net_id, true);
+ }
+
if (clb_nlist.block_type(blk_id)->is_ignored_pin[j]) {
clb_nlist.set_net_is_ignored(clb_net_id, true);
}