Skip to content

Commit 571cede

Browse files
changed floorplan_constraints_regions_overfull() to check whether whole PartitionRegions are full instead of individual Regions
1 parent 9fd7389 commit 571cede

File tree

3 files changed

+42
-50
lines changed

3 files changed

+42
-50
lines changed

vpr/src/base/vpr_context.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ struct FloorplanningContext : public Context {
540540
*/
541541
std::vector<vtr::vector<ClusterBlockId, PartitionRegion>> compressed_cluster_constraints;
542542

543-
std::vector<Region> overfull_regions;
543+
std::vector<PartitionRegion> overfull_partition_regions;
544544
};
545545

546546
/**

vpr/src/pack/attraction_groups.cpp

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -47,35 +47,24 @@ void AttractionInfo::create_att_groups_for_overfull_regions() {
4747
atom_attraction_group.resize(num_atoms);
4848
fill(atom_attraction_group.begin(), atom_attraction_group.end(), AttractGroupId::INVALID());
4949

50-
const auto& overfull_regions = floorplanning_ctx.overfull_regions;
51-
PartitionRegion overfull_regions_pr;
52-
for (const auto& overfull_region : overfull_regions) {
53-
overfull_regions_pr.add_to_part_region(overfull_region);
54-
}
55-
/*
56-
* Create a PartitionRegion that contains all the overfull regions so that you can
57-
* make an attraction group for any partition that intersects with any of these regions
58-
*/
50+
const std::vector<PartitionRegion>& overfull_prs = floorplanning_ctx.overfull_partition_regions;
5951

6052
/*
61-
* Create an attraction group for each parition with an overfull region.
53+
* Create an attraction group for each partition that overlaps with at least one overfull partition
6254
*/
63-
6455
for (int ipart = 0; ipart < num_parts; ipart++) {
6556
PartitionId partid(ipart);
6657

6758
const Partition& part = floorplanning_ctx.constraints.get_partition(partid);
68-
const auto& pr_regions = part.get_part_region();
6959

70-
PartitionRegion intersect_pr;
71-
72-
intersect_pr = intersection(overfull_regions_pr, pr_regions);
73-
74-
if (!intersect_pr.empty()) {
75-
AttractionGroup group_info;
76-
group_info.group_atoms = floorplanning_ctx.constraints.get_part_atoms(partid);
77-
78-
attraction_groups.push_back(group_info);
60+
for (const PartitionRegion& overfull_pr : overfull_prs) {
61+
PartitionRegion intersect_pr = intersection(part.get_part_region(), overfull_pr);
62+
if (!intersect_pr.empty()) {
63+
AttractionGroup group_info;
64+
group_info.group_atoms = floorplanning_ctx.constraints.get_part_atoms(partid);
65+
attraction_groups.push_back(group_info);
66+
break;
67+
}
7968
}
8069
}
8170

vpr/src/pack/constraints_report.cpp

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,52 +8,55 @@ bool floorplan_constraints_regions_overfull() {
88
auto& floorplanning_ctx = g_vpr_ctx.mutable_floorplanning();
99
auto& device_ctx = g_vpr_ctx.device();
1010

11-
auto& block_types = device_ctx.logical_block_types;
11+
const std::vector<t_logical_block_type>& block_types = device_ctx.logical_block_types;
1212

13-
std::unordered_map<Region, std::vector<int>> regions_count_info;
13+
// keep record of how many blocks of each type are assigned to each PartitionRegion
14+
std::unordered_map<PartitionRegion, std::vector<int>> pr_count_info;
1415

15-
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
16+
for (const ClusterBlockId blk_id : cluster_ctx.clb_nlist.blocks()) {
1617
if (!is_cluster_constrained(blk_id)) {
1718
continue;
1819
}
1920
t_logical_block_type_ptr bt = cluster_ctx.clb_nlist.block_type(blk_id);
2021

2122
const PartitionRegion& pr = floorplanning_ctx.cluster_constraints[blk_id];
22-
const std::vector<Region>& regions = pr.get_regions();
23-
24-
for (const auto& current_reg : regions) {
25-
auto got = regions_count_info.find(current_reg);
26-
27-
if (got == regions_count_info.end()) {
28-
std::vector<int> block_type_counts(block_types.size(), 0);
29-
30-
block_type_counts[bt->index]++;
31-
32-
regions_count_info.insert({current_reg, block_type_counts});
23+
auto got = pr_count_info.find(pr);
3324

34-
} else {
35-
got->second[bt->index]++;
36-
}
25+
if (got == pr_count_info.end()) {
26+
std::vector<int> block_type_counts(block_types.size(), 0);
27+
block_type_counts[bt->index]++;
28+
pr_count_info.insert({pr, block_type_counts});
29+
} else {
30+
got->second[bt->index]++;
3731
}
3832
}
3933

4034
bool floorplan_regions_overfull = false;
4135

42-
for (const auto& [region, block_type_counts] : regions_count_info) {
43-
const vtr::Rect<int>& rect = region.get_rect();
44-
const auto [layer_low, layer_high] = region.get_layer_range();
45-
for (const auto & block_type : block_types) {
36+
for (const auto& [pr, block_type_counts] : pr_count_info) {
37+
const std::vector<Region>& regions = pr.get_regions();
38+
39+
for (const t_logical_block_type& block_type : block_types) {
4640
int num_assigned_blocks = block_type_counts[block_type.index];
47-
int num_tiles = grid_tiles.region_tile_count(region, &block_type);
41+
int num_tiles = std::accumulate(regions.begin(), regions.end(), 0, [&grid_tiles, &block_type](int acc, const Region& reg) -> int {
42+
return acc + grid_tiles.region_tile_count(reg, &block_type);
43+
});
44+
4845
if (num_assigned_blocks > num_tiles) {
4946
floorplan_regions_overfull = true;
50-
floorplanning_ctx.overfull_regions.push_back(region);
51-
VTR_LOG("\n \nRegion (%d, %d, %d) to (%d, %d, %d) st %d \n",
52-
rect.xmin(), rect.ymin(), layer_low,
53-
rect.xmax(), rect.ymax(), layer_high,
54-
region.get_sub_tile());
55-
VTR_LOG("Assigned %d blocks of type %s, but only has %d tiles of that type\n",
47+
floorplanning_ctx.overfull_partition_regions.push_back(pr);
48+
VTR_LOG("\n\nA partition including the following regions has been assigned %d blocks of type $s, "
49+
"but only has %d tiles of that type\n",
5650
num_assigned_blocks, block_type.name, num_tiles);
51+
for (const Region& reg : regions) {
52+
const vtr::Rect<int>& rect = reg.get_rect();
53+
const auto [layer_low, layer_high] = reg.get_layer_range();
54+
VTR_LOG("\tRegion (%d, %d, %d) to (%d, %d, %d) st %d \n",
55+
rect.xmin(), rect.ymin(), layer_low,
56+
rect.xmax(), rect.ymax(), layer_high,
57+
reg.get_sub_tile());
58+
}
59+
5760
}
5861
}
5962
}

0 commit comments

Comments
 (0)