Add ice40 ICESTORM_LC bels

Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
Clifford Wolf 2018-06-02 15:00:33 +02:00
parent d85f5d2285
commit 20d7cd0194
3 changed files with 157 additions and 12 deletions

View File

@ -23,13 +23,13 @@
IdString belTypeToId(BelType type) IdString belTypeToId(BelType type)
{ {
if (type == TYPE_A) return "A"; if (type == TYPE_ICESTORM_LC) return "ICESTORM_LC";
return IdString(); return IdString();
} }
BelType belTypeFromId(IdString id) BelType belTypeFromId(IdString id)
{ {
if (id == "A") return TYPE_A; if (id == "ICESTORM_LC") return TYPE_ICESTORM_LC;
return TYPE_NIL; return TYPE_NIL;
} }
@ -37,15 +37,33 @@ BelType belTypeFromId(IdString id)
IdString PortPinToId(PortPin type) IdString PortPinToId(PortPin type)
{ {
if (type == PIN_FOO) return "FOO"; if (type == PIN_IN_0) return "IN_0";
if (type == PIN_BAR) return "BAR"; if (type == PIN_IN_1) return "IN_1";
if (type == PIN_IN_2) return "IN_2";
if (type == PIN_IN_3) return "IN_3";
if (type == PIN_O ) return "O";
if (type == PIN_LO ) return "LO";
if (type == PIN_CIN ) return "CIN";
if (type == PIN_COUT) return "COUT";
if (type == PIN_CEN ) return "CEN";
if (type == PIN_CLK ) return "CLK";
if (type == PIN_SR ) return "SR";
return IdString(); return IdString();
} }
PortPin PortPinFromId(IdString id) PortPin PortPinFromId(IdString id)
{ {
if (id == "FOO") return PIN_FOO; if (id == "IN_0") return PIN_IN_0;
if (id == "BAR") return PIN_BAR; if (id == "IN_1") return PIN_IN_1;
if (id == "IN_2") return PIN_IN_2;
if (id == "IN_3") return PIN_IN_3;
if (id == "O" ) return PIN_O;
if (id == "LO" ) return PIN_LO;
if (id == "CIN" ) return PIN_CIN;
if (id == "COUT") return PIN_COUT;
if (id == "CEN" ) return PIN_CEN;
if (id == "CLK" ) return PIN_CLK;
if (id == "SR" ) return PIN_SR;
return PIN_NIL; return PIN_NIL;
} }

View File

@ -35,7 +35,7 @@ struct DelayInfo
enum BelType enum BelType
{ {
TYPE_NIL, TYPE_NIL,
TYPE_A TYPE_ICESTORM_LC
}; };
IdString belTypeToId(BelType type); IdString belTypeToId(BelType type);
@ -44,8 +44,17 @@ BelType belTypeFromId(IdString id);
enum PortPin enum PortPin
{ {
PIN_NIL, PIN_NIL,
PIN_FOO = 1, PIN_IN_0,
PIN_BAR = 2 PIN_IN_1,
PIN_IN_2,
PIN_IN_3,
PIN_O,
PIN_LO,
PIN_CIN,
PIN_COUT,
PIN_CEN,
PIN_CLK,
PIN_SR
}; };
IdString PortPinToId(PortPin type); IdString PortPinToId(PortPin type);
@ -83,6 +92,16 @@ struct WireInfoPOD
BelPortPOD *bels_downhill; BelPortPOD *bels_downhill;
}; };
extern int num_bels_384;
extern int num_bels_1k;
extern int num_bels_5k;
extern int num_bels_8k;
extern BelInfoPOD bel_data_384[];
extern BelInfoPOD bel_data_1k[];
extern BelInfoPOD bel_data_5k[];
extern BelInfoPOD bel_data_8k[];
extern int num_wires_384; extern int num_wires_384;
extern int num_wires_1k; extern int num_wires_1k;
extern int num_wires_5k; extern int num_wires_5k;

View File

@ -7,10 +7,24 @@ dev_width = None
dev_height = None dev_height = None
num_wires = None num_wires = None
tiles = dict()
wire_uphill = dict() wire_uphill = dict()
wire_downhill = dict() wire_downhill = dict()
wire_bidir = dict() wire_bidir = dict()
bel_name = list()
bel_type = list()
wire_uphill_belport = dict()
wire_downhill_belports = dict()
wire_names = dict()
wire_names_r = dict()
def cmp_wire_names(newname, oldname):
return newname < oldname
with open(sys.argv[1], "r") as f: with open(sys.argv[1], "r") as f:
mode = None mode = None
@ -39,11 +53,35 @@ with open(sys.argv[1], "r") as f:
mode = ("routing", int(line[3])) mode = ("routing", int(line[3]))
continue continue
if line[0] == ".io_tile":
tiles[(int(line[1]), int(line[2]))] = "io"
mode = None
continue
if line[0] == ".logic_tile":
tiles[(int(line[1]), int(line[2]))] = "logic"
mode = None
continue
if line[0] == ".ramb_tile":
tiles[(int(line[1]), int(line[2]))] = "ramb"
mode = None
continue
if line[0] == ".ramt_tile":
tiles[(int(line[1]), int(line[2]))] = "ramt"
mode = None
continue
if (line[0][0] == ".") or (mode is None): if (line[0][0] == ".") or (mode is None):
mode = None mode = None
continue continue
if mode[0] == "net": if mode[0] == "net":
wname = (int(line[0]), int(line[1]), line[2])
wire_names[wname] = mode[1]
if (mode[1] not in wire_names_r) or cmp_wire_names(wname, wire_names_r[mode[1]]):
wire_names_r[mode[1]] = wname
continue continue
if mode[0] == "buffer": if mode[0] == "buffer":
@ -68,16 +106,72 @@ with open(sys.argv[1], "r") as f:
wire_bidir[wire_b].add(wire_b) wire_bidir[wire_b].add(wire_b)
continue continue
def add_bel_input(bel, wire, port):
if wire not in wire_downhill_belports:
wire_downhill_belports[wire] = set()
wire_downhill_belports[wire].add((bel, port))
def add_bel_output(bel, wire, port):
assert wire not in wire_uphill_belport
wire_uphill_belport[wire] = (bel, port)
def add_bel_lc(x, y, z):
bel = len(bel_name)
bel_name.append("%d_%d_lc%d" % (x, y, z))
bel_type.append("ICESTORM_LC")
wire_cen = wire_names[(x, y, "lutff_global/cen")]
wire_clk = wire_names[(x, y, "lutff_global/clk")]
wire_s_r = wire_names[(x, y, "lutff_global/s_r")]
if z == 0:
wire_cin = wire_names[(x, y, "carry_in_mux")]
else:
wire_cin = wire_names[(x, y, "lutff_%d/cout" % (z-1))]
wire_in_0 = wire_names[(x, y, "lutff_%d/in_0" % z)]
wire_in_1 = wire_names[(x, y, "lutff_%d/in_1" % z)]
wire_in_2 = wire_names[(x, y, "lutff_%d/in_2" % z)]
wire_in_3 = wire_names[(x, y, "lutff_%d/in_3" % z)]
wire_out = wire_names[(x, y, "lutff_%d/out" % z)]
wire_cout = wire_names[(x, y, "lutff_%d/cout" % z)]
wire_lout = wire_names[(x, y, "lutff_%d/lout" % z)] if z < 7 else None
add_bel_input(bel, wire_cen, "CEN")
add_bel_input(bel, wire_clk, "CLK")
add_bel_input(bel, wire_s_r, "SR")
add_bel_input(bel, wire_cin, "CIN")
add_bel_input(bel, wire_in_0, "IN_0")
add_bel_input(bel, wire_in_1, "IN_1")
add_bel_input(bel, wire_in_2, "IN_2")
add_bel_input(bel, wire_in_3, "IN_3")
add_bel_output(bel, wire_out, "O")
add_bel_output(bel, wire_cout, "COUT")
if wire_lout is not None:
add_bel_output(bel, wire_lout, "LO")
for tile_xy, tile_type in sorted(tiles.items()):
if tile_type == "logic":
for i in range(8):
add_bel_lc(tile_xy[0], tile_xy[1], i)
print('#include "chip.h"') print('#include "chip.h"')
print("int num_bels_%s = %d;" % (dev_name, num_wires))
print("BelInfoPOD bel_data_%s[%d] = {" % (dev_name, num_wires))
for bel in range(len(bel_name)):
print(" {\"%s\", TYPE_%s}%s" % (bel_name[bel], bel_type[bel], "," if bel+1 < len(bel_name) else ""))
print("};")
wireinfo = list() wireinfo = list()
for wire in range(num_wires): for wire in range(num_wires):
num_uphill = 0 num_uphill = 0
num_downhill = 0 num_downhill = 0
num_bidir = 0 num_bidir = 0
has_bel_uphill = False
num_bels_downhill = 0 num_bels_downhill = 0
if wire in wire_uphill: if wire in wire_uphill:
@ -98,12 +192,26 @@ for wire in range(num_wires):
print(",\n".join([" {%d, 1.0}" % other_wire for other_wire in wire_bidir[wire]])) print(",\n".join([" {%d, 1.0}" % other_wire for other_wire in wire_bidir[wire]]))
print("};") print("};")
if wire in wire_downhill_belports:
num_bels_downhill = len(wire_downhill_belports[wire])
print("static BelPortPOD wire%d_downbels[] = {" % wire)
print(",\n".join([" {%d, PIN_%s}" % it for it in wire_downhill_belports[wire]]))
print("};")
info = " {" info = " {"
info += "\"wire%d\", " % wire info += "\"%d_%d_%s\", " % wire_names_r[wire]
info += "%d, %d, %d, " % (num_uphill, num_downhill, num_bidir) info += "%d, %d, %d, " % (num_uphill, num_downhill, num_bidir)
info += ("wire%d_uphill, " % wire) if num_uphill > 0 else "nullptr, " info += ("wire%d_uphill, " % wire) if num_uphill > 0 else "nullptr, "
info += ("wire%d_downhill, " % wire) if num_downhill > 0 else "nullptr, " info += ("wire%d_downhill, " % wire) if num_downhill > 0 else "nullptr, "
info += ("wire%d_bidir, " % wire) if num_bidir > 0 else "nullptr, " info += ("wire%d_bidir, " % wire) if num_bidir > 0 else "nullptr, "
info += "%d, " % (num_bels_downhill)
if wire in wire_uphill_belport:
info += "{%d, PIN_%s}, " % wire_uphill_belport[wire]
else:
info += "{-1, PIN_NIL}, "
info += ("wire%d_downbels" % wire) if num_bels_downhill > 0 else "nullptr"
info += "}" info += "}"
wireinfo.append(info) wireinfo.append(info)