aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2018-08-18 14:14:27 +0200
committerClifford Wolf <clifford@clifford.at>2018-08-18 14:14:27 +0200
commit5500cf3aff5daa4d094c7c4ab46551105f0cb7cc (patch)
tree36a6cc2b1b1e7eda3680c3107700a1f2691bcf19
parent74eebc489f8df48ee526e17a69c70944658b34d4 (diff)
downloadnextpnr-5500cf3aff5daa4d094c7c4ab46551105f0cb7cc.tar.gz
nextpnr-5500cf3aff5daa4d094c7c4ab46551105f0cb7cc.tar.bz2
nextpnr-5500cf3aff5daa4d094c7c4ab46551105f0cb7cc.zip
Add ice40 wire attributes (grid position, segment list)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
-rw-r--r--ice40/arch.cc33
-rw-r--r--ice40/arch.h23
-rw-r--r--ice40/chipdb.py7
3 files changed, 45 insertions, 18 deletions
diff --git a/ice40/arch.cc b/ice40/arch.cc
index 7e2dd7f7..c70ba4a3 100644
--- a/ice40/arch.cc
+++ b/ice40/arch.cc
@@ -226,6 +226,12 @@ PortType Arch::getBelPinType(BelId bel, IdString pin) const
return PORT_INOUT;
}
+std::vector<std::pair<IdString, std::string>> Arch::getBelAttrs(BelId) const
+{
+ std::vector<std::pair<IdString, std::string>> ret;
+ return ret;
+}
+
WireId Arch::getBelPinWire(BelId bel, IdString pin) const
{
WireId ret;
@@ -331,6 +337,24 @@ IdString Arch::getWireType(WireId wire) const
return IdString();
}
+std::vector<std::pair<IdString, std::string>> Arch::getWireAttrs(WireId wire) const
+{
+ std::vector<std::pair<IdString, std::string>> ret;
+ auto &wi = chip_info->wire_data[wire.index];
+
+ ret.push_back(std::make_pair(id("GRID_X"), stringf("%d", wi.x)));
+ ret.push_back(std::make_pair(id("GRID_Y"), stringf("%d", wi.y)));
+ ret.push_back(std::make_pair(id("GRID_Z"), stringf("%d", wi.z)));
+
+ for (int i = 0; i < wi.num_segments; i++) {
+ auto &si = wi.segments[i];
+ ret.push_back(std::make_pair(id(stringf("segment[%d]", i)),
+ stringf("X%d/Y%d/%s", si.x, si.y, chip_info->tile_wire_names[si.index].get())));
+ }
+
+ return ret;
+}
+
// -----------------------------------------------------------------------
PipId Arch::getPipByName(IdString name) const
@@ -372,6 +396,15 @@ IdString Arch::getPipName(PipId pip) const
#endif
}
+IdString Arch::getPipType(PipId pip) const { return IdString(); }
+
+std::vector<std::pair<IdString, std::string>> Arch::getPipAttrs(PipId) const
+{
+ std::vector<std::pair<IdString, std::string>> ret;
+ return ret;
+}
+
+
// -----------------------------------------------------------------------
BelId Arch::getPackagePinBel(const std::string &pin) const
diff --git a/ice40/arch.h b/ice40/arch.h
index b955a478..efdcc188 100644
--- a/ice40/arch.h
+++ b/ice40/arch.h
@@ -225,6 +225,7 @@ NPNR_PACKED_STRUCT(struct ChipInfoPOD {
RelPtr<BelConfigPOD> bel_config;
RelPtr<PackageInfoPOD> packages_data;
RelPtr<CellTimingPOD> cell_timing;
+ RelPtr<RelPtr<char>> tile_wire_names;
});
#if defined(_MSC_VER)
@@ -502,11 +503,7 @@ struct Arch : BaseCtx
return IdString(chip_info->bel_data[bel.index].type);
}
- std::vector<std::pair<IdString, std::string>> getBelAttrs(BelId) const
- {
- std::vector<std::pair<IdString, std::string>> ret;
- return ret;
- }
+ std::vector<std::pair<IdString, std::string>> getBelAttrs(BelId bel) const;
WireId getBelPinWire(BelId bel, IdString pin) const;
PortType getBelPinType(BelId bel, IdString pin) const;
@@ -523,12 +520,7 @@ struct Arch : BaseCtx
}
IdString getWireType(WireId wire) const;
-
- std::vector<std::pair<IdString, std::string>> getWireAttrs(WireId) const
- {
- std::vector<std::pair<IdString, std::string>> ret;
- return ret;
- }
+ std::vector<std::pair<IdString, std::string>> getWireAttrs(WireId wire) const;
uint32_t getWireChecksum(WireId wire) const { return wire.index; }
@@ -704,13 +696,8 @@ struct Arch : BaseCtx
IdString getPipName(PipId pip) const;
- IdString getPipType(PipId pip) const { return IdString(); }
-
- std::vector<std::pair<IdString, std::string>> getPipAttrs(PipId) const
- {
- std::vector<std::pair<IdString, std::string>> ret;
- return ret;
- }
+ IdString getPipType(PipId pip) const;
+ std::vector<std::pair<IdString, std::string>> getPipAttrs(PipId pip) const;
uint32_t getPipChecksum(PipId pip) const { return pip.index; }
diff --git a/ice40/chipdb.py b/ice40/chipdb.py
index 7bdf82f0..cffeb657 100644
--- a/ice40/chipdb.py
+++ b/ice40/chipdb.py
@@ -50,6 +50,7 @@ tiletypes = dict()
wiretypes = dict()
gfx_wire_ids = dict()
+gfx_wire_names = list()
wire_segments = dict()
fast_timings = None
@@ -93,6 +94,7 @@ with open(args.gfxh) as f:
idx = len(gfx_wire_ids)
name = line.strip().rstrip(",")
gfx_wire_ids[name] = idx
+ gfx_wire_names.append(name)
def read_timings(filename):
db = dict()
@@ -932,6 +934,10 @@ bba.post('NEXTPNR_NAMESPACE_END')
bba.push("chipdb_blob_%s" % dev_name)
bba.r("chip_info_%s" % dev_name, "chip_info")
+bba.l("tile_wire_names")
+for name in gfx_wire_names:
+ bba.s(name, name)
+
for bel in range(len(bel_name)):
bba.l("bel_wires_%d" % bel, "BelWirePOD")
for data in sorted(bel_wires[bel]):
@@ -1276,5 +1282,6 @@ bba.r("bits_info_%s" % dev_name, "bits_info")
bba.r("bel_config_%s" % dev_name if len(extra_cell_config) > 0 else None, "bel_config")
bba.r("package_info_%s" % dev_name, "packages_data")
bba.r("cell_timings_%s" % dev_name, "cell_timing")
+bba.r("tile_wire_names", "tile_wire_names")
bba.pop()