aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/nextpnr.h10
-rw-r--r--common/placer1.cc8
2 files changed, 17 insertions, 1 deletions
diff --git a/common/nextpnr.h b/common/nextpnr.h
index 2eb46bd3..f391469c 100644
--- a/common/nextpnr.h
+++ b/common/nextpnr.h
@@ -273,6 +273,16 @@ struct CellInfo : ArchCellInfo
// cell_port -> bel_pin
std::unordered_map<IdString, IdString> pins;
+
+ // placement constraints
+ CellInfo *constr_parent;
+ std::vector<CellInfo*> constr_children;
+ const int UNCONSTR = INT_MIN;
+ int constr_x = UNCONSTR; // this.x - parent.x
+ int constr_y = UNCONSTR; // this.y - parent.y
+ int constr_z = UNCONSTR; // this.z - parent.z
+ bool constr_abs_z = false; // parent.z := 0
+ // parent.[xyz] := 0 when (constr_parent == nullptr)
};
struct DeterministicRNG
diff --git a/common/placer1.cc b/common/placer1.cc
index f713fb88..4659da11 100644
--- a/common/placer1.cc
+++ b/common/placer1.cc
@@ -94,7 +94,13 @@ class SAPlacer
BelType bel_type = ctx->getBelType(bel);
if (bel_type != ctx->belTypeFromId(cell->type)) {
log_error("Bel \'%s\' of type \'%s\' does not match cell "
- "\'%s\' of type \'%s\'",
+ "\'%s\' of type \'%s\'\n",
+ loc_name.c_str(), ctx->belTypeToId(bel_type).c_str(ctx), cell->name.c_str(ctx),
+ cell->type.c_str(ctx));
+ }
+ if (!ctx->isValidBelForCell(cell, bel)) {
+ log_error("Bel \'%s\' of type \'%s\' is not valid for cell "
+ "\'%s\' of type \'%s\'\n",
loc_name.c_str(), ctx->belTypeToId(bel_type).c_str(ctx), cell->name.c_str(ctx),
cell->type.c_str(ctx));
}