diff --git a/xc7/arch.cc b/xc7/arch.cc
index c4178b0..90f8d82 100644
--- a/xc7/arch.cc
+++ b/xc7/arch.cc
@@ -442,44 +442,14 @@
 BelRange Arch::getBelsByTile(int x, int y) const
 {
     BelRange br;
-
-    br.b.cursor = Arch::getBelByLocation(Loc(x, y, 0)).index;
-    br.e.cursor = br.b.cursor;
-
-    if (br.e.cursor != -1) {
-        while (br.e.cursor < chip_info->num_bels && chip_info->bel_data[br.e.cursor].x == x &&
-               chip_info->bel_data[br.e.cursor].y == y)
-            br.e.cursor++;
-    }
-
+    NPNR_ASSERT("TODO");
     return br;
 }
 
 PortType Arch::getBelPinType(BelId bel, IdString pin) const
 {
     NPNR_ASSERT(bel != BelId());
-
-    int num_bel_wires = chip_info->bel_data[bel.index].num_bel_wires;
-    const BelWirePOD *bel_wires = chip_info->bel_data[bel.index].bel_wires.get();
-
-    if (num_bel_wires < 7) {
-        for (int i = 0; i < num_bel_wires; i++) {
-            if (bel_wires[i].port == pin.index)
-                return PortType(bel_wires[i].type);
-        }
-    } else {
-        int b = 0, e = num_bel_wires - 1;
-        while (b <= e) {
-            int i = (b + e) / 2;
-            if (bel_wires[i].port == pin.index)
-                return PortType(bel_wires[i].type);
-            if (bel_wires[i].port > pin.index)
-                e = i - 1;
-            else
-                b = i + 1;
-        }
-    }
-
+    NPNR_ASSERT("TODO");
     return PORT_INOUT;
 }
 
diff --git a/xc7/arch.h b/xc7/arch.h
index 699d357..0dd0894 100644
--- a/xc7/arch.h
+++ b/xc7/arch.h
@@ -64,210 +64,6 @@
 
 NEXTPNR_NAMESPACE_BEGIN
 
-/**** Everything in this section must be kept in sync with chipdb.py ****/
-
-template <typename T> struct RelPtr
-{
-    int32_t offset;
-
-    // void set(const T *ptr) {
-    //     offset = reinterpret_cast<const char*>(ptr) -
-    //              reinterpret_cast<const char*>(this);
-    // }
-
-    const T *get() const { return reinterpret_cast<const T *>(reinterpret_cast<const char *>(this) + offset); }
-
-    const T &operator[](size_t index) const { return get()[index]; }
-
-    const T &operator*() const { return *(get()); }
-
-    const T *operator->() const { return get(); }
-};
-
-NPNR_PACKED_STRUCT(struct BelWirePOD {
-    int32_t port;
-    int32_t type;
-    int32_t wire_index;
-});
-
-NPNR_PACKED_STRUCT(struct BelInfoPOD {
-    RelPtr<char> name;
-    int32_t type;
-    int32_t num_bel_wires;
-    RelPtr<BelWirePOD> bel_wires;
-    int8_t x, y, z;
-    int8_t padding_0;
-});
-
-NPNR_PACKED_STRUCT(struct BelPortPOD {
-    int32_t bel_index;
-    int32_t port;
-});
-
-NPNR_PACKED_STRUCT(struct PipInfoPOD {
-    enum PipFlags : uint32_t
-    {
-        FLAG_NONE = 0,
-        FLAG_ROUTETHRU = 1,
-        FLAG_NOCARRY = 2
-    };
-
-    // RelPtr<char> name;
-    int32_t src, dst;
-    int32_t fast_delay;
-    int32_t slow_delay;
-    int8_t x, y;
-    int16_t src_seg, dst_seg;
-    int16_t switch_mask;
-    int32_t switch_index;
-    PipFlags flags;
-});
-
-NPNR_PACKED_STRUCT(struct WireSegmentPOD {
-    int8_t x, y;
-    int16_t index;
-});
-
-NPNR_PACKED_STRUCT(struct WireInfoPOD {
-    enum WireType : int8_t
-    {
-        WIRE_TYPE_NONE = 0,
-        WIRE_TYPE_GLB2LOCAL = 1,
-        WIRE_TYPE_GLB_NETWK = 2,
-        WIRE_TYPE_LOCAL = 3,
-        WIRE_TYPE_LUTFF_IN = 4,
-        WIRE_TYPE_LUTFF_IN_LUT = 5,
-        WIRE_TYPE_LUTFF_LOUT = 6,
-        WIRE_TYPE_LUTFF_OUT = 7,
-        WIRE_TYPE_LUTFF_COUT = 8,
-        WIRE_TYPE_LUTFF_GLOBAL = 9,
-        WIRE_TYPE_CARRY_IN_MUX = 10,
-        WIRE_TYPE_SP4_V = 11,
-        WIRE_TYPE_SP4_H = 12,
-        WIRE_TYPE_SP12_V = 13,
-        WIRE_TYPE_SP12_H = 14
-    };
-
-    RelPtr<char> name;
-    int32_t num_uphill, num_downhill;
-    RelPtr<int32_t> pips_uphill, pips_downhill;
-
-    int32_t num_bel_pins;
-    RelPtr<BelPortPOD> bel_pins;
-
-    int32_t num_segments;
-    RelPtr<WireSegmentPOD> segments;
-
-    int32_t fast_delay;
-    int32_t slow_delay;
-
-    int8_t x, y, z;
-    WireType type;
-});
-
-NPNR_PACKED_STRUCT(struct PackagePinPOD {
-    RelPtr<char> name;
-    int32_t bel_index;
-});
-
-NPNR_PACKED_STRUCT(struct PackageInfoPOD {
-    RelPtr<char> name;
-    int32_t num_pins;
-    RelPtr<PackagePinPOD> pins;
-});
-
-enum TileType : uint32_t
-{
-    TILE_NONE = 0,
-    TILE_LOGIC = 1,
-    TILE_IO = 2,
-    TILE_RAMB = 3,
-    TILE_RAMT = 4,
-    TILE_DSP0 = 5,
-    TILE_DSP1 = 6,
-    TILE_DSP2 = 7,
-    TILE_DSP3 = 8,
-    TILE_IPCON = 9
-};
-
-NPNR_PACKED_STRUCT(struct ConfigBitPOD { int8_t row, col; });
-
-NPNR_PACKED_STRUCT(struct ConfigEntryPOD {
-    RelPtr<char> name;
-    int32_t num_bits;
-    RelPtr<ConfigBitPOD> bits;
-});
-
-NPNR_PACKED_STRUCT(struct TileInfoPOD {
-    int8_t cols, rows;
-    int16_t num_config_entries;
-    RelPtr<ConfigEntryPOD> entries;
-});
-
-static const int max_switch_bits = 5;
-
-NPNR_PACKED_STRUCT(struct SwitchInfoPOD {
-    int32_t num_bits;
-    int32_t bel;
-    int8_t x, y;
-    ConfigBitPOD cbits[max_switch_bits];
-});
-
-NPNR_PACKED_STRUCT(struct IerenInfoPOD {
-    int8_t iox, ioy, ioz;
-    int8_t ierx, iery, ierz;
-});
-
-NPNR_PACKED_STRUCT(struct BitstreamInfoPOD {
-    int32_t num_switches, num_ierens;
-    RelPtr<TileInfoPOD> tiles_nonrouting;
-    RelPtr<SwitchInfoPOD> switches;
-    RelPtr<IerenInfoPOD> ierens;
-});
-
-NPNR_PACKED_STRUCT(struct BelConfigEntryPOD {
-    RelPtr<char> entry_name;
-    RelPtr<char> cbit_name;
-    int8_t x, y;
-    int16_t padding;
-});
-
-// Stores mapping between bel parameters and config bits,
-// for extra cells where this mapping is non-trivial
-NPNR_PACKED_STRUCT(struct BelConfigPOD {
-    int32_t bel_index;
-    int32_t num_entries;
-    RelPtr<BelConfigEntryPOD> entries;
-});
-
-NPNR_PACKED_STRUCT(struct CellPathDelayPOD {
-    int32_t from_port;
-    int32_t to_port;
-    int32_t fast_delay;
-    int32_t slow_delay;
-});
-
-NPNR_PACKED_STRUCT(struct CellTimingPOD {
-    int32_t type;
-    int32_t num_paths;
-    RelPtr<CellPathDelayPOD> path_delays;
-});
-
-NPNR_PACKED_STRUCT(struct ChipInfoPOD {
-    int32_t width, height;
-    int32_t num_bels, num_wires, num_pips;
-    int32_t num_switches, num_belcfgs, num_packages;
-    int32_t num_timing_cells;
-    RelPtr<BelInfoPOD> bel_data;
-    RelPtr<WireInfoPOD> wire_data;
-    RelPtr<PipInfoPOD> pip_data;
-    RelPtr<TileType> tile_grid;
-    RelPtr<BitstreamInfoPOD> bits_info;
-    RelPtr<BelConfigPOD> bel_config;
-    RelPtr<PackageInfoPOD> packages_data;
-    RelPtr<CellTimingPOD> cell_timing;
-});
-
 struct TorcInfo
 {
     TorcInfo(BaseCtx *ctx, const std::string &inDeviceName, const std::string &inPackageName);
@@ -339,8 +135,6 @@
 };
 extern std::unique_ptr<const TorcInfo> torc_info;
 
-/************************ End of chipdb section. ************************/
-
 struct BelIterator
 {
     int cursor;
@@ -485,9 +279,6 @@
 
 struct Arch : BaseCtx
 {
-    bool fast_part;
-    const ChipInfoPOD *chip_info;
-    const PackageInfoPOD *package_info;
     int width;
     int height;
 
diff --git a/xc7/chains.cc b/xc7/chains.cc
index be1d676..819df18 100644
--- a/xc7/chains.cc
+++ b/xc7/chains.cc
@@ -77,7 +77,7 @@
         bool start_of_chain = true;
         std::vector<CellChain> chains;
         std::vector<const CellInfo *> tile;
-        const int max_length = (ctx->chip_info->height - 2) * 8 - 2;
+        const int max_length = (torc_info->height - 2) * 8 - 2;
         auto curr_cell = carryc.cells.begin();
         while (curr_cell != carryc.cells.end()) {
             CellInfo *cell = *curr_cell;
diff --git a/xc7/chipdb.py b/xc7/chipdb.py
deleted file mode 100644
index 7bdf82f..0000000
--- a/xc7/chipdb.py
+++ /dev/null
@@ -1,1280 +0,0 @@
-#!/usr/bin/env python3
-
-import sys
-import re
-import textwrap
-import argparse
-
-parser = argparse.ArgumentParser(description="convert ICE40 chip database")
-parser.add_argument("filename", type=str, help="chipdb input filename")
-parser.add_argument("-p", "--constids", type=str, help="path to constids.inc")
-parser.add_argument("-g", "--gfxh", type=str, help="path to gfx.h")
-parser.add_argument("--fast", type=str, help="path to timing data for fast part")
-parser.add_argument("--slow", type=str, help="path to timing data for slow part")
-args = parser.parse_args()
-
-dev_name = None
-dev_width = None
-dev_height = None
-num_wires = None
-
-tiles = dict()
-
-wire_uphill = dict()
-wire_downhill = dict()
-pip_xy = dict()
-
-bel_name = list()
-bel_type = list()
-bel_pos = list()
-bel_wires = list()
-
-switches = list()
-
-ierens = list()
-
-extra_cells = dict()
-extra_cell_config = dict()
-packages = list()
-
-wire_belports = dict()
-
-wire_names = dict()
-wire_names_r = dict()
-wire_xy = dict()
-
-cbit_re = re.compile(r'B(\d+)\[(\d+)\]')
-
-constids = dict()
-tiletypes = dict()
-wiretypes = dict()
-
-gfx_wire_ids = dict()
-wire_segments = dict()
-
-fast_timings = None
-slow_timings = None
-
-with open(args.constids) as f:
-    for line in f:
-        if line.startswith("//"):
-            continue
-        line = line.replace("(", " ")
-        line = line.replace(")", " ")
-        line = line.split()
-        if len(line) == 0:
-            continue
-        assert len(line) == 2
-        assert line[0] == "X"
-        idx = len(constids) + 1
-        constids[line[1]] = idx
-
-constids["PLL"] = constids["ICESTORM_PLL"]
-constids["WARMBOOT"] = constids["SB_WARMBOOT"]
-constids["MAC16"] = constids["ICESTORM_DSP"]
-constids["HFOSC"] = constids["ICESTORM_HFOSC"]
-constids["LFOSC"] = constids["ICESTORM_LFOSC"]
-constids["I2C"] = constids["SB_I2C"]
-constids["SPI"] = constids["SB_SPI"]
-constids["LEDDA_IP"] = constids["SB_LEDDA_IP"]
-constids["RGBA_DRV"] = constids["SB_RGBA_DRV"]
-constids["SPRAM"] = constids["ICESTORM_SPRAM"]
-
-with open(args.gfxh) as f:
-    state = 0
-    for line in f:
-        if state == 0 and line.startswith("enum GfxTileWireId"):
-            state = 1
-        elif state == 1 and line.startswith("};"):
-            state = 0
-        elif state == 1 and (line.startswith("{") or line.strip() == ""):
-            pass
-        elif state == 1:
-            idx = len(gfx_wire_ids)
-            name = line.strip().rstrip(",")
-            gfx_wire_ids[name] = idx
-
-def read_timings(filename):
-    db = dict()
-    with open(filename) as f:
-        cell = None
-        for line in f:
-            line = line.split()
-            if len(line) == 0:
-                continue
-            if line[0] == "CELL":
-                cell = line[1]
-            if line[0] == "IOPATH":
-                key = "%s.%s.%s" % (cell, line[1], line[2])
-                v1 = line[3].split(":")[2]
-                v2 = line[4].split(":")[2]
-                v1 = 0 if v1 == "*" else float(v1)
-                v2 = 0 if v2 == "*" else float(v2)
-                db[key] = max(v1, v2)
-    return db
-
-if args.fast is not None:
-    fast_timings = read_timings(args.fast)
-
-if args.slow is not None:
-    slow_timings = read_timings(args.slow)
-
-tiletypes["NONE"] = 0
-tiletypes["LOGIC"] = 1
-tiletypes["IO"] = 2
-tiletypes["RAMB"] = 3
-tiletypes["RAMT"] = 4
-tiletypes["DSP0"] = 5
-tiletypes["DSP1"] = 6
-tiletypes["DSP2"] = 7
-tiletypes["DSP3"] = 8
-tiletypes["IPCON"] = 9
-
-wiretypes["NONE"]         = 0
-wiretypes["GLB2LOCAL"]    = 1
-wiretypes["GLB_NETWK"]    = 2
-wiretypes["LOCAL"]        = 3
-wiretypes["LUTFF_IN"]     = 4
-wiretypes["LUTFF_IN_LUT"] = 5
-wiretypes["LUTFF_LOUT"]   = 6
-wiretypes["LUTFF_OUT"]    = 7
-wiretypes["LUTFF_COUT"]   = 8
-wiretypes["LUTFF_GLOBAL"] = 9
-wiretypes["CARRY_IN_MUX"] = 10
-wiretypes["SP4_V"]        = 11
-wiretypes["SP4_H"]        = 12
-wiretypes["SP12_V"]       = 13
-wiretypes["SP12_H"]       = 14
-
-def maj_wire_name(name):
-    if name[2].startswith("lutff_"):
-        return True
-    if name[2].startswith("io_"):
-        return True
-    if name[2].startswith("ram/"):
-        return True
-    if name[2].startswith("sp4_h_r_"):
-        return name[2] in ("sp4_h_r_0", "sp4_h_r_1", "sp4_h_r_2", "sp4_h_r_3", "sp4_h_r_4", "sp4_h_r_5",
-                           "sp4_h_r_6", "sp4_h_r_7", "sp4_h_r_8", "sp4_h_r_9", "sp4_h_r_10", "sp4_h_r_11")
-    if name[2].startswith("sp4_v_b_"):
-        return name[2] in ("sp4_v_b_0", "sp4_v_b_1", "sp4_v_b_2", "sp4_v_b_3", "sp4_v_b_4", "sp4_v_b_5",
-                           "sp4_v_b_6", "sp4_v_b_7", "sp4_v_b_8", "sp4_v_b_9", "sp4_v_b_10", "sp4_v_b_11")
-    if name[2].startswith("sp12_h_r_"):
-        return name[2] in ("sp12_h_r_0", "sp12_h_r_1")
-    if name[2].startswith("sp12_v_b_"):
-        return name[2] in ("sp12_v_b_0", "sp12_v_b_1")
-    return False
-
-def cmp_wire_names(newname, oldname):
-    if maj_wire_name(newname):
-        return True
-    if maj_wire_name(oldname):
-        return False
-
-    if newname[2].startswith("sp") and oldname[2].startswith("sp"):
-        m1 = re.match(r".*_(\d+)$", newname[2])
-        m2 = re.match(r".*_(\d+)$", oldname[2])
-        if m1 and m2:
-            idx1 = int(m1.group(1))
-            idx2 = int(m2.group(1))
-            if idx1 != idx2:
-                return idx1 < idx2
-
-    return newname < oldname
-
-def wire_type(name):
-    longname = name
-    name = name.split('/')
-
-    if name[0].startswith("X") and name[1].startswith("Y"):
-        name = name[2:]
-
-    if name[0].startswith("sp4_v_") or name[0].startswith("sp4_r_v_") or name[0].startswith("span4_vert_"):
-        return "SP4_V"
-
-    if name[0].startswith("sp4_h_") or name[0].startswith("span4_horz_"):
-        return "SP4_H"
-
-    if name[0].startswith("sp12_v_") or name[0].startswith("span12_vert_"):
-        return "SP12_V"
-
-    if name[0].startswith("sp12_h_") or name[0].startswith("span12_horz_"):
-        return "SP12_H"
-
-    if name[0].startswith("glb2local"):
-        return "GLB2LOCAL"
-
-    if name[0].startswith("glb_netwk_"):
-        return "GLB_NETWK"
-
-    if name[0].startswith("local_"):
-        return "LOCAL"
-
-    if name[0].startswith("lutff_"):
-        if name[1].startswith("in_"):
-            return "LUTFF_IN_LUT" if name[1].endswith("_lut") else "LUTFF_IN"
-
-        if name[1] == "lout":
-            return "LUTFF_LOUT"
-        if name[1] == "out":
-            return "LUTFF_OUT"
-        if name[1] == "cout":
-            return "LUTFF_COUT"
-
-    if name[0] == "ram":
-        if name[1].startswith("RADDR_"):
-            return "LUTFF_IN"
-        if name[1].startswith("WADDR_"):
-            return "LUTFF_IN"
-        if name[1].startswith("WDATA_"):
-            return "LUTFF_IN"
-        if name[1].startswith("MASK_"):
-            return "LUTFF_IN"
-        if name[1].startswith("RDATA_"):
-            return "LUTFF_OUT"
-        if name[1] in ("WCLK", "WCLKE", "WE", "RCLK", "RCLKE", "RE"):
-            return "LUTFF_GLOBAL"
-
-    if name[0].startswith("io_"):
-        if name[1].startswith("D_IN_") or name[1] == "OUT_ENB":
-            return "LUTFF_IN"
-        if name[1].startswith("D_OUT_"):
-            return "LUTFF_OUT"
-    if name[0] == "fabout":
-        return "LUTFF_IN"
-
-    if name[0] == "lutff_global" or name[0] == "io_global":
-        return "LUTFF_GLOBAL"
-
-    if name[0] == "carry_in_mux":
-        return "CARRY_IN_MUX"
-
-    if name[0] == "carry_in":
-        return "LUTFF_COUT"
-
-    if name[0].startswith("neigh_op_"):
-        return "NONE"
-
-    if name[0].startswith("padin_"):
-        return "NONE"
-
-    # print("No type for wire: %s (%s)" % (longname, name), file=sys.stderr)
-    # assert 0
-
-    return "NONE"
-
-def pipdelay(src_idx, dst_idx, db):
-    if db is None:
-        return 0
-
-    src = wire_names_r[src_idx]
-    dst = wire_names_r[dst_idx]
-    src_type = wire_type(src[2])
-    dst_type = wire_type(dst[2])
-
-    if dst[2].startswith("sp4_") or dst[2].startswith("span4_"):
-        if src[2].startswith("sp12_") or src[2].startswith("span12_"):
-            return db["Sp12to4.I.O"]
-
-        if src[2].startswith("span4_"):
-            return db["IoSpan4Mux.I.O"]
-
-        if dst[2].startswith("sp4_h_"):
-            return db["Span4Mux_h4.I.O"]
-        else:
-            return db["Span4Mux_v4.I.O"]
-
-    if dst[2].startswith("sp12_") or dst[2].startswith("span12_"):
-        if dst[2].startswith("sp12_h_"):
-            return db["Span12Mux_h12.I.O"]
-        else:
-            return db["Span12Mux_v12.I.O"]
-
-    if dst[2] in ("fabout", "clk"):
-        return 0 # FIXME?
-
-    if src[2].startswith("glb_netwk_") and dst[2].startswith("glb2local_"):
-        return 0 # FIXME?
-
-    if dst[2] == "carry_in_mux":
-        return db["ICE_CARRY_IN_MUX.carryinitin.carryinitout"]
-
-    if dst[2] in ("lutff_global/clk", "io_global/inclk", "io_global/outclk", "ram/RCLK", "ram/WCLK"):
-        return db["ClkMux.I.O"]
-
-    if dst[2] in ("lutff_global/s_r", "io_global/latch", "ram/RE", "ram/WE"):
-        return db["SRMux.I.O"]
-
-    if dst[2] in ("lutff_global/cen", "io_global/cen", "ram/RCLKE", "ram/WCLKE"):
-        return db["CEMux.I.O"]
-
-    if dst[2].startswith("local_"):
-        return db["LocalMux.I.O"]
-
-    if src[2].startswith("local_") and dst[2] in ("io_0/D_OUT_0", "io_0/D_OUT_1", "io_0/OUT_ENB", "io_1/D_OUT_0", "io_1/D_OUT_1", "io_1/OUT_ENB"):
-        return db["IoInMux.I.O"]
-
-    if re.match(r"lutff_\d+/in_\d+$", dst[2]):
-        return db["InMux.I.O"]
-
-    if re.match(r"lutff_\d+/in_\d+_lut", dst[2]):
-        return 0
-
-    if re.match(r"ram/(MASK|RADDR|WADDR|WDATA)_", dst[2]):
-        return db["InMux.I.O"]
-
-    if re.match(r"lutff_\d+/out", dst[2]):
-        if re.match(r"lutff_\d+/in_0", src[2]):
-            return db["LogicCell40.in0.lcout"]
-        if re.match(r"lutff_\d+/in_1", src[2]):
-            return db["LogicCell40.in1.lcout"]
-        if re.match(r"lutff_\d+/in_2", src[2]):
-            return db["LogicCell40.in2.lcout"]
-        if re.match(r"lutff_\d+/in_3", src[2]):
-            return db["LogicCell40.in3.lcout"]
-
-    print(src, dst, src_idx, dst_idx, src_type, dst_type, file=sys.stderr)
-    assert 0
-
-def wiredelay(wire_idx, db):
-    if db is None:
-        return 0
-
-    wire = wire_names_r[wire_idx]
-    wtype = wire_type(wire[2])
-
-    # FIXME
-    return 0
-
-def init_tiletypes(device):
-    global num_tile_types, tile_sizes, tile_bits
-    if device == "5k":
-        num_tile_types = 10
-    else:
-        num_tile_types = 5
-    tile_sizes = {i: (0, 0) for i in range(num_tile_types)}
-    tile_bits = [[] for _ in range(num_tile_types)]
-
-with open(args.filename, "r") as f:
-    mode = None
-
-    for line in f:
-        line = line.split()
-
-        if len(line) == 0 or line[0] == "#":
-            continue
-
-        if line[0] == ".device":
-            dev_name = line[1]
-            init_tiletypes(dev_name)
-            dev_width = int(line[2])
-            dev_height = int(line[3])
-            num_wires = int(line[4])
-            continue
-
-        if line[0] == ".net":
-            mode = ("net", int(line[1]))
-            continue
-
-        if line[0] == ".buffer":
-            mode = ("buffer", int(line[3]), int(line[1]), int(line[2]))
-            switches.append((int(line[1]), int(line[2]), line[4:], -1))
-            continue
-
-        if line[0] == ".routing":
-            mode = ("routing", int(line[3]), int(line[1]), int(line[2]))
-            switches.append((int(line[1]), int(line[2]), line[4:], -1))
-            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] == ".dsp0_tile":
-            tiles[(int(line[1]), int(line[2]))] = "dsp0"
-            mode = None
-            continue
-
-        if line[0] == ".dsp1_tile":
-            tiles[(int(line[1]), int(line[2]))] = "dsp1"
-            mode = None
-            continue
-
-        if line[0] == ".dsp2_tile":
-            tiles[(int(line[1]), int(line[2]))] = "dsp2"
-            mode = None
-            continue
-
-        if line[0] == ".dsp3_tile":
-            tiles[(int(line[1]), int(line[2]))] = "dsp3"
-            mode = None
-            continue
-
-        if line[0] == ".ipcon_tile":
-            tiles[(int(line[1]), int(line[2]))] = "ipcon"
-            mode = None
-            continue
-
-        if line[0] == ".logic_tile_bits":
-            mode = ("bits", 1)
-            tile_sizes[1] = (int(line[1]), int(line[2]))
-            continue
-
-        if line[0] == ".io_tile_bits":
-            mode = ("bits", 2)
-            tile_sizes[2] = (int(line[1]), int(line[2]))
-            continue
-
-        if line[0] == ".ramb_tile_bits":
-            mode = ("bits", 3)
-            tile_sizes[3] = (int(line[1]), int(line[2]))
-            continue
-
-        if line[0] == ".ramt_tile_bits":
-            mode = ("bits", 4)
-            tile_sizes[4] = (int(line[1]), int(line[2]))
-            continue
-
-        if line[0] == ".dsp0_tile_bits":
-            mode = ("bits", 5)
-            tile_sizes[5] = (int(line[1]), int(line[2]))
-            continue
-
-        if line[0] == ".dsp1_tile_bits":
-            mode = ("bits", 6)
-            tile_sizes[6] = (int(line[1]), int(line[2]))
-            continue
-
-        if line[0] == ".dsp2_tile_bits":
-            mode = ("bits", 7)
-            tile_sizes[7] = (int(line[1]), int(line[2]))
-            continue
-
-        if line[0] == ".dsp3_tile_bits":
-            mode = ("bits", 8)
-            tile_sizes[8] = (int(line[1]), int(line[2]))
-            continue
-
-        if line[0] == ".ipcon_tile_bits":
-            mode = ("bits", 9)
-            tile_sizes[9] = (int(line[1]), int(line[2]))
-            continue
-
-        if line[0] == ".ieren":
-            mode = ("ieren",)
-            continue
-
-        if line[0] == ".pins":
-            mode = ("pins", line[1])
-            packages.append((line[1], []))
-            continue
-
-        if line[0] == ".extra_cell":
-            if len(line) >= 5:
-                mode = ("extra_cell", (line[4], int(line[1]), int(line[2]), int(line[3])))
-            elif line[3] == "WARMBOOT":
-                mode = ("extra_cell", (line[3], int(line[1]), int(line[2]), 0))
-            elif line[3] == "PLL":
-                mode = ("extra_cell", (line[3], int(line[1]), int(line[2]), 3))
-            else:
-                assert 0
-            extra_cells[mode[1]] = []
-            continue
-
-        if (line[0][0] == ".") or (mode is None):
-            mode = None
-            continue
-
-        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
-            if mode[1] not in wire_xy:
-                wire_xy[mode[1]] = list()
-            wire_xy[mode[1]].append((int(line[0]), int(line[1])))
-            if mode[1] not in wire_segments:
-                wire_segments[mode[1]] = dict()
-            if ("TILE_WIRE_" + wname[2].upper().replace("/", "_")) in gfx_wire_ids:
-                wire_segments[mode[1]][(wname[0], wname[1])] = wname[2]
-            continue
-
-        if mode[0] in ("buffer", "routing"):
-            wire_a = int(line[1])
-            wire_b = mode[1]
-            if wire_a not in wire_downhill:
-                wire_downhill[wire_a] = set()
-            if wire_b not in wire_uphill:
-                wire_uphill[wire_b] = set()
-            wire_downhill[wire_a].add(wire_b)
-            wire_uphill[wire_b].add(wire_a)
-            pip_xy[(wire_a, wire_b)] = (mode[2], mode[3], int(line[0], 2), len(switches) - 1, 0)
-            continue
-
-        if mode[0] == "bits":
-            name = line[0]
-            bits = []
-            for b in line[1:]:
-                m = cbit_re.match(b)
-                assert m
-                bits.append((int(m.group(1)), int(m.group(2))))
-            tile_bits[mode[1]].append((name, bits))
-            continue
-
-        if mode[0] == "ieren":
-            ierens.append(tuple([int(_) for _ in line]))
-            continue
-
-        if mode[0] == "pins":
-            packages[-1][1].append((line[0], int(line[1]), int(line[2]), int(line[3])))
-            continue
-
-        if mode[0] == "extra_cell":
-            if line[0] == "LOCKED":
-                extra_cells[mode[1]].append((("LOCKED_" + line[1]), (0, 0, "LOCKED")))
-            else:
-                extra_cells[mode[1]].append((line[0], (int(line[1]), int(line[2]), line[3])))
-            continue
-
-def add_wire(x, y, name):
-    global num_wires
-    wire_idx = num_wires
-    num_wires = num_wires + 1
-    wname = (x, y, name)
-    wire_names[wname] = wire_idx
-    wire_names_r[wire_idx] = wname
-    wire_segments[wire_idx] = dict()
-    if ("TILE_WIRE_" + wname[2].upper().replace("/", "_")) in gfx_wire_ids:
-        wire_segments[wire_idx][(wname[0], wname[1])] = wname[2]
-    return wire_idx
-
-def add_switch(x, y, bel=-1):
-    switches.append((x, y, [], bel))
-
-def add_pip(src, dst, flags=0):
-    x, y, _, _ = switches[-1]
-
-    if src not in wire_downhill:
-        wire_downhill[src] = set()
-    wire_downhill[src].add(dst)
-
-    if dst not in wire_uphill:
-        wire_uphill[dst] = set()
-    wire_uphill[dst].add(src)
-
-    pip_xy[(src, dst)] = (x, y, 0, len(switches) - 1, flags)
-
-# Add virtual padin wires
-for i in range(8):
-    add_wire(0, 0, "padin_%d" % i)
-
-def add_bel_input(bel, wire, port):
-    if wire not in wire_belports:
-        wire_belports[wire] = set()
-    wire_belports[wire].add((bel, port))
-    bel_wires[bel].append((constids[port], 0, wire))
-
-def add_bel_output(bel, wire, port):
-    if wire not in wire_belports:
-        wire_belports[wire] = set()
-    wire_belports[wire].add((bel, port))
-    bel_wires[bel].append((constids[port], 1, wire))
-
-def add_bel_lc(x, y, z):
-    bel = len(bel_name)
-    bel_name.append("X%d/Y%d/lc%d" % (x, y, z))
-    bel_type.append("ICESTORM_LC")
-    bel_pos.append((x, y, z))
-    bel_wires.append(list())
-
-    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 = add_wire(x, y, "lutff_%d/in_0_lut" % z)
-    wire_in_1 = add_wire(x, y, "lutff_%d/in_1_lut" % z)
-    wire_in_2 = add_wire(x, y, "lutff_%d/in_2_lut" % z)
-    wire_in_3 = add_wire(x, y, "lutff_%d/in_3_lut" % 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, "I0")
-    add_bel_input(bel, wire_in_1, "I1")
-    add_bel_input(bel, wire_in_2, "I2")
-    add_bel_input(bel, wire_in_3, "I3")
-
-    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")
-
-    # route-through LUTs
-    add_switch(x, y, bel)
-    add_pip(wire_in_0, wire_out, 1)
-    add_pip(wire_in_1, wire_out, 1)
-    add_pip(wire_in_2, wire_out, 1)
-    add_pip(wire_in_3, wire_out, 1)
-
-    # LUT permutation pips
-    for i in range(4):
-        add_switch(x, y, bel)
-        for j in range(4):
-            if (i == j) or ((i, j) == (1, 2)) or ((i, j) == (2, 1)):
-                flags = 0
-            else:
-                flags = 2
-            add_pip(wire_names[(x, y, "lutff_%d/in_%d" % (z, i))],
-                    wire_names[(x, y, "lutff_%d/in_%d_lut"  % (z, j))], flags)
-
-def add_bel_io(x, y, z):
-    bel = len(bel_name)
-    bel_name.append("X%d/Y%d/io%d" % (x, y, z))
-    bel_type.append("SB_IO")
-    bel_pos.append((x, y, z))
-    bel_wires.append(list())
-
-    wire_cen   = wire_names[(x, y, "io_global/cen")]
-    wire_iclk  = wire_names[(x, y, "io_global/inclk")]
-    wire_latch = wire_names[(x, y, "io_global/latch")]
-    wire_oclk  = wire_names[(x, y, "io_global/outclk")]
-
-    wire_din_0  = wire_names[(x, y, "io_%d/D_IN_0"  % z)]
-    wire_din_1  = wire_names[(x, y, "io_%d/D_IN_1"  % z)]
-    wire_dout_0 = wire_names[(x, y, "io_%d/D_OUT_0" % z)]
-    wire_dout_1 = wire_names[(x, y, "io_%d/D_OUT_1" % z)]
-    wire_out_en = wire_names[(x, y, "io_%d/OUT_ENB" % z)]
-
-    add_bel_input(bel, wire_cen,    "CLOCK_ENABLE")
-    add_bel_input(bel, wire_iclk,   "INPUT_CLK")
-    add_bel_input(bel, wire_oclk,   "OUTPUT_CLK")
-    add_bel_input(bel, wire_latch,  "LATCH_INPUT_VALUE")
-
-    add_bel_output(bel, wire_din_0, "D_IN_0")
-    add_bel_output(bel, wire_din_1, "D_IN_1")
-
-    add_bel_input(bel, wire_dout_0, "D_OUT_0")
-    add_bel_input(bel, wire_dout_1, "D_OUT_1")
-    add_bel_input(bel, wire_out_en, "OUTPUT_ENABLE")
-
-def add_bel_ram(x, y):
-    bel = len(bel_name)
-    bel_name.append("X%d/Y%d/ram" % (x, y))
-    bel_type.append("ICESTORM_RAM")
-    bel_pos.append((x, y, 0))
-    bel_wires.append(list())
-
-    if (x, y, "ram/WE") in wire_names:
-        # iCE40 1K-style memories
-        y0, y1 = y, y+1
-    else:
-        # iCE40 8K-style memories
-        y1, y0 = y, y+1
-
-    for i in range(16):
-        add_bel_input (bel, wire_names[(x, y0 if i < 8 else y1, "ram/MASK_%d"  % i)], "MASK_%d"  % i)
-        add_bel_input (bel, wire_names[(x, y0 if i < 8 else y1, "ram/WDATA_%d" % i)], "WDATA_%d" % i)
-        add_bel_output(bel, wire_names[(x, y0 if i < 8 else y1, "ram/RDATA_%d" % i)], "RDATA_%d" % i)
-
-    for i in range(11):
-        add_bel_input(bel, wire_names[(x, y0, "ram/WADDR_%d" % i)], "WADDR_%d" % i)
-        add_bel_input(bel, wire_names[(x, y1, "ram/RADDR_%d" % i)], "RADDR_%d" % i)
-
-    add_bel_input(bel, wire_names[(x, y0, "ram/WCLK")], "WCLK")
-    add_bel_input(bel, wire_names[(x, y0, "ram/WCLKE")], "WCLKE")
-    add_bel_input(bel, wire_names[(x, y0, "ram/WE")], "WE")
-
-    add_bel_input(bel, wire_names[(x, y1, "ram/RCLK")], "RCLK")
-    add_bel_input(bel, wire_names[(x, y1, "ram/RCLKE")], "RCLKE")
-    add_bel_input(bel, wire_names[(x, y1, "ram/RE")], "RE")
-
-def add_bel_gb(xy, x, y, g):
-    if xy[0] != x or xy[1] != y:
-        return
-
-    bel = len(bel_name)
-    bel_name.append("X%d/Y%d/gb" % (x, y))
-    bel_type.append("SB_GB")
-    bel_pos.append((x, y, 2))
-    bel_wires.append(list())
-
-    add_bel_input(bel, wire_names[(x, y, "fabout")], "USER_SIGNAL_TO_GLOBAL_BUFFER")
-    add_bel_output(bel, wire_names[(x, y, "glb_netwk_%d" % g)], "GLOBAL_BUFFER_OUTPUT")
-
-def is_ec_wire(ec_entry):
-    return ec_entry[1] in wire_names
-
-def is_ec_output(ec_entry):
-    wirename = ec_entry[1][2]
-    if "O_" in wirename or "slf_op_" in wirename: return True
-    if "neigh_op_" in wirename: return True
-    if "glb_netwk_" in wirename: return True
-    return False
-
-def is_ec_pll_clock_output(ec, ec_entry):
-    return ec[0] == 'PLL' and ec_entry[0] in ('PLLOUT_A', 'PLLOUT_B')
-
-def add_bel_ec(ec):
-    ectype, x, y, z = ec
-    bel = len(bel_name)
-    extra_cell_config[bel] = []
-    bel_name.append("X%d/Y%d/%s_%d" % (x, y, ectype.lower(), z))
-    bel_type.append(ectype)
-    bel_pos.append((x, y, z))
-    bel_wires.append(list())
-    for entry in extra_cells[ec]:
-        if is_ec_wire(entry) and "glb_netwk_" not in entry[1][2]: # TODO: osc glb output conflicts with GB
-            if is_ec_output(entry):
-                add_bel_output(bel, wire_names[entry[1]], entry[0])
-            else:
-                add_bel_input(bel, wire_names[entry[1]], entry[0])
-        elif is_ec_pll_clock_output(ec, entry):
-            x, y, z = entry[1]
-            z = 'io_{}/D_IN_0'.format(z)
-            add_bel_output(bel, wire_names[(x, y, z)], entry[0])
-        else:
-            extra_cell_config[bel].append(entry)
-
-cell_timings = {}
-tmport_to_constids = {
-    "posedge:clk": "CLK",
-    "ce": "CEN",
-    "sr": "SR",
-    "in0": "I0",
-    "in1": "I1",
-    "in2": "I2",
-    "in3": "I3",
-    "carryin": "CIN",
-    "carryout": "COUT",
-    "lcout": "O",
-    "ltout": "LO",
-    "posedge:RCLK": "RCLK",
-    "posedge:WCLK": "WCLK",
-    "RCLKE": "RCLKE",
-    "RE": "RE",
-    "WCLKE": "WCLKE",
-    "WE": "WE",
-    "posedge:CLOCK": "CLOCK",
-    "posedge:SLEEP": "SLEEP",
-    "USERSIGNALTOGLOBALBUFFER": "USER_SIGNAL_TO_GLOBAL_BUFFER",
-    "GLOBALBUFFEROUTPUT": "GLOBAL_BUFFER_OUTPUT"
-}
-
-for i in range(16):
-    tmport_to_constids["RDATA[%d]" % i] = "RDATA_%d" % i
-    tmport_to_constids["WDATA[%d]" % i] = "WDATA_%d" % i
-    tmport_to_constids["MASK[%d]" % i] = "MASK_%d" % i
-    tmport_to_constids["DATAOUT[%d]" % i] = "DATAOUT_%d" % i
-
-for i in range(11):
-    tmport_to_constids["RADDR[%d]" % i] = "RADDR_%d" % i
-    tmport_to_constids["WADDR[%d]" % i] = "WADDR_%d" % i
-
-def add_cell_timingdata(bel_type, timing_cell, fast_db, slow_db):
-    timing_entries = []
-    database = slow_db if slow_db is not None else fast_db
-    for key in database.keys():
-        skey = key.split(".")
-        if skey[0] == timing_cell:
-            if skey[1] in tmport_to_constids and skey[2] in tmport_to_constids:
-                iport = tmport_to_constids[skey[1]]
-                oport = tmport_to_constids[skey[2]]
-                fastdel = fast_db[key] if fast_db is not None else 0
-                slowdel = slow_db[key] if slow_db is not None else 0
-                timing_entries.append((iport, oport, fastdel, slowdel))
-    cell_timings[bel_type] = timing_entries
-
-add_cell_timingdata("ICESTORM_LC", "LogicCell40", fast_timings, slow_timings)
-add_cell_timingdata("SB_GB", "ICE_GB", fast_timings, slow_timings)
-
-if dev_name != "384":
-    add_cell_timingdata("ICESTORM_RAM", "SB_RAM40_4K", fast_timings, slow_timings)
-if dev_name == "5k":
-    add_cell_timingdata("SPRAM", "SB_SPRAM256KA", fast_timings, slow_timings)
-
-
-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)
-
-    if tile_type == "io":
-        for i in range(2):
-            add_bel_io(tile_xy[0], tile_xy[1], i)
-
-        if dev_name == "1k":
-            add_bel_gb(tile_xy,  7,  0, 0)
-            add_bel_gb(tile_xy,  7, 17, 1)
-            add_bel_gb(tile_xy, 13,  9, 2)
-            add_bel_gb(tile_xy,  0,  9, 3)
-            add_bel_gb(tile_xy,  6, 17, 4)
-            add_bel_gb(tile_xy,  6,  0, 5)
-            add_bel_gb(tile_xy,  0,  8, 6)
-            add_bel_gb(tile_xy, 13,  8, 7)
-        elif dev_name == "5k":
-            add_bel_gb(tile_xy, 13,  0, 0)
-            add_bel_gb(tile_xy, 13, 31, 1)
-            add_bel_gb(tile_xy, 19, 31, 2)
-            add_bel_gb(tile_xy,  6, 31, 3)
-            add_bel_gb(tile_xy, 12, 31, 4)
-            add_bel_gb(tile_xy, 12,  0, 5)
-            add_bel_gb(tile_xy,  6,  0, 6)
-            add_bel_gb(tile_xy, 19,  0, 7)
-        elif dev_name == "8k":
-            add_bel_gb(tile_xy, 33, 16,  7)
-            add_bel_gb(tile_xy,  0, 16,  6)
-            add_bel_gb(tile_xy, 17, 33,  1)
-            add_bel_gb(tile_xy, 17,  0,  0)
-            add_bel_gb(tile_xy,  0, 17,  3)
-            add_bel_gb(tile_xy, 33, 17,  2)
-            add_bel_gb(tile_xy, 16,  0,  5)
-            add_bel_gb(tile_xy, 16, 33,  4)
-        elif dev_name == "384":
-            add_bel_gb(tile_xy,  7,  4,  7)
-            add_bel_gb(tile_xy,  0,  4,  6)
-            add_bel_gb(tile_xy,  4,  9,  1)
-            add_bel_gb(tile_xy,  4,  0,  0)
-            add_bel_gb(tile_xy,  0,  5,  3)
-            add_bel_gb(tile_xy,  7,  5,  2)
-            add_bel_gb(tile_xy,  3,  0,  5)
-            add_bel_gb(tile_xy,  3,  9,  4)
-
-    if tile_type == "ramb":
-        add_bel_ram(tile_xy[0], tile_xy[1])
-
-    for ec in sorted(extra_cells.keys()):
-        if ec[1] == tile_xy[0] and ec[2] == tile_xy[1]:
-            add_bel_ec(ec)
-
-for ec in sorted(extra_cells.keys()):
-    if ec[1] in (0, dev_width - 1) and ec[2] in (0, dev_height - 1):
-        add_bel_ec(ec)
-
-class BinaryBlobAssembler:
-    def l(self, name, ltype = None, export = False):
-        if ltype is None:
-            print("label %s" % (name,))
-        else:
-            print("label %s %s" % (name, ltype))
-
-    def r(self, name, comment):
-        if comment is None:
-            print("ref %s" % (name,))
-        else:
-            print("ref %s %s" % (name, comment))
-
-    def s(self, s, comment):
-        assert "|" not in s
-        print("str |%s| %s" % (s, comment))
-
-    def u8(self, v, comment):
-        if comment is None:
-            print("u8 %d" % (v,))
-        else:
-            print("u8 %d %s" % (v, comment))
-
-    def u16(self, v, comment):
-        if comment is None:
-            print("u16 %d" % (v,))
-        else:
-            print("u16 %d %s" % (v, comment))
-
-    def u32(self, v, comment):
-        if comment is None:
-            print("u32 %d" % (v,))
-        else:
-            print("u32 %d %s" % (v, comment))
-
-    def pre(self, s):
-        print("pre %s" % s)
-
-    def post(self, s):
-        print("post %s" % s)
-
-    def push(self, name):
-        print("push %s" % name)
-
-    def pop(self):
-        print("pop")
-
-bba = BinaryBlobAssembler()
-bba.pre('#include "nextpnr.h"')
-bba.pre('NEXTPNR_NAMESPACE_BEGIN')
-bba.post('NEXTPNR_NAMESPACE_END')
-bba.push("chipdb_blob_%s" % dev_name)
-bba.r("chip_info_%s" % dev_name, "chip_info")
-
-for bel in range(len(bel_name)):
-    bba.l("bel_wires_%d" % bel, "BelWirePOD")
-    for data in sorted(bel_wires[bel]):
-        bba.u32(data[0], "port")
-        bba.u32(data[1], "type")
-        bba.u32(data[2], "wire_index")
-
-bba.l("bel_data_%s" % dev_name, "BelInfoPOD")
-for bel in range(len(bel_name)):
-    bba.s(bel_name[bel], "name")
-    bba.u32(constids[bel_type[bel]], "type")
-    bba.u32(len(bel_wires[bel]), "num_bel_wires")
-    bba.r("bel_wires_%d" % bel, "bel_wires")
-    bba.u8(bel_pos[bel][0], "x")
-    bba.u8(bel_pos[bel][1], "y")
-    bba.u8(bel_pos[bel][2], "z")
-    bba.u8(0, "padding")
-
-wireinfo = list()
-pipinfo = list()
-pipcache = dict()
-
-for wire in range(num_wires):
-    if wire in wire_uphill:
-        pips = list()
-        for src in wire_uphill[wire]:
-            if (src, wire) not in pipcache:
-                pipcache[(src, wire)] = len(pipinfo)
-                pi = dict()
-                pi["src"] = src
-                pi["dst"] = wire
-                pi["fast_delay"] = pipdelay(src, wire, fast_timings)
-                pi["slow_delay"] = pipdelay(src, wire, slow_timings)
-                pi["x"] = pip_xy[(src, wire)][0]
-                pi["y"] = pip_xy[(src, wire)][1]
-                pi["switch_mask"] = pip_xy[(src, wire)][2]
-                pi["switch_index"] = pip_xy[(src, wire)][3]
-                pi["flags"] = pip_xy[(src, wire)][4]
-                pipinfo.append(pi)
-            pips.append(pipcache[(src, wire)])
-        num_uphill = len(pips)
-        list_uphill = "wire%d_uppips" % wire
-        bba.l(list_uphill, "int32_t")
-        for p in pips:
-            bba.u32(p, None)
-    else:
-        num_uphill = 0
-        list_uphill = None
-
-    if wire in wire_downhill:
-        pips = list()
-        for dst in wire_downhill[wire]:
-            if (wire, dst) not in pipcache:
-                pipcache[(wire, dst)] = len(pipinfo)
-                pi = dict()
-                pi["src"] = wire
-                pi["dst"] = dst
-                pi["fast_delay"] = pipdelay(wire, dst, fast_timings)
-                pi["slow_delay"] = pipdelay(wire, dst, slow_timings)
-                pi["x"] = pip_xy[(wire, dst)][0]
-                pi["y"] = pip_xy[(wire, dst)][1]
-                pi["switch_mask"] = pip_xy[(wire, dst)][2]
-                pi["switch_index"] = pip_xy[(wire, dst)][3]
-                pi["flags"] = pip_xy[(wire, dst)][4]
-                pipinfo.append(pi)
-            pips.append(pipcache[(wire, dst)])
-        num_downhill = len(pips)
-        list_downhill = "wire%d_downpips" % wire
-        bba.l(list_downhill, "int32_t")
-        for p in pips:
-            bba.u32(p, None)
-    else:
-        num_downhill = 0
-        list_downhill = None
-
-    if wire in wire_belports:
-        num_bel_pins = len(wire_belports[wire])
-        bba.l("wire%d_bels" % wire, "BelPortPOD")
-        for belport in sorted(wire_belports[wire]):
-            bba.u32(belport[0], "bel_index")
-            bba.u32(constids[belport[1]], "port")
-    else:
-        num_bel_pins = 0
-
-    info = dict()
-    info["name"] = "X%d/Y%d/%s" % wire_names_r[wire]
-
-    info["num_uphill"] = num_uphill
-    info["list_uphill"] = list_uphill
-
-    info["num_downhill"] = num_downhill
-    info["list_downhill"] = list_downhill
-
-    info["num_bel_pins"] = num_bel_pins
-    info["list_bel_pins"] = ("wire%d_bels" % wire) if num_bel_pins > 0 else None
-
-    if wire in wire_xy:
-        avg_x, avg_y = 0, 0
-
-        for x, y in wire_xy[wire]:
-            avg_x += x
-            avg_y += y
-        avg_x /= len(wire_xy[wire])
-        avg_y /= len(wire_xy[wire])
-
-        info["x"] = int(round(avg_x))
-        info["y"] = int(round(avg_y))
-    else:
-        info["x"] = wire_names_r[wire][0]
-        info["y"] = wire_names_r[wire][1]
-
-    wireinfo.append(info)
-
-packageinfo = []
-
-for package in packages:
-    name, pins = package
-    safename = re.sub("[^A-Za-z0-9]", "_", name)
-    pins_info = []
-    for pin in pins:
-        pinname, x, y, z = pin
-        pin_bel = "X%d/Y%d/io%d" % (x, y, z)
-        bel_idx = bel_name.index(pin_bel)
-        pins_info.append((pinname, bel_idx))
-    bba.l("package_%s_pins" % safename, "PackagePinPOD")
-    for pi in pins_info:
-        bba.s(pi[0], "name")
-        bba.u32(pi[1], "bel_index")
-    packageinfo.append((name, len(pins_info), "package_%s_pins" % safename))
-
-tilegrid = []
-for y in range(dev_height):
-    for x in range(dev_width):
-        if (x, y) in tiles:
-            tilegrid.append(tiles[x, y].upper())
-        else:
-            tilegrid.append("NONE")
-
-tileinfo = []
-for t in range(num_tile_types):
-    centries_info = []
-    for cb in tile_bits[t]:
-        name, bits = cb
-        safename = re.sub("[^A-Za-z0-9]", "_", name)
-        bba.l("tile%d_%s_bits" % (t, safename), "ConfigBitPOD")
-        for row, col in bits:
-            bba.u8(row, "row")
-            bba.u8(col, "col")
-        if len(bits) == 0:
-            bba.u32(0, "padding")
-        elif len(bits) % 2 == 1:
-            bba.u16(0, "padding")
-        centries_info.append((name, len(bits), t, safename))
-    bba.l("tile%d_config" % t, "ConfigEntryPOD")
-    for name, num_bits, t, safename in centries_info:
-        bba.s(name, "name")
-        bba.u32(num_bits, "num_bits")
-        bba.r("tile%d_%s_bits" % (t, safename), "num_bits")
-    if len(centries_info) == 0:
-        bba.u32(0, "padding")
-    ti = dict()
-    ti["cols"] = tile_sizes[t][0]
-    ti["rows"] = tile_sizes[t][1]
-    ti["num_entries"] = len(centries_info)
-    ti["entries"] = "tile%d_config" % t
-    tileinfo.append(ti)
-
-bba.l("wire_data_%s" % dev_name, "WireInfoPOD")
-for wire, info in enumerate(wireinfo):
-    bba.s(info["name"], "name")
-    bba.u32(info["num_uphill"], "num_uphill")
-    bba.u32(info["num_downhill"], "num_downhill")
-    bba.r(info["list_uphill"], "pips_uphill")
-    bba.r(info["list_downhill"], "pips_downhill")
-    bba.u32(info["num_bel_pins"], "num_bel_pins")
-    bba.r(info["list_bel_pins"], "bel_pins")
-    bba.u32(len(wire_segments[wire]), "num_segments")
-    if len(wire_segments[wire]):
-        bba.r("wire_segments_%d" % wire, "segments")
-    else:
-        bba.u32(0, "segments")
-
-    bba.u32(wiredelay(wire, fast_timings), "fast_delay")
-    bba.u32(wiredelay(wire, slow_timings), "slow_delay")
-
-    bba.u8(info["x"], "x")
-    bba.u8(info["y"], "y")
-    bba.u8(0, "z") # FIXME
-    bba.u8(wiretypes[wire_type(info["name"])], "type")
-
-for wire in range(num_wires):
-    if len(wire_segments[wire]):
-        bba.l("wire_segments_%d" % wire, "WireSegmentPOD")
-        for xy, seg in sorted(wire_segments[wire].items()):
-            bba.u8(xy[0], "x")
-            bba.u8(xy[1], "y")
-            bba.u16(gfx_wire_ids["TILE_WIRE_" + seg.upper().replace("/", "_")], "index")
-
-bba.l("pip_data_%s" % dev_name, "PipInfoPOD")
-for info in pipinfo:
-    src_seg = -1
-    src_segname = wire_names_r[info["src"]]
-    if (info["x"], info["y"]) in wire_segments[info["src"]]:
-        src_segname = wire_segments[info["src"]][(info["x"], info["y"])]
-        src_seg = gfx_wire_ids["TILE_WIRE_" + src_segname.upper().replace("/", "_")]
-        src_segname = src_segname.replace("/", ".")
-
-    dst_seg = -1
-    dst_segname = wire_names_r[info["dst"]]
-    if (info["x"], info["y"]) in wire_segments[info["dst"]]:
-        dst_segname = wire_segments[info["dst"]][(info["x"], info["y"])]
-        dst_seg = gfx_wire_ids["TILE_WIRE_" + dst_segname.upper().replace("/", "_")]
-        dst_segname = dst_segname.replace("/", ".")
-
-    # bba.s("X%d/Y%d/%s->%s" % (info["x"], info["y"], src_segname, dst_segname), "name")
-    bba.u32(info["src"], "src")
-    bba.u32(info["dst"], "dst")
-    bba.u32(info["fast_delay"], "fast_delay")
-    bba.u32(info["slow_delay"], "slow_delay")
-    bba.u8(info["x"], "x")
-    bba.u8(info["y"], "y")
-    bba.u16(src_seg, "src_seg")
-    bba.u16(dst_seg, "dst_seg")
-    bba.u16(info["switch_mask"], "switch_mask")
-    bba.u32(info["switch_index"], "switch_index")
-    bba.u32(info["flags"], "flags")
-
-switchinfo = []
-for switch in switches:
-    x, y, bits, bel = switch
-    bitlist = []
-    for b in bits:
-        m = cbit_re.match(b)
-        assert m
-        bitlist.append((int(m.group(1)), int(m.group(2))))
-    si = dict()
-    si["x"] = x
-    si["y"] = y
-    si["bits"] = bitlist
-    si["bel"] = bel
-    switchinfo.append(si)
-
-bba.l("switch_data_%s" % dev_name, "SwitchInfoPOD")
-for info in switchinfo:
-    bba.u32(len(info["bits"]), "num_bits")
-    bba.u32(info["bel"], "bel")
-    bba.u8(info["x"], "x")
-    bba.u8(info["y"], "y")
-    for i in range(5):
-        if i < len(info["bits"]):
-            bba.u8(info["bits"][i][0], "row<%d>" % i)
-            bba.u8(info["bits"][i][1], "col<%d>" % i)
-        else:
-            bba.u8(0, "row<%d> (unused)" % i)
-            bba.u8(0, "col<%d> (unused)" % i)
-
-bba.l("tile_data_%s" % dev_name, "TileInfoPOD")
-for info in tileinfo:
-    bba.u8(info["cols"], "cols")
-    bba.u8(info["rows"], "rows")
-    bba.u16(info["num_entries"], "num_entries")
-    bba.r(info["entries"], "entries")
-
-bba.l("ieren_data_%s" % dev_name, "IerenInfoPOD")
-for ieren in ierens:
-    bba.u8(ieren[0], "iox")
-    bba.u8(ieren[1], "ioy")
-    bba.u8(ieren[2], "ioz")
-    bba.u8(ieren[3], "ierx")
-    bba.u8(ieren[4], "iery")
-    bba.u8(ieren[5], "ierz")
-
-if len(ierens) % 2 == 1:
-    bba.u16(0, "padding")
-
-bba.l("bits_info_%s" % dev_name, "BitstreamInfoPOD")
-bba.u32(len(switchinfo), "num_switches")
-bba.u32(len(ierens), "num_ierens")
-bba.r("tile_data_%s" % dev_name, "tiles_nonrouting")
-bba.r("switch_data_%s" % dev_name, "switches")
-bba.r("ieren_data_%s" % dev_name, "ierens")
-
-bba.l("tile_grid_%s" % dev_name, "TileType")
-for t in tilegrid:
-    bba.u32(tiletypes[t], "tiletype")
-
-for bel_idx, entries in sorted(extra_cell_config.items()):
-    if len(entries) > 0:
-        bba.l("bel%d_config_entries" % bel_idx, "BelConfigEntryPOD")
-        for entry in entries:
-            bba.s(entry[0], "entry_name")
-            bba.s(entry[1][2], "cbit_name")
-            bba.u8(entry[1][0], "x")
-            bba.u8(entry[1][1], "y")
-            bba.u16(0, "padding")
-
-if len(extra_cell_config) > 0:
-    bba.l("bel_config_%s" % dev_name, "BelConfigPOD")
-    for bel_idx, entries in sorted(extra_cell_config.items()):
-        bba.u32(bel_idx, "bel_index")
-        bba.u32(len(entries), "num_entries")
-        bba.r("bel%d_config_entries" % bel_idx if len(entries) > 0 else None, "entries")
-
-bba.l("package_info_%s" % dev_name, "PackageInfoPOD")
-for info in packageinfo:
-    bba.s(info[0], "name")
-    bba.u32(info[1], "num_pins")
-    bba.r(info[2], "pins")
-
-for cell, timings in sorted(cell_timings.items()):
-    beltype = constids[cell]
-    bba.l("cell_paths_%d" % beltype, "CellPathDelayPOD")
-    for entry in timings:
-        fromport, toport, fast, slow = entry
-        bba.u32(constids[fromport], "from_port")
-        bba.u32(constids[toport], "to_port")
-        bba.u32(fast, "fast_delay")
-        bba.u32(slow, "slow_delay")
-
-bba.l("cell_timings_%s" % dev_name, "CellTimingPOD")
-for cell, timings in sorted(cell_timings.items()):
-    beltype = constids[cell]
-    bba.u32(beltype, "type")
-    bba.u32(len(timings), "num_paths")
-    bba.r("cell_paths_%d" % beltype, "path_delays")
-
-bba.l("chip_info_%s" % dev_name)
-bba.u32(dev_width, "dev_width")
-bba.u32(dev_height, "dev_height")
-bba.u32(len(bel_name), "num_bels")
-bba.u32(num_wires, "num_wires")
-bba.u32(len(pipinfo), "num_pips")
-bba.u32(len(switchinfo), "num_switches")
-bba.u32(len(extra_cell_config), "num_belcfgs")
-bba.u32(len(packageinfo), "num_packages")
-bba.u32(len(cell_timings), "num_timing_cells")
-bba.r("bel_data_%s" % dev_name, "bel_data")
-bba.r("wire_data_%s" % dev_name, "wire_data")
-bba.r("pip_data_%s" % dev_name, "pip_data")
-bba.r("tile_grid_%s" % dev_name, "tile_grid")
-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.pop()
