@@ -53,8 +53,6 @@ bool ConnectionBoxes::find_connection_box(int inode,
53
53
// Clear IPIN map and set connection box grid size and box ids.
54
54
void ConnectionBoxes::reset_boxes (std::pair<size_t , size_t > size,
55
55
const std::vector<ConnectionBox> boxes) {
56
- clear ();
57
-
58
56
size_ = size;
59
57
boxes_ = boxes;
60
58
}
@@ -75,15 +73,34 @@ void ConnectionBoxes::clear() {
75
73
sink_to_ipin_.clear ();
76
74
}
77
75
78
- void ConnectionBoxes::add_connection_box (int inode, ConnectionBoxId box_id, std::pair<size_t , size_t > box_location, float site_pin_delay) {
79
- // Ensure that box location is in bounds
80
- VTR_ASSERT (box_location.first < size_.first );
81
- VTR_ASSERT (box_location.second < size_.second );
76
+ void ConnectionBoxes::verify_connection_boxes () {
77
+ if (size_.first == 0 && size_.second == 0 ) {
78
+ return ;
79
+ }
80
+
81
+ for (const auto & loc : canonical_loc_map_) {
82
+ VTR_ASSERT (loc.first < size_.first );
83
+ VTR_ASSERT (loc.second < size_.second );
84
+ }
85
+
86
+ for (const auto & conn_box_loc : ipin_map_) {
87
+ if (conn_box_loc.box_id == ConnectionBoxId::INVALID ()) {
88
+ continue ;
89
+ }
90
+ const auto & box_location = conn_box_loc.box_location ;
91
+ const auto & box_id = conn_box_loc.box_id ;
92
+
93
+ // Ensure that box location is in bounds
94
+ VTR_ASSERT (box_location.first < size_.first );
95
+ VTR_ASSERT (box_location.second < size_.second );
82
96
83
- // Bounds check box_id
84
- VTR_ASSERT (bool (box_id));
85
- VTR_ASSERT (size_t (box_id) < boxes_.size ());
97
+ // Bounds check box_id
98
+ VTR_ASSERT (bool (box_id));
99
+ VTR_ASSERT (size_t (box_id) < boxes_.size ());
100
+ }
101
+ }
86
102
103
+ void ConnectionBoxes::add_connection_box (int inode, ConnectionBoxId box_id, std::pair<size_t , size_t > box_location, float site_pin_delay) {
87
104
// Make sure sink map will not be invalidated upon insertion.
88
105
VTR_ASSERT (sink_to_ipin_.size () == 0 );
89
106
@@ -94,8 +111,6 @@ void ConnectionBoxes::add_connection_box(int inode, ConnectionBoxId box_id, std:
94
111
}
95
112
96
113
void ConnectionBoxes::add_canonical_loc (int inode, std::pair<size_t , size_t > loc) {
97
- VTR_ASSERT (loc.first < size_.first );
98
- VTR_ASSERT (loc.second < size_.second );
99
114
if (inode >= (ssize_t )(canonical_loc_map_.size ())) {
100
115
canonical_loc_map_.resize (inode + 1 );
101
116
}
@@ -117,6 +132,7 @@ const std::pair<size_t, size_t>* ConnectionBoxes::find_canonical_loc(int inode)
117
132
118
133
void ConnectionBoxes::create_sink_back_ref () {
119
134
const auto & device_ctx = g_vpr_ctx.device ();
135
+ verify_connection_boxes ();
120
136
121
137
sink_to_ipin_.resize (device_ctx.rr_nodes .size (), {{0 , 0 , 0 , 0 }, 0 });
122
138
0 commit comments