aboutsummaryrefslogtreecommitdiffstats
path: root/ecp5
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2019-10-26 20:38:28 +0100
committerDavid Shah <dave@ds0.me>2019-10-26 20:38:28 +0100
commit475fcd442520a1464ce6c3b1aecbea03aa158007 (patch)
tree8dfd548946394e0d53cdeb4eb8f2c0f4dcce14ee /ecp5
parent371d33146fcfda9a1c568f46fd1f5775cd4fb1be (diff)
downloadnextpnr-475fcd442520a1464ce6c3b1aecbea03aa158007.tar.gz
nextpnr-475fcd442520a1464ce6c3b1aecbea03aa158007.tar.bz2
nextpnr-475fcd442520a1464ce6c3b1aecbea03aa158007.zip
ecp5: Add an error for out-of-sync constids and bba
Signed-off-by: David Shah <dave@ds0.me>
Diffstat (limited to 'ecp5')
-rw-r--r--ecp5/arch.cc3
-rw-r--r--ecp5/arch.h1
-rw-r--r--ecp5/archdefs.h2
-rwxr-xr-xecp5/trellis_import.py6
4 files changed, 10 insertions, 2 deletions
diff --git a/ecp5/arch.cc b/ecp5/arch.cc
index 5f62d5ae..d931c5b2 100644
--- a/ecp5/arch.cc
+++ b/ecp5/arch.cc
@@ -117,6 +117,9 @@ Arch::Arch(ArchArgs args) : args(args)
log_error("Unsupported ECP5 chip type.\n");
}
#endif
+ if (chip_info->const_id_count != DB_CONST_ID_COUNT)
+ log_error("Chip database 'bba' and nextpnr code are out of sync; please rebuild (or contact distribution "
+ "maintainer)!\n");
package_info = nullptr;
for (int i = 0; i < chip_info->num_packages; i++) {
if (args.package == chip_info->package_info[i].name.get()) {
diff --git a/ecp5/arch.h b/ecp5/arch.h
index 444dfa07..3df2d84f 100644
--- a/ecp5/arch.h
+++ b/ecp5/arch.h
@@ -194,6 +194,7 @@ NPNR_PACKED_STRUCT(struct ChipInfoPOD {
int32_t num_tiles;
int32_t num_location_types;
int32_t num_packages, num_pios;
+ int32_t const_id_count;
RelPtr<LocationTypePOD> locations;
RelPtr<int32_t> location_type;
RelPtr<GlobalInfoPOD> location_glbinfo;
diff --git a/ecp5/archdefs.h b/ecp5/archdefs.h
index da12eeaa..3cd92119 100644
--- a/ecp5/archdefs.h
+++ b/ecp5/archdefs.h
@@ -58,6 +58,8 @@ enum ConstIds
#define X(t) , ID_##t
#include "constids.inc"
#undef X
+ ,
+ DB_CONST_ID_COUNT
};
#define X(t) static constexpr auto id_##t = IdString(ID_##t);
diff --git a/ecp5/trellis_import.py b/ecp5/trellis_import.py
index 610bd331..549b3080 100755
--- a/ecp5/trellis_import.py
+++ b/ecp5/trellis_import.py
@@ -441,6 +441,7 @@ def write_database(dev_name, chip, ddrg, endianness):
bba.u32(len(location_types), "num_location_types")
bba.u32(len(packages), "num_packages")
bba.u32(len(pindata), "num_pios")
+ bba.u32(const_id_count, "const_id_count")
bba.r("locations", "locations")
bba.r("location_types", "location_type")
@@ -457,11 +458,12 @@ def write_database(dev_name, chip, ddrg, endianness):
dev_names = {"25k": "LFE5UM5G-25F", "45k": "LFE5UM5G-45F", "85k": "LFE5UM5G-85F"}
def main():
- global max_row, max_col
+ global max_row, max_col, const_id_count
pytrellis.load_database(database.get_db_root())
args = parser.parse_args()
# Read port pin file
+ const_id_count = 1 # count ID_NONE
with open(args.constids) as f:
for line in f:
line = line.replace("(", " ")
@@ -473,7 +475,7 @@ def main():
assert line[0] == "X"
idx = len(constids) + 1
constids[line[1]] = idx
-
+ const_id_count += 1
constids["SLICE"] = constids["TRELLIS_SLICE"]
constids["PIO"] = constids["TRELLIS_IO"]