Add archcheck for partition methods.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
This commit is contained in:
parent
f3a7c691a3
commit
b4160c228e
@ -51,6 +51,16 @@ void archcheck_names(const Context *ctx)
|
|||||||
log_error("wire != wire2, name = %s\n", name.c_str(ctx));
|
log_error("wire != wire2, name = %s\n", name.c_str(ctx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_info("Checking partition names..\n");
|
||||||
|
for(PartitionId partition : ctx->getPartitions()) {
|
||||||
|
IdString name = ctx->getPartitionName(partition);
|
||||||
|
PartitionId partition2 = ctx->getPartitionByName(name);
|
||||||
|
if (partition != partition2) {
|
||||||
|
log_error("partition != partition2, name = %s\n", name.c_str(ctx));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef ARCH_ECP5
|
#ifndef ARCH_ECP5
|
||||||
log_info("Checking pip names..\n");
|
log_info("Checking pip names..\n");
|
||||||
for (PipId pip : ctx->getPips()) {
|
for (PipId pip : ctx->getPips()) {
|
||||||
@ -187,6 +197,59 @@ void archcheck_conn(const Context *ctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void archcheck_partitions(const Context *ctx)
|
||||||
|
{
|
||||||
|
log_info("Checking partition data.\n");
|
||||||
|
|
||||||
|
// Partitions should be subsets of BELs that form an exact cover.
|
||||||
|
// In particular that means cell types in a partition should only be
|
||||||
|
// placable in that partition.
|
||||||
|
for(PartitionId partition : ctx->getPartitions()) {
|
||||||
|
|
||||||
|
// Find out which cell types are in this partition.
|
||||||
|
std::unordered_set<IdString> cell_types_in_partition;
|
||||||
|
for(IdString cell_type : ctx->getCellTypes()) {
|
||||||
|
if(ctx->getPartitionForCellType(cell_type) == partition) {
|
||||||
|
cell_types_in_partition.insert(cell_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure that all cell types in this partition have at least one
|
||||||
|
// BelId they can be placed at.
|
||||||
|
std::unordered_set<IdString> cell_types_unused;
|
||||||
|
|
||||||
|
std::unordered_set<BelId> bels_in_partition;
|
||||||
|
for(BelId bel : ctx->getBelsForPartition(partition)) {
|
||||||
|
PartitionId partition2 = ctx->getPartitionForBel(bel);
|
||||||
|
log_assert(partition == partition2);
|
||||||
|
|
||||||
|
bels_in_partition.insert(bel);
|
||||||
|
|
||||||
|
// Check to see if a cell type not in this partition can be
|
||||||
|
// placed at a BEL in this partition.
|
||||||
|
for(IdString cell_type : ctx->getCellTypes()) {
|
||||||
|
if(ctx->getPartitionForCellType(cell_type) == partition) {
|
||||||
|
if(ctx->isValidBelForCellType(cell_type, bel)) {
|
||||||
|
cell_types_unused.erase(cell_type);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log_assert(!ctx->isValidBelForCellType(cell_type, bel));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify that any BEL not in this partition reports a different
|
||||||
|
// partition.
|
||||||
|
for(BelId bel : ctx->getBels()) {
|
||||||
|
if(ctx->getPartitionForBel(bel) != partition) {
|
||||||
|
log_assert(bels_in_partition.count(bel) == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log_assert(cell_types_unused.empty());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_BEGIN
|
NEXTPNR_NAMESPACE_BEGIN
|
||||||
@ -199,6 +262,7 @@ void Context::archcheck() const
|
|||||||
archcheck_names(this);
|
archcheck_names(this);
|
||||||
archcheck_locs(this);
|
archcheck_locs(this);
|
||||||
archcheck_conn(this);
|
archcheck_conn(this);
|
||||||
|
archcheck_partitions(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
@ -88,6 +88,14 @@ Get Z dimension for the specified tile for bels. All bels with at specified X an
|
|||||||
|
|
||||||
Get Z dimension for the specified tile for pips. All pips with at specified X and Y coordinates must have a Z coordinate in the range `0 .. getTileDimZ(X,Y)-1` (inclusive).
|
Get Z dimension for the specified tile for pips. All pips with at specified X and Y coordinates must have a Z coordinate in the range `0 .. getTileDimZ(X,Y)-1` (inclusive).
|
||||||
|
|
||||||
|
Cell Methods
|
||||||
|
-----------
|
||||||
|
|
||||||
|
### const\_range\<IdString\> getCellTypes() const
|
||||||
|
|
||||||
|
Get list of cell types that this architecture accepts.
|
||||||
|
|
||||||
|
|
||||||
Bel Methods
|
Bel Methods
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
@ -478,8 +486,8 @@ information for all edges. `index` must be in [0, clockInfoCount), behaviour is
|
|||||||
Partition Methods
|
Partition Methods
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Partitions are used by analytic placement to seperate types of BELs during
|
Partitions are subsets of BelIds and cell types used by analytic placement to
|
||||||
placement. Typical partitions are:
|
seperate types of BELs during placement. Typical partitions are:
|
||||||
- All LUT BELs
|
- All LUT BELs
|
||||||
- All FF BELs
|
- All FF BELs
|
||||||
- All multipliers BELs
|
- All multipliers BELs
|
||||||
@ -487,7 +495,8 @@ placement. Typical partitions are:
|
|||||||
- etc.
|
- etc.
|
||||||
|
|
||||||
The general rule here is to include all BELs that are roughly interchangable
|
The general rule here is to include all BELs that are roughly interchangable
|
||||||
during placement.
|
during placement. Partitions should form an exact cover over all BelIds and
|
||||||
|
cell types.
|
||||||
|
|
||||||
### const\_range\<PartitionId\> getPartitions() const
|
### const\_range\<PartitionId\> getPartitions() const
|
||||||
|
|
||||||
@ -497,8 +506,16 @@ Return a list of all partitions on the device.
|
|||||||
|
|
||||||
Return the name of the partition.
|
Return the name of the partition.
|
||||||
|
|
||||||
|
### PartitionId getPartitionByName(IdString partition\_name) const
|
||||||
|
|
||||||
|
Return the partition for the specified partition name.
|
||||||
|
|
||||||
### PartitionId getPartitionForBel(BelId bel) const
|
### PartitionId getPartitionForBel(BelId bel) const
|
||||||
|
|
||||||
|
Returns the partition for a particular BEL.
|
||||||
|
|
||||||
|
### PartitionId getPartitionForCell(IdString cell\_type) const
|
||||||
|
|
||||||
Returns the partition for a particular cell type.
|
Returns the partition for a particular cell type.
|
||||||
|
|
||||||
### const\_range\<BelId\> getBelsForPartition(PartitionId partition) const
|
### const\_range\<BelId\> getBelsForPartition(PartitionId partition) const
|
||||||
|
@ -271,6 +271,34 @@ struct Arch : BaseCtx
|
|||||||
bool place();
|
bool place();
|
||||||
bool route();
|
bool route();
|
||||||
|
|
||||||
|
std::vector<IdString> getCellTypes() const {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<PartitionId> getPartitions() const {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
IdString getPartitionName(PartitionId partition) const {
|
||||||
|
return partition;
|
||||||
|
}
|
||||||
|
|
||||||
|
PartitionId getPartitionByName(IdString partition) const {
|
||||||
|
return partition;
|
||||||
|
}
|
||||||
|
|
||||||
|
PartitionId getPartitionForBel(BelId bel) const {
|
||||||
|
return getBelType(bel);
|
||||||
|
}
|
||||||
|
|
||||||
|
PartitionId getPartitionForCellType(IdString cell_type) const {
|
||||||
|
return cell_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<BelId> getBelsForPartition(PartitionId partition) const {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
const std::vector<GraphicElement> &getDecalGraphics(DecalId decal) const;
|
const std::vector<GraphicElement> &getDecalGraphics(DecalId decal) const;
|
||||||
DecalXY getBelDecal(BelId bel) const;
|
DecalXY getBelDecal(BelId bel) const;
|
||||||
DecalXY getWireDecal(WireId wire) const;
|
DecalXY getWireDecal(WireId wire) const;
|
||||||
|
@ -51,6 +51,7 @@ typedef IdString WireId;
|
|||||||
typedef IdString PipId;
|
typedef IdString PipId;
|
||||||
typedef IdString GroupId;
|
typedef IdString GroupId;
|
||||||
typedef IdString DecalId;
|
typedef IdString DecalId;
|
||||||
|
typedef IdString PartitionId;
|
||||||
|
|
||||||
struct ArchNetInfo
|
struct ArchNetInfo
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user