diff options
Diffstat (limited to 'ice40')
-rw-r--r-- | ice40/chip.cc | 752 | ||||
-rw-r--r-- | ice40/chip.h | 879 | ||||
-rw-r--r-- | ice40/family.cmake | 10 | ||||
-rw-r--r-- | ice40/main.cc | 424 | ||||
-rw-r--r-- | ice40/pybindings.cc | 10 |
5 files changed, 1066 insertions, 1009 deletions
diff --git a/ice40/chip.cc b/ice40/chip.cc index d1226b3a..4ba7697d 100644 --- a/ice40/chip.cc +++ b/ice40/chip.cc @@ -23,460 +23,470 @@ IdString belTypeToId(BelType type) { - if (type == TYPE_ICESTORM_LC) - return "ICESTORM_LC"; - if (type == TYPE_ICESTORM_RAM) - return "ICESTORM_RAM"; - if (type == TYPE_SB_IO) - return "SB_IO"; - return IdString(); + if (type == TYPE_ICESTORM_LC) + return "ICESTORM_LC"; + if (type == TYPE_ICESTORM_RAM) + return "ICESTORM_RAM"; + if (type == TYPE_SB_IO) + return "SB_IO"; + return IdString(); } BelType belTypeFromId(IdString id) { - if (id == "ICESTORM_LC") - return TYPE_ICESTORM_LC; - if (id == "ICESTORM_RAM") - return TYPE_ICESTORM_RAM; - if (id == "SB_IO") - return TYPE_SB_IO; - return TYPE_NIL; + if (id == "ICESTORM_LC") + return TYPE_ICESTORM_LC; + if (id == "ICESTORM_RAM") + return TYPE_ICESTORM_RAM; + if (id == "SB_IO") + return TYPE_SB_IO; + return TYPE_NIL; } // ----------------------------------------------------------------------- IdString PortPinToId(PortPin type) { -#define X(t) if (type == PIN_##t) return #t; - - X(IN_0) - X(IN_1) - X(IN_2) - X(IN_3) - X(O) - X(LO) - X(CIN) - X(COUT) - X(CEN) - X(CLK) - X(SR) - - X(MASK_0) - X(MASK_1) - X(MASK_2) - X(MASK_3) - X(MASK_4) - X(MASK_5) - X(MASK_6) - X(MASK_7) - X(MASK_8) - X(MASK_9) - X(MASK_10) - X(MASK_11) - X(MASK_12) - X(MASK_13) - X(MASK_14) - X(MASK_15) - - X(RDATA_0) - X(RDATA_1) - X(RDATA_2) - X(RDATA_3) - X(RDATA_4) - X(RDATA_5) - X(RDATA_6) - X(RDATA_7) - X(RDATA_8) - X(RDATA_9) - X(RDATA_10) - X(RDATA_11) - X(RDATA_12) - X(RDATA_13) - X(RDATA_14) - X(RDATA_15) - - X(WDATA_0) - X(WDATA_1) - X(WDATA_2) - X(WDATA_3) - X(WDATA_4) - X(WDATA_5) - X(WDATA_6) - X(WDATA_7) - X(WDATA_8) - X(WDATA_9) - X(WDATA_10) - X(WDATA_11) - X(WDATA_12) - X(WDATA_13) - X(WDATA_14) - X(WDATA_15) - - X(WADDR_0) - X(WADDR_1) - X(WADDR_2) - X(WADDR_3) - X(WADDR_4) - X(WADDR_5) - X(WADDR_6) - X(WADDR_7) - X(WADDR_8) - X(WADDR_9) - X(WADDR_10) - - X(RADDR_0) - X(RADDR_1) - X(RADDR_2) - X(RADDR_3) - X(RADDR_4) - X(RADDR_5) - X(RADDR_6) - X(RADDR_7) - X(RADDR_8) - X(RADDR_9) - X(RADDR_10) - - X(WCLK) - X(WCLKE) - X(WE) - - X(RCLK) - X(RCLKE) - X(RE) - - X(PACKAGE_PIN) - X(LATCH_INPUT_VALUE) - X(CLOCK_ENABLE) - X(INPUT_CLK) - X(OUTPUT_CLK) - X(OUTPUT_ENABLE) - X(D_OUT_0) - X(D_OUT_1) - X(D_IN_0) - X(D_IN_1) +#define X(t) \ + if (type == PIN_##t) \ + return #t; + + X(IN_0) + X(IN_1) + X(IN_2) + X(IN_3) + X(O) + X(LO) + X(CIN) + X(COUT) + X(CEN) + X(CLK) + X(SR) + + X(MASK_0) + X(MASK_1) + X(MASK_2) + X(MASK_3) + X(MASK_4) + X(MASK_5) + X(MASK_6) + X(MASK_7) + X(MASK_8) + X(MASK_9) + X(MASK_10) + X(MASK_11) + X(MASK_12) + X(MASK_13) + X(MASK_14) + X(MASK_15) + + X(RDATA_0) + X(RDATA_1) + X(RDATA_2) + X(RDATA_3) + X(RDATA_4) + X(RDATA_5) + X(RDATA_6) + X(RDATA_7) + X(RDATA_8) + X(RDATA_9) + X(RDATA_10) + X(RDATA_11) + X(RDATA_12) + X(RDATA_13) + X(RDATA_14) + X(RDATA_15) + + X(WDATA_0) + X(WDATA_1) + X(WDATA_2) + X(WDATA_3) + X(WDATA_4) + X(WDATA_5) + X(WDATA_6) + X(WDATA_7) + X(WDATA_8) + X(WDATA_9) + X(WDATA_10) + X(WDATA_11) + X(WDATA_12) + X(WDATA_13) + X(WDATA_14) + X(WDATA_15) + + X(WADDR_0) + X(WADDR_1) + X(WADDR_2) + X(WADDR_3) + X(WADDR_4) + X(WADDR_5) + X(WADDR_6) + X(WADDR_7) + X(WADDR_8) + X(WADDR_9) + X(WADDR_10) + + X(RADDR_0) + X(RADDR_1) + X(RADDR_2) + X(RADDR_3) + X(RADDR_4) + X(RADDR_5) + X(RADDR_6) + X(RADDR_7) + X(RADDR_8) + X(RADDR_9) + X(RADDR_10) + + X(WCLK) + X(WCLKE) + X(WE) + + X(RCLK) + X(RCLKE) + X(RE) + + X(PACKAGE_PIN) + X(LATCH_INPUT_VALUE) + X(CLOCK_ENABLE) + X(INPUT_CLK) + X(OUTPUT_CLK) + X(OUTPUT_ENABLE) + X(D_OUT_0) + X(D_OUT_1) + X(D_IN_0) + X(D_IN_1) #undef X - return IdString(); + return IdString(); } PortPin PortPinFromId(IdString id) { -#define X(t) if (id == #t) return PIN_##t; - - X(IN_0) - X(IN_1) - X(IN_2) - X(IN_3) - X(O) - X(LO) - X(CIN) - X(COUT) - X(CEN) - X(CLK) - X(SR) - - X(MASK_0) - X(MASK_1) - X(MASK_2) - X(MASK_3) - X(MASK_4) - X(MASK_5) - X(MASK_6) - X(MASK_7) - X(MASK_8) - X(MASK_9) - X(MASK_10) - X(MASK_11) - X(MASK_12) - X(MASK_13) - X(MASK_14) - X(MASK_15) - - X(RDATA_0) - X(RDATA_1) - X(RDATA_2) - X(RDATA_3) - X(RDATA_4) - X(RDATA_5) - X(RDATA_6) - X(RDATA_7) - X(RDATA_8) - X(RDATA_9) - X(RDATA_10) - X(RDATA_11) - X(RDATA_12) - X(RDATA_13) - X(RDATA_14) - X(RDATA_15) - - X(WDATA_0) - X(WDATA_1) - X(WDATA_2) - X(WDATA_3) - X(WDATA_4) - X(WDATA_5) - X(WDATA_6) - X(WDATA_7) - X(WDATA_8) - X(WDATA_9) - X(WDATA_10) - X(WDATA_11) - X(WDATA_12) - X(WDATA_13) - X(WDATA_14) - X(WDATA_15) - - X(WADDR_0) - X(WADDR_1) - X(WADDR_2) - X(WADDR_3) - X(WADDR_4) - X(WADDR_5) - X(WADDR_6) - X(WADDR_7) - X(WADDR_8) - X(WADDR_9) - X(WADDR_10) - - X(RADDR_0) - X(RADDR_1) - X(RADDR_2) - X(RADDR_3) - X(RADDR_4) - X(RADDR_5) - X(RADDR_6) - X(RADDR_7) - X(RADDR_8) - X(RADDR_9) - X(RADDR_10) - - X(WCLK) - X(WCLKE) - X(WE) - - X(RCLK) - X(RCLKE) - X(RE) - - X(PACKAGE_PIN) - X(LATCH_INPUT_VALUE) - X(CLOCK_ENABLE) - X(INPUT_CLK) - X(OUTPUT_CLK) - X(OUTPUT_ENABLE) - X(D_OUT_0) - X(D_OUT_1) - X(D_IN_0) - X(D_IN_1) +#define X(t) \ + if (id == #t) \ + return PIN_##t; + + X(IN_0) + X(IN_1) + X(IN_2) + X(IN_3) + X(O) + X(LO) + X(CIN) + X(COUT) + X(CEN) + X(CLK) + X(SR) + + X(MASK_0) + X(MASK_1) + X(MASK_2) + X(MASK_3) + X(MASK_4) + X(MASK_5) + X(MASK_6) + X(MASK_7) + X(MASK_8) + X(MASK_9) + X(MASK_10) + X(MASK_11) + X(MASK_12) + X(MASK_13) + X(MASK_14) + X(MASK_15) + + X(RDATA_0) + X(RDATA_1) + X(RDATA_2) + X(RDATA_3) + X(RDATA_4) + X(RDATA_5) + X(RDATA_6) + X(RDATA_7) + X(RDATA_8) + X(RDATA_9) + X(RDATA_10) + X(RDATA_11) + X(RDATA_12) + X(RDATA_13) + X(RDATA_14) + X(RDATA_15) + + X(WDATA_0) + X(WDATA_1) + X(WDATA_2) + X(WDATA_3) + X(WDATA_4) + X(WDATA_5) + X(WDATA_6) + X(WDATA_7) + X(WDATA_8) + X(WDATA_9) + X(WDATA_10) + X(WDATA_11) + X(WDATA_12) + X(WDATA_13) + X(WDATA_14) + X(WDATA_15) + + X(WADDR_0) + X(WADDR_1) + X(WADDR_2) + X(WADDR_3) + X(WADDR_4) + X(WADDR_5) + X(WADDR_6) + X(WADDR_7) + X(WADDR_8) + X(WADDR_9) + X(WADDR_10) + + X(RADDR_0) + X(RADDR_1) + X(RADDR_2) + X(RADDR_3) + X(RADDR_4) + X(RADDR_5) + X(RADDR_6) + X(RADDR_7) + X(RADDR_8) + X(RADDR_9) + X(RADDR_10) + + X(WCLK) + X(WCLKE) + X(WE) + + X(RCLK) + X(RCLKE) + X(RE) + + X(PACKAGE_PIN) + X(LATCH_INPUT_VALUE) + X(CLOCK_ENABLE) + X(INPUT_CLK) + X(OUTPUT_CLK) + X(OUTPUT_ENABLE) + X(D_OUT_0) + X(D_OUT_1) + X(D_IN_0) + X(D_IN_1) #undef X - return PIN_NIL; + return PIN_NIL; } // ----------------------------------------------------------------------- Chip::Chip(ChipArgs args) { - if (args.type == ChipArgs::LP384) { - chip_info = chip_info_384; - return; - } else if (args.type == ChipArgs::LP1K || args.type == ChipArgs::HX1K) { - chip_info = chip_info_1k; - return; - } else if (args.type == ChipArgs::UP5K) { - chip_info = chip_info_5k; - return; - } else if (args.type == ChipArgs::LP8K || args.type == ChipArgs::HX8K) { - chip_info = chip_info_8k; - return; - } else { - fprintf(stderr, "Unsupported chip type\n"); - exit(EXIT_FAILURE); - } - - abort(); +#ifdef ICE40_HX1K_ONLY + if (args.type == ChipArgs::HX1K) { + chip_info = chip_info_1k; + return; + } +#else + if (args.type == ChipArgs::LP384) { + chip_info = chip_info_384; + return; + } else if (args.type == ChipArgs::LP1K || args.type == ChipArgs::HX1K) { + chip_info = chip_info_1k; + return; + } else if (args.type == ChipArgs::UP5K) { + chip_info = chip_info_5k; + return; + } else if (args.type == ChipArgs::LP8K || args.type == ChipArgs::HX8K) { + chip_info = chip_info_8k; + return; + } else { + fprintf(stderr, "Unsupported chip type\n"); + exit(EXIT_FAILURE); + } +#endif + + abort(); } // ----------------------------------------------------------------------- BelId Chip::getBelByName(IdString name) const { - BelId ret; + BelId ret; - if (bel_by_name.empty()) { - for (int i = 0; i < chip_info.num_bels; i++) - bel_by_name[chip_info.bel_data[i].name] = i; - } + if (bel_by_name.empty()) { + for (int i = 0; i < chip_info.num_bels; i++) + bel_by_name[chip_info.bel_data[i].name] = i; + } - auto it = bel_by_name.find(name); - if (it != bel_by_name.end()) - ret.index = it->second; + auto it = bel_by_name.find(name); + if (it != bel_by_name.end()) + ret.index = it->second; - return ret; + return ret; } WireId Chip::getWireBelPin(BelId bel, PortPin pin) const { - // FIXME - return WireId(); + // FIXME + return WireId(); } // ----------------------------------------------------------------------- WireId Chip::getWireByName(IdString name) const { - WireId ret; + WireId ret; - if (wire_by_name.empty()) { - for (int i = 0; i < chip_info.num_wires; i++) - wire_by_name[chip_info.wire_data[i].name] = i; - } + if (wire_by_name.empty()) { + for (int i = 0; i < chip_info.num_wires; i++) + wire_by_name[chip_info.wire_data[i].name] = i; + } - auto it = wire_by_name.find(name); - if (it != wire_by_name.end()) - ret.index = it->second; + auto it = wire_by_name.find(name); + if (it != wire_by_name.end()) + ret.index = it->second; - return ret; + return ret; } // ----------------------------------------------------------------------- PipId Chip::getPipByName(IdString name) const { - PipId ret; + PipId ret; - if (pip_by_name.empty()) { - for (int i = 0; i < chip_info.num_pips; i++) { - PipId pip; - pip.index = i; - pip_by_name[getPipName(pip)] = i; - } - } + if (pip_by_name.empty()) { + for (int i = 0; i < chip_info.num_pips; i++) { + PipId pip; + pip.index = i; + pip_by_name[getPipName(pip)] = i; + } + } - auto it = pip_by_name.find(name); - if (it != pip_by_name.end()) - ret.index = it->second; + auto it = pip_by_name.find(name); + if (it != pip_by_name.end()) + ret.index = it->second; - return ret; + return ret; } // ----------------------------------------------------------------------- void Chip::getBelPosition(BelId bel, float &x, float &y) const { - assert(!bel.nil()); - x = chip_info.bel_data[bel.index].x; - y = chip_info.bel_data[bel.index].y; + assert(!bel.nil()); + x = chip_info.bel_data[bel.index].x; + y = chip_info.bel_data[bel.index].y; } void Chip::getWirePosition(WireId wire, float &x, float &y) const { - assert(!wire.nil()); - x = chip_info.wire_data[wire.index].x; - y = chip_info.wire_data[wire.index].y; + assert(!wire.nil()); + x = chip_info.wire_data[wire.index].x; + y = chip_info.wire_data[wire.index].y; } void Chip::getPipPosition(PipId pip, float &x, float &y) const { - assert(!pip.nil()); - x = chip_info.pip_data[pip.index].x; - y = chip_info.pip_data[pip.index].y; + assert(!pip.nil()); + x = chip_info.pip_data[pip.index].x; + y = chip_info.pip_data[pip.index].y; } vector<GraphicElement> Chip::getBelGraphics(BelId bel) const { - vector<GraphicElement> ret; - - auto bel_type = getBelType(bel); - - if (bel_type == TYPE_ICESTORM_LC) { - GraphicElement el; - el.type = GraphicElement::G_BOX; - el.x1 = chip_info.bel_data[bel.index].x + 0.1; - el.x2 = chip_info.bel_data[bel.index].x + 0.9; - el.y1 = chip_info.bel_data[bel.index].y + 0.10 + (chip_info.bel_data[bel.index].z) * (0.8/8); - el.y2 = chip_info.bel_data[bel.index].y + 0.18 + (chip_info.bel_data[bel.index].z) * (0.8/8); - el.z = 0; - ret.push_back(el); - } - - if (bel_type == TYPE_SB_IO) { - if (chip_info.bel_data[bel.index].x == 0 || chip_info.bel_data[bel.index].x == chip_info.width-1) - { - GraphicElement el; - el.type = GraphicElement::G_BOX; - el.x1 = chip_info.bel_data[bel.index].x + 0.1; - el.x2 = chip_info.bel_data[bel.index].x + 0.9; - if (chip_info.bel_data[bel.index].z == 0) { - el.y1 = chip_info.bel_data[bel.index].y + 0.10; - el.y2 = chip_info.bel_data[bel.index].y + 0.45; - } else { - el.y1 = chip_info.bel_data[bel.index].y + 0.55; - el.y2 = chip_info.bel_data[bel.index].y + 0.90; - } - el.z = 0; - ret.push_back(el); - } - else - { - GraphicElement el; - el.type = GraphicElement::G_BOX; - if (chip_info.bel_data[bel.index].z == 0) { - el.x1 = chip_info.bel_data[bel.index].x + 0.10; - el.x2 = chip_info.bel_data[bel.index].x + 0.45; - } else { - el.x1 = chip_info.bel_data[bel.index].x + 0.55; - el.x2 = chip_info.bel_data[bel.index].x + 0.90; - } - el.y1 = chip_info.bel_data[bel.index].y + 0.1; - el.y2 = chip_info.bel_data[bel.index].y + 0.9; - el.z = 0; - ret.push_back(el); - } - } - - if (bel_type == TYPE_ICESTORM_RAM) { - GraphicElement el; - el.type = GraphicElement::G_BOX; - el.x1 = chip_info.bel_data[bel.index].x + 0.1; - el.x2 = chip_info.bel_data[bel.index].x + 0.9; - el.y1 = chip_info.bel_data[bel.index].y + 0.1; - el.y2 = chip_info.bel_data[bel.index].y + 1.9; - el.z = 0; - ret.push_back(el); - } - - return ret; + vector<GraphicElement> ret; + + auto bel_type = getBelType(bel); + + if (bel_type == TYPE_ICESTORM_LC) { + GraphicElement el; + el.type = GraphicElement::G_BOX; + el.x1 = chip_info.bel_data[bel.index].x + 0.1; + el.x2 = chip_info.bel_data[bel.index].x + 0.9; + el.y1 = chip_info.bel_data[bel.index].y + 0.10 + + (chip_info.bel_data[bel.index].z) * (0.8 / 8); + el.y2 = chip_info.bel_data[bel.index].y + 0.18 + + (chip_info.bel_data[bel.index].z) * (0.8 / 8); + el.z = 0; + ret.push_back(el); + } + + if (bel_type == TYPE_SB_IO) { + if (chip_info.bel_data[bel.index].x == 0 || + chip_info.bel_data[bel.index].x == chip_info.width - 1) { + GraphicElement el; + el.type = GraphicElement::G_BOX; + el.x1 = chip_info.bel_data[bel.index].x + 0.1; + el.x2 = chip_info.bel_data[bel.index].x + 0.9; + if (chip_info.bel_data[bel.index].z == 0) { + el.y1 = chip_info.bel_data[bel.index].y + 0.10; + el.y2 = chip_info.bel_data[bel.index].y + 0.45; + } else { + el.y1 = chip_info.bel_data[bel.index].y + 0.55; + el.y2 = chip_info.bel_data[bel.index].y + 0.90; + } + el.z = 0; + ret.push_back(el); + } else { + GraphicElement el; + el.type = GraphicElement::G_BOX; + if (chip_info.bel_data[bel.index].z == 0) { + el.x1 = chip_info.bel_data[bel.index].x + 0.10; + el.x2 = chip_info.bel_data[bel.index].x + 0.45; + } else { + el.x1 = chip_info.bel_data[bel.index].x + 0.55; + el.x2 = chip_info.bel_data[bel.index].x + 0.90; + } + el.y1 = chip_info.bel_data[bel.index].y + 0.1; + el.y2 = chip_info.bel_data[bel.index].y + 0.9; + el.z = 0; + ret.push_back(el); + } + } + + if (bel_type == TYPE_ICESTORM_RAM) { + GraphicElement el; + el.type = GraphicElement::G_BOX; + el.x1 = chip_info.bel_data[bel.index].x + 0.1; + el.x2 = chip_info.bel_data[bel.index].x + 0.9; + el.y1 = chip_info.bel_data[bel.index].y + 0.1; + el.y2 = chip_info.bel_data[bel.index].y + 1.9; + el.z = 0; + ret.push_back(el); + } + + return ret; } vector<GraphicElement> Chip::getWireGraphics(WireId wire) const { - vector<GraphicElement> ret; - // FIXME - return ret; + vector<GraphicElement> ret; + // FIXME + return ret; } vector<GraphicElement> Chip::getPipGraphics(PipId pip) const { - vector<GraphicElement> ret; - // FIXME - return ret; + vector<GraphicElement> ret; + // FIXME + return ret; } vector<GraphicElement> Chip::getFrameGraphics() const { - vector<GraphicElement> ret; - - for (int x = 0; x <= chip_info.width; x++) - for (int y = 0; y <= chip_info.height; y++) - { - GraphicElement el; - el.type = GraphicElement::G_LINE; - el.x1 = x - 0.05, el.x2 = x + 0.05, el.y1 = y, el.y2 = y, el.z = 0; - ret.push_back(el); - el.x1 = x, el.x2 = x, el.y1 = y - 0.05, el.y2 = y + 0.05, el.z = 0; - ret.push_back(el); - } - - return ret; + vector<GraphicElement> ret; + + for (int x = 0; x <= chip_info.width; x++) + for (int y = 0; y <= chip_info.height; y++) { + GraphicElement el; + el.type = GraphicElement::G_LINE; + el.x1 = x - 0.05, el.x2 = x + 0.05, el.y1 = y, el.y2 = y, el.z = 0; + ret.push_back(el); + el.x1 = x, el.x2 = x, el.y1 = y - 0.05, el.y2 = y + 0.05, el.z = 0; + ret.push_back(el); + } + + return ret; } diff --git a/ice40/chip.h b/ice40/chip.h index 2f0a1284..695eea48 100644 --- a/ice40/chip.h +++ b/ice40/chip.h @@ -24,20 +24,20 @@ struct DelayInfo { - float delay = 0; + float delay = 0; - float raiseDelay() { return delay; } - float fallDelay() { return delay; } + float raiseDelay() { return delay; } + float fallDelay() { return delay; } }; // ----------------------------------------------------------------------- enum BelType { - TYPE_NIL, - TYPE_ICESTORM_LC, - TYPE_ICESTORM_RAM, - TYPE_SB_IO + TYPE_NIL, + TYPE_ICESTORM_LC, + TYPE_ICESTORM_RAM, + TYPE_SB_IO }; IdString belTypeToId(BelType type); @@ -45,113 +45,113 @@ BelType belTypeFromId(IdString id); enum PortPin { - PIN_NIL, - - PIN_IN_0, - PIN_IN_1, - PIN_IN_2, - PIN_IN_3, - PIN_O, - PIN_LO, - PIN_CIN, - PIN_COUT, - PIN_CEN, - PIN_CLK, - PIN_SR, - - PIN_MASK_0, - PIN_MASK_1, - PIN_MASK_2, - PIN_MASK_3, - PIN_MASK_4, - PIN_MASK_5, - PIN_MASK_6, - PIN_MASK_7, - PIN_MASK_8, - PIN_MASK_9, - PIN_MASK_10, - PIN_MASK_11, - PIN_MASK_12, - PIN_MASK_13, - PIN_MASK_14, - PIN_MASK_15, - - PIN_RDATA_0, - PIN_RDATA_1, - PIN_RDATA_2, - PIN_RDATA_3, - PIN_RDATA_4, - PIN_RDATA_5, - PIN_RDATA_6, - PIN_RDATA_7, - PIN_RDATA_8, - PIN_RDATA_9, - PIN_RDATA_10, - PIN_RDATA_11, - PIN_RDATA_12, - PIN_RDATA_13, - PIN_RDATA_14, - PIN_RDATA_15, - - PIN_WDATA_0, - PIN_WDATA_1, - PIN_WDATA_2, - PIN_WDATA_3, - PIN_WDATA_4, - PIN_WDATA_5, - PIN_WDATA_6, - PIN_WDATA_7, - PIN_WDATA_8, - PIN_WDATA_9, - PIN_WDATA_10, - PIN_WDATA_11, - PIN_WDATA_12, - PIN_WDATA_13, - PIN_WDATA_14, - PIN_WDATA_15, - - PIN_WADDR_0, - PIN_WADDR_1, - PIN_WADDR_2, - PIN_WADDR_3, - PIN_WADDR_4, - PIN_WADDR_5, - PIN_WADDR_6, - PIN_WADDR_7, - PIN_WADDR_8, - PIN_WADDR_9, - PIN_WADDR_10, - - PIN_RADDR_0, - PIN_RADDR_1, - PIN_RADDR_2, - PIN_RADDR_3, - PIN_RADDR_4, - PIN_RADDR_5, - PIN_RADDR_6, - PIN_RADDR_7, - PIN_RADDR_8, - PIN_RADDR_9, - PIN_RADDR_10, - - PIN_WCLK, - PIN_WCLKE, - PIN_WE, - - PIN_RCLK, - PIN_RCLKE, - PIN_RE, - - PIN_PACKAGE_PIN, - PIN_LATCH_INPUT_VALUE, - PIN_CLOCK_ENABLE, - PIN_INPUT_CLK, - PIN_OUTPUT_CLK, - PIN_OUTPUT_ENABLE, - PIN_D_OUT_0, - PIN_D_OUT_1, - PIN_D_IN_0, - PIN_D_IN_1 + PIN_NIL, + + PIN_IN_0, + PIN_IN_1, + PIN_IN_2, + PIN_IN_3, + PIN_O, + PIN_LO, + PIN_CIN, + PIN_COUT, + PIN_CEN, + PIN_CLK, + PIN_SR, + + PIN_MASK_0, + PIN_MASK_1, + PIN_MASK_2, + PIN_MASK_3, + PIN_MASK_4, + PIN_MASK_5, + PIN_MASK_6, + PIN_MASK_7, + PIN_MASK_8, + PIN_MASK_9, + PIN_MASK_10, + PIN_MASK_11, + PIN_MASK_12, + PIN_MASK_13, + PIN_MASK_14, + PIN_MASK_15, + + PIN_RDATA_0, + PIN_RDATA_1, + PIN_RDATA_2, + PIN_RDATA_3, + PIN_RDATA_4, + PIN_RDATA_5, + PIN_RDATA_6, + PIN_RDATA_7, + PIN_RDATA_8, + PIN_RDATA_9, + PIN_RDATA_10, + PIN_RDATA_11, + PIN_RDATA_12, + PIN_RDATA_13, + PIN_RDATA_14, + PIN_RDATA_15, + + PIN_WDATA_0, + PIN_WDATA_1, + PIN_WDATA_2, + PIN_WDATA_3, + PIN_WDATA_4, + PIN_WDATA_5, + PIN_WDATA_6, + PIN_WDATA_7, + PIN_WDATA_8, + PIN_WDATA_9, + PIN_WDATA_10, + PIN_WDATA_11, + PIN_WDATA_12, + PIN_WDATA_13, + PIN_WDATA_14, + PIN_WDATA_15, + + PIN_WADDR_0, + PIN_WADDR_1, + PIN_WADDR_2, + PIN_WADDR_3, + PIN_WADDR_4, + PIN_WADDR_5, + PIN_WADDR_6, + PIN_WADDR_7, + PIN_WADDR_8, + PIN_WADDR_9, + PIN_WADDR_10, + + PIN_RADDR_0, + PIN_RADDR_1, + PIN_RADDR_2, + PIN_RADDR_3, + PIN_RADDR_4, + PIN_RADDR_5, + PIN_RADDR_6, + PIN_RADDR_7, + PIN_RADDR_8, + PIN_RADDR_9, + PIN_RADDR_10, + + PIN_WCLK, + PIN_WCLKE, + PIN_WE, + + PIN_RCLK, + PIN_RCLKE, + PIN_RE, + + PIN_PACKAGE_PIN, + PIN_LATCH_INPUT_VALUE, + PIN_CLOCK_ENABLE, + PIN_INPUT_CLK, + PIN_OUTPUT_CLK, + PIN_OUTPUT_ENABLE, + PIN_D_OUT_0, + PIN_D_OUT_1, + PIN_D_IN_0, + PIN_D_IN_1 }; IdString PortPinToId(PortPin type); @@ -159,47 +159,46 @@ PortPin PortPinFromId(IdString id); // ----------------------------------------------------------------------- - struct BelInfoPOD { - const char *name; - BelType type; - int8_t x, y, z; + const char *name; + BelType type; + int8_t x, y, z; }; struct BelPortPOD { - int32_t bel_index; - PortPin port; + int32_t bel_index; + PortPin port; }; struct PipInfoPOD { - int32_t src, dst; - float delay; - int8_t x, y; + int32_t src, dst; + float delay; + int8_t x, y; }; struct WireInfoPOD { - const char *name; - int num_uphill, num_downhill; - int *pips_uphill, *pips_downhill; + const char *name; + int num_uphill, num_downhill; + int *pips_uphill, *pips_downhill; - int num_bels_downhill; - BelPortPOD bel_uphill; - BelPortPOD *bels_downhill; + int num_bels_downhill; + BelPortPOD bel_uphill; + BelPortPOD *bels_downhill; - float x, y; + float x, y; }; struct ChipInfoPOD { - int width, height; - int num_bels, num_wires, num_pips; - BelInfoPOD *bel_data; - WireInfoPOD *wire_data; - PipInfoPOD *pip_data; + int width, height; + int num_bels, num_wires, num_pips; + BelInfoPOD *bel_data; + WireInfoPOD *wire_data; + PipInfoPOD *pip_data; }; extern ChipInfoPOD chip_info_384; @@ -211,248 +210,256 @@ extern ChipInfoPOD chip_info_8k; struct BelId { - int32_t index = -1; + int32_t index = -1; - bool nil() const { - return index < 0; - } + bool nil() const { return index < 0; } - bool operator==(const BelId &other) const { return index == other.index; } - bool operator!=(const BelId &other) const { return index != other.index; } + bool operator==(const BelId &other) const { return index == other.index; } + bool operator!=(const BelId &other) const { return index != other.index; } }; struct WireId { - int32_t index = -1; + int32_t index = -1; - bool nil() const { - return index < 0; - } + bool nil() const { return index < 0; } - bool operator==(const WireId &other) const { return index == other.index; } - bool operator!=(const WireId &other) const { return index != other.index; } + bool operator==(const WireId &other) const { return index == other.index; } + bool operator!=(const WireId &other) const { return index != other.index; } }; struct PipId { - int32_t index = -1; + int32_t index = -1; - bool nil() const { - return index < 0; - } + bool nil() const { return index < 0; } - bool operator==(const PipId &other) const { return index == other.index; } - bool operator!=(const PipId &other) const { return index != other.index; } + bool operator==(const PipId &other) const { return index == other.index; } + bool operator!=(const PipId &other) const { return index != other.index; } }; struct BelPin { - BelId bel; - PortPin pin; + BelId bel; + PortPin pin; }; -namespace std +namespace std { +template <> struct hash<BelId> { - template<> struct hash<BelId> - { - std::size_t operator()(const BelId &bel) const noexcept - { - return bel.index; - } - }; + std::size_t operator()(const BelId &bel) const noexcept + { + return bel.index; + } +}; - template<> struct hash<WireId> - { - std::size_t operator()(const WireId &wire) const noexcept - { - return wire.index; - } - }; +template <> struct hash<WireId> +{ + std::size_t operator()(const WireId &wire) const noexcept + { + return wire.index; + } +}; - template<> struct hash<PipId> - { - std::size_t operator()(const PipId &wire) const noexcept - { - return wire.index; - } - }; +template <> struct hash<PipId> +{ + std::size_t operator()(const PipId &wire) const noexcept + { + return wire.index; + } +}; } // ----------------------------------------------------------------------- struct BelIterator { - int cursor; - - void operator++() { cursor++; } - bool operator!=(const BelIterator &other) const { return cursor != other.cursor; } - - BelId operator*() const { - BelId ret; - ret.index = cursor; - return ret; - } + int cursor; + + void operator++() { cursor++; } + bool operator!=(const BelIterator &other) const + { + return cursor != other.cursor; + } + + BelId operator*() const + { + BelId ret; + ret.index = cursor; + return ret; + } }; struct BelRange { - BelIterator b, e; - BelIterator begin() const { return b; } - BelIterator end() const { return e; } + BelIterator b, e; + BelIterator begin() const { return b; } + BelIterator end() const { return e; } }; // ----------------------------------------------------------------------- struct BelPinIterator { - BelPortPOD *ptr = nullptr; - - void operator++() { ptr++; } - bool operator!=(const BelPinIterator &other) const { return ptr != other.ptr; } - - BelPin operator*() const { - BelPin ret; - ret.bel.index = ptr->bel_index; - ret.pin = ptr->port; - return ret; - } + BelPortPOD *ptr = nullptr; + + void operator++() { ptr++; } + bool operator!=(const BelPinIterator &other) const + { + return ptr != other.ptr; + } + + BelPin operator*() const + { + BelPin ret; + ret.bel.index = ptr->bel_index; + ret.pin = ptr->port; + return ret; + } }; struct BelPinRange { - BelPinIterator b, e; - BelPinIterator begin() const { return b; } - BelPinIterator end() const { return e; } + BelPinIterator b, e; + BelPinIterator begin() const { return b; } + BelPinIterator end() const { return e; } }; // ----------------------------------------------------------------------- struct WireIterator { - int cursor = -1; - - void operator++() { cursor++; } - bool operator!=(const WireIterator &other) const { return cursor != other.cursor; } - - WireId operator*() const { - WireId ret; - ret.index = cursor; - return ret; - } + int cursor = -1; + + void operator++() { cursor++; } + bool operator!=(const WireIterator &other) const + { + return cursor != other.cursor; + } + + WireId operator*() const + { + WireId ret; + ret.index = cursor; + return ret; + } }; struct WireRange { - WireIterator b, e; - WireIterator begin() const { return b; } - WireIterator end() const { return e; } + WireIterator b, e; + WireIterator begin() const { return b; } + WireIterator end() const { return e; } }; // ----------------------------------------------------------------------- struct AllPipIterator { - int cursor = -1; - - void operator++() { cursor++; } - bool operator!=(const AllPipIterator &other) const { return cursor != other.cursor; } - - PipId operator*() const { - PipId ret; - ret.index = cursor; - return ret; - } + int cursor = -1; + + void operator++() { cursor++; } + bool operator!=(const AllPipIterator &other) const + { + return cursor != other.cursor; + } + + PipId operator*() const + { + PipId ret; + ret.index = cursor; + return ret; + } }; struct AllPipRange { - AllPipIterator b, e; - AllPipIterator begin() const { return b; } - AllPipIterator end() const { return e; } + AllPipIterator b, e; + AllPipIterator begin() const { return b; } + AllPipIterator end() const { return e; } }; // ----------------------------------------------------------------------- struct PipIterator { - int *cursor = nullptr; - - void operator++() { cursor++; } - bool operator!=(const PipIterator &other) const { return cursor != other.cursor; } - - PipId operator*() const { - PipId ret; - ret.index = *cursor; - return ret; - } + int *cursor = nullptr; + + void operator++() { cursor++; } + bool operator!=(const PipIterator &other) const + { + return cursor != other.cursor; + } + + PipId operator*() const + { + PipId ret; + ret.index = *cursor; + return ret; + } }; struct PipRange { - PipIterator b, e; - PipIterator begin() const { return b; } - PipIterator end() const { return e; } + PipIterator b, e; + PipIterator begin() const { return b; } + PipIterator end() const { return e; } }; // ----------------------------------------------------------------------- struct ChipArgs { - enum { - NONE, - LP384, - LP1K, - LP8K, - HX1K, - HX8K, - UP5K - } type = NONE; + enum + { + NONE, + LP384, + LP1K, + LP8K, + HX1K, + HX8K, + UP5K + } type = NONE; }; struct Chip { - ChipInfoPOD chip_info; + ChipInfoPOD chip_info; - mutable dict<IdString, int> bel_by_name; - mutable dict<IdString, int> wire_by_name; - mutable dict<IdString, int> pip_by_name; + mutable dict<IdString, int> bel_by_name; + mutable dict<IdString, int> wire_by_name; + mutable dict<IdString, int> pip_by_name; - Chip(ChipArgs args); + Chip(ChipArgs args); - // ------------------------------------------------- + // ------------------------------------------------- - BelId getBelByName(IdString name) const; + BelId getBelByName(IdString name) const; - IdString getBelName(BelId bel) const - { - assert(!bel.nil()); - return chip_info.bel_data[bel.index].name; - } + IdString getBelName(BelId bel) const + { + assert(!bel.nil()); + return chip_info.bel_data[bel.index].name; + } - void bindBel(BelId bel, IdString cell) - { - } + void bindBel(BelId bel, IdString cell) {} - void unbindBel(BelId bel) - { - } + void unbindBel(BelId bel) {} - bool checkBelAvail(BelId bel) const - { - } + bool checkBelAvail(BelId bel) const {} - BelRange getBels() const - { - BelRange range; - range.b.cursor = 0; - range.e.cursor = chip_info.num_bels; - return range; - } + BelRange getBels() const + { + BelRange range; + range.b.cursor = 0; + range.e.cursor = chip_info.num_bels; + return range; + } - BelRange getBelsByType(BelType type) const - { - BelRange range; - // FIXME + BelRange getBelsByType(BelType type) const + { + BelRange range; +// FIXME #if 0 if (type == "TYPE_A") { range.b.cursor = bels_type_a_begin; @@ -460,161 +467,155 @@ struct Chip } ... #endif - return range; - } - - BelType getBelType(BelId bel) const - { - assert(!bel.nil()); - return chip_info.bel_data[bel.index].type; - } - - WireId getWireBelPin(BelId bel, PortPin pin) const; - - BelPin getBelPinUphill(WireId wire) const - { - BelPin ret; - assert(!wire.nil()); - - if (chip_info.wire_data[wire.index].bel_uphill.bel_index >= 0) { - ret.bel.index = chip_info.wire_data[wire.index].bel_uphill.bel_index; - ret.pin = chip_info.wire_data[wire.index].bel_uphill.port; - } - - return ret; - } - - BelPinRange getBelPinsDownhill(WireId wire) const - { - BelPinRange range; - assert(!wire.nil()); - range.b.ptr = chip_info.wire_data[wire.index].bels_downhill; - range.e.ptr = range.b.ptr + chip_info.wire_data[wire.index].num_bels_downhill; - return range; - } - - // ------------------------------------------------- - - WireId getWireByName(IdString name) const; - - IdString getWireName(WireId wire) const - { - assert(!wire.nil()); - return chip_info.wire_data[wire.index].name; - } - - void bindWire(WireId bel, IdString net) - { - } - - void unbindWire(WireId bel) - { - } - - bool checkWireAvail(WireId bel) const - { - } - - WireRange getWires() const - { - WireRange range; - range.b.cursor = 0; - range.e.cursor = chip_info.num_wires; - return range; - } - - // ------------------------------------------------- - - PipId getPipByName(IdString name) const; - - IdString getPipName(PipId pip) const - { - assert(!pip.nil()); - std::string src_name = chip_info.wire_data[chip_info.pip_data[pip.index].src].name; - std::string dst_name = chip_info.wire_data[chip_info.pip_data[pip.index].dst].name; - return src_name + "->" + dst_name; - } - - void bindPip(PipId bel, IdString net) - { - } - - void unbindPip(PipId bel) - { - } - - bool checkPipAvail(PipId bel) const - { - } - - AllPipRange getPips() const - { - AllPipRange range; - range.b.cursor = 0; - range.e.cursor = chip_info.num_pips; - return range; - } - - WireId getPipSrcWire(PipId pip) const - { - WireId wire; - assert(!pip.nil()); - wire.index = chip_info.pip_data[pip.index].src; - return wire; - } - - WireId getPipDstWire(PipId pip) const - { - WireId wire; - assert(!pip.nil()); - wire.index = chip_info.pip_data[pip.index].dst; - return wire; - } - - DelayInfo getPipDelay(PipId pip) const - { - DelayInfo delay; - assert(!pip.nil()); - delay.delay = chip_info.pip_data[pip.index].delay; - return delay; - } - - PipRange getPipsDownhill(WireId wire) const - { - PipRange range; - assert(!wire.nil()); - range.b.cursor = chip_info.wire_data[wire.index].pips_downhill; - range.e.cursor = range.b.cursor + chip_info.wire_data[wire.index].num_downhill; - return range; - } - - PipRange getPipsUphill(WireId wire) const - { - PipRange range; - assert(!wire.nil()); - range.b.cursor = chip_info.wire_data[wire.index].pips_uphill; - range.e.cursor = range.b.cursor + chip_info.wire_data[wire.index].num_uphill; - return range; - } - - PipRange getWireAliases(WireId wire) const - { - PipRange range; - assert(!wire.nil()); - range.b.cursor = nullptr; - range.e.cursor = nullptr; - return range; - } - - // ------------------------------------------------- - - void getBelPosition(BelId bel, float &x, float &y) const; - void getWirePosition(WireId wire, float &x, float &y) const; - void getPipPosition(PipId pip, float &x, float &y) const; - vector<GraphicElement> getBelGraphics(BelId bel) const; - vector<GraphicElement> getWireGraphics(WireId wire) const; - vector<GraphicElement> getPipGraphics(PipId pip) const; - vector<GraphicElement> getFrameGraphics() const; + return range; + } + + BelType getBelType(BelId bel) const + { + assert(!bel.nil()); + return chip_info.bel_data[bel.index].type; + } + + WireId getWireBelPin(BelId bel, PortPin pin) const; + + BelPin getBelPinUphill(WireId wire) const + { + BelPin ret; + assert(!wire.nil()); + + if (chip_info.wire_data[wire.index].bel_uphill.bel_index >= 0) { + ret.bel.index = + chip_info.wire_data[wire.index].bel_uphill.bel_index; + ret.pin = chip_info.wire_data[wire.index].bel_uphill.port; + } + + return ret; + } + + BelPinRange getBelPinsDownhill(WireId wire) const + { + BelPinRange range; + assert(!wire.nil()); + range.b.ptr = chip_info.wire_data[wire.index].bels_downhill; + range.e.ptr = + range.b.ptr + chip_info.wire_data[wire.index].num_bels_downhill; + return range; + } + + // ------------------------------------------------- + + WireId getWireByName(IdString name) const; + + IdString getWireName(WireId wire) const + { + assert(!wire.nil()); + return chip_info.wire_data[wire.index].name; + } + + void bindWire(WireId bel, IdString net) {} + + void unbindWire(WireId bel) {} + + bool checkWireAvail(WireId bel) const {} + + WireRange getWires() const + { + WireRange range; + range.b.cursor = 0; + range.e.cursor = chip_info.num_wires; + return range; + } + + // ------------------------------------------------- + + PipId getPipByName(IdString name) const; + + IdString getPipName(PipId pip) const + { + assert(!pip.nil()); + std::string src_name = + chip_info.wire_data[chip_info.pip_data[pip.index].src].name; + std::string dst_name = + chip_info.wire_data[chip_info.pip_data[pip.index].dst].name; + return src_name + "->" + dst_name; + } + + void bindPip(PipId bel, IdString net) {} + + void unbindPip(PipId bel) {} + + bool checkPipAvail(PipId bel) const {} + + AllPipRange getPips() const + { + AllPipRange range; + range.b.cursor = 0; + range.e.cursor = chip_info.num_pips; + return range; + } + + WireId getPipSrcWire(PipId pip) const + { + WireId wire; + assert(!pip.nil()); + wire.index = chip_info.pip_data[pip.index].src; + return wire; + } + + WireId getPipDstWire(PipId pip) const + { + WireId wire; + assert(!pip.nil()); + wire.index = chip_info.pip_data[pip.index].dst; + return wire; + } + + DelayInfo getPipDelay(PipId pip) const + { + DelayInfo delay; + assert(!pip.nil()); + delay.delay = chip_info.pip_data[pip.index].delay; + return delay; + } + + PipRange getPipsDownhill(WireId wire) const + { + PipRange range; + assert(!wire.nil()); + range.b.cursor = chip_info.wire_data[wire.index].pips_downhill; + range.e.cursor = + range.b.cursor + chip_info.wire_data[wire.index].num_downhill; + return range; + } + + PipRange getPipsUphill(WireId wire) const + { + PipRange range; + assert(!wire.nil()); + range.b.cursor = chip_info.wire_data[wire.index].pips_uphill; + range.e.cursor = + range.b.cursor + chip_info.wire_data[wire.index].num_uphill; + return range; + } + + PipRange getWireAliases(WireId wire) const + { + PipRange range; + assert(!wire.nil()); + range.b.cursor = nullptr; + range.e.cursor = nullptr; + return range; + } + + // ------------------------------------------------- + + void getBelPosition(BelId bel, float &x, float &y) const; + void getWirePosition(WireId wire, float &x, float &y) const; + void getPipPosition(PipId pip, float &x, float &y) const; + vector<GraphicElement> getBelGraphics(BelId bel) const; + vector<GraphicElement> getWireGraphics(WireId wire) const; + vector<GraphicElement> getPipGraphics(PipId pip) const; + vector<GraphicElement> getFrameGraphics() const; }; #endif diff --git a/ice40/family.cmake b/ice40/family.cmake index 870b69b9..05709388 100644 --- a/ice40/family.cmake +++ b/ice40/family.cmake @@ -1,4 +1,12 @@ -set(devices 384 1k 5k 8k) +if(ICE40_HX1K_ONLY) + set(devices 1k) + foreach (target ${family_targets}) + target_compile_definitions(${target} PRIVATE ICE40_HX1K_ONLY=1) + endforeach (target) +else() + set(devices 384 1k 5k 8k) +endif() + set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdb.py) file(MAKE_DIRECTORY ice40/chipdbs/) add_library(ice40_chipdb OBJECT ice40/chipdbs/) diff --git a/ice40/main.cc b/ice40/main.cc index 9295bde4..d47076fd 100644 --- a/ice40/main.cc +++ b/ice40/main.cc @@ -16,208 +16,244 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ -#include "design.h" -#include "mainwindow.h" #include <QApplication> -#include <iostream> -#include <fstream> -#include "version.h" #include <boost/program_options.hpp> -#include "pybindings.h" +#include <fstream> +#include <iostream> +#include "design.h" #include "jsonparse.h" +#include "mainwindow.h" +#include "pybindings.h" +#include "version.h" void svg_dump_el(const GraphicElement &el) { - float scale = 10.0, offset = 10.0; - std::string style = "stroke=\"black\" stroke-width=\"0.1\" fill=\"none\""; - - if (el.type == GraphicElement::G_BOX) { - std::cout << "<rect x=\"" << (offset + scale*el.x1) << "\" y=\"" << (offset + scale*el.y1) << - "\" height=\"" << (scale*(el.y2-el.y1)) << "\" width=\"" << (scale*(el.x2-el.x1)) << "\" " << style << "/>\n"; - } - - if (el.type == GraphicElement::G_LINE) { - std::cout << "<line x1=\"" << (offset + scale*el.x1) << "\" y1=\"" << (offset + scale*el.y1) << - "\" x2=\"" << (offset + scale*el.x2) << "\" y2=\"" << (offset + scale*el.y2) << "\" " << style << "/>\n"; - } + float scale = 10.0, offset = 10.0; + std::string style = "stroke=\"black\" stroke-width=\"0.1\" fill=\"none\""; + + if (el.type == GraphicElement::G_BOX) { + std::cout << "<rect x=\"" << (offset + scale * el.x1) << "\" y=\"" + << (offset + scale * el.y1) << "\" height=\"" + << (scale * (el.y2 - el.y1)) << "\" width=\"" + << (scale * (el.x2 - el.x1)) << "\" " << style << "/>\n"; + } + + if (el.type == GraphicElement::G_LINE) { + std::cout << "<line x1=\"" << (offset + scale * el.x1) << "\" y1=\"" + << (offset + scale * el.y1) << "\" x2=\"" + << (offset + scale * el.x2) << "\" y2=\"" + << (offset + scale * el.y2) << "\" " << style << "/>\n"; + } } int main(int argc, char *argv[]) { - namespace po = boost::program_options; - - std::string str; - - po::options_description options("Allowed options"); - options.add_options()("help,h","show help"); - options.add_options()("test","just a check"); - options.add_options()("gui","start gui"); - options.add_options()("svg","dump SVG file"); - options.add_options()("file", po::value<std::string>(), "python file to execute"); - options.add_options()("json", po::value<std::string>(), "JSON design file to ingest"); - options.add_options()("version,v","show version"); - options.add_options()("lp384","set device type to iCE40LP384"); - options.add_options()("lp1k","set device type to iCE40LP1K"); - options.add_options()("lp8k","set device type to iCE40LP8K"); - options.add_options()("hx1k","set device type to iCE40HX1K"); - options.add_options()("hx8k","set device type to iCE40HX8K"); - options.add_options()("up5k","set device type to iCE40UP5K"); - - po::positional_options_description pos; - pos.add("file", -1); - - po::variables_map vm; - try { - po::parsed_options parsed = po::command_line_parser(argc, argv). - options(options). - positional(pos). - run(); - - po::store(parsed, vm); - - po::notify(vm); - } - - catch(std::exception& e) - { - std::cout << e.what() << "\n"; - return 1; - } - - if (vm.count("help") || argc == 1) - { - std::cout << basename(argv[0]) << " -- Next Generation Place and Route (git sha1 " GIT_COMMIT_HASH_STR ")\n"; - std::cout << "\n"; - std::cout << options << "\n"; - return 1; - } - - if (vm.count("version")) - { - std::cout << basename(argv[0]) - << " -- Next Generation Place and Route (git sha1 " - GIT_COMMIT_HASH_STR ")\n"; - return 1; - } - - ChipArgs chipArgs; - chipArgs.type = ChipArgs::HX1K; - - if (vm.count("lp384")) - chipArgs.type = ChipArgs::LP384; - - if (vm.count("lp1k")) - chipArgs.type = ChipArgs::LP1K; - - if (vm.count("lp8k")) - chipArgs.type = ChipArgs::LP8K; - - if (vm.count("hx1k")) - chipArgs.type = ChipArgs::HX1K; - - if (vm.count("hx8k")) - chipArgs.type = ChipArgs::HX8K; - - if (vm.count("up5k")) - chipArgs.type = ChipArgs::UP5K; - - Design design(chipArgs); - - if (vm.count("gui")) - { - QApplication a(argc, argv); - MainWindow w; - w.show(); - - return a.exec(); - } - - if (vm.count("test")) - { - int bel_count = 0, wire_count = 0, pip_count = 0; - - std::cout << "Checking bel names.\n"; - for (auto bel : design.chip.getBels()) { - auto name = design.chip.getBelName(bel); - assert(bel == design.chip.getBelByName(name)); - bel_count++; - } - std::cout << " checked " << bel_count << " bels.\n"; - - std::cout << "Checking wire names.\n"; - for (auto wire : design.chip.getWires()) { - auto name = design.chip.getWireName(wire); - assert(wire == design.chip.getWireByName(name)); - wire_count++; - } - std::cout << " checked " << wire_count << " wires.\n"; - - std::cout << "Checking pip names.\n"; - for (auto pip : design.chip.getPips()) { - auto name = design.chip.getPipName(pip); - assert(pip == design.chip.getPipByName(name)); - pip_count++; - } - std::cout << " checked " << pip_count << " pips.\n"; - - std::cout << "Checking uphill -> downhill consistency.\n"; - for (auto dst : design.chip.getWires()) { - for (auto uphill_pip : design.chip.getPipsUphill(dst)) { - bool found_downhill = false; - for (auto downhill_pip : design.chip.getPipsDownhill(design.chip.getPipSrcWire(uphill_pip))) { - if (uphill_pip == downhill_pip) { - assert(!found_downhill); - found_downhill = true; - } - } - assert(found_downhill); - } - } - - std::cout << "Checking downhill -> uphill consistency.\n"; - for (auto dst : design.chip.getWires()) { - for (auto downhill_pip : design.chip.getPipsDownhill(dst)) { - bool found_uphill = false; - for (auto uphill_pip : design.chip.getPipsUphill(design.chip.getPipDstWire(downhill_pip))) { - if (uphill_pip == downhill_pip) { - assert(!found_uphill); - found_uphill = true; - } - } - assert(found_uphill); - } - } - - return 0; - } - - if (vm.count("svg")) - { - std::cout << "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n"; - for (auto bel : design.chip.getBels()) { - std::cout << "<!-- " << design.chip.getBelName(bel) << " -->\n"; - for (auto &el : design.chip.getBelGraphics(bel)) - svg_dump_el(el); - } - std::cout << "<!-- Frame -->\n"; - for (auto &el : design.chip.getFrameGraphics()) - svg_dump_el(el); - std::cout << "</svg>\n"; - } - - if (vm.count("json")) - { - std::string filename = vm["json"].as<std::string>(); - std::istream *f = new std::ifstream(filename); - - parse_json_file(f, filename, &design); - } - - if (vm.count("file")) - { - std::string filename = vm["file"].as<std::string>(); - execute_python_file(argv[0],filename.c_str()); - } - - return 0; + namespace po = boost::program_options; + int rc = 0; + std::string str; + + po::options_description options("Allowed options"); + options.add_options()("help,h", "show help"); + options.add_options()("test", "just a check"); + options.add_options()("gui", "start gui"); + options.add_options()("svg", "dump SVG file"); + options.add_options()("run", po::value<std::vector<std::string>>(), + "python file to execute"); + options.add_options()("json", po::value<std::string>(), + "JSON design file to ingest"); + options.add_options()("version,v", "show version"); + options.add_options()("lp384", "set device type to iCE40LP384"); + options.add_options()("lp1k", "set device type to iCE40LP1K"); + options.add_options()("lp8k", "set device type to iCE40LP8K"); + options.add_options()("hx1k", "set device type to iCE40HX1K"); + options.add_options()("hx8k", "set device type to iCE40HX8K"); + options.add_options()("up5k", "set device type to iCE40UP5K"); + + po::positional_options_description pos; + pos.add("run", -1); + + po::variables_map vm; + try { + po::parsed_options parsed = po::command_line_parser(argc, argv) + .options(options) + .positional(pos) + .run(); + + po::store(parsed, vm); + + po::notify(vm); + } + + catch (std::exception &e) { + std::cout << e.what() << "\n"; + return 1; + } + + if (vm.count("help") || argc == 1) { + help: + std::cout << basename(argv[0]) + << " -- Next Generation Place and Route (git " + "sha1 " GIT_COMMIT_HASH_STR ")\n"; + std::cout << "\n"; + std::cout << options << "\n"; + return argc != 1; + } + + if (vm.count("version")) { + std::cout << basename(argv[0]) + << " -- Next Generation Place and Route (git " + "sha1 " GIT_COMMIT_HASH_STR ")\n"; + return 1; + } + + ChipArgs chipArgs; + + if (vm.count("lp384")) { + if (chipArgs.type != ChipArgs::NONE) + goto help; + chipArgs.type = ChipArgs::LP384; + } + + if (vm.count("lp1k")) { + if (chipArgs.type != ChipArgs::NONE) + goto help; + chipArgs.type = ChipArgs::LP1K; + } + + if (vm.count("lp8k")) { + if (chipArgs.type != ChipArgs::NONE) + goto help; + chipArgs.type = ChipArgs::LP8K; + } + + if (vm.count("hx1k")) { + if (chipArgs.type != ChipArgs::NONE) + goto help; + chipArgs.type = ChipArgs::HX1K; + } + + if (vm.count("hx8k")) { + if (chipArgs.type != ChipArgs::NONE) + goto help; + chipArgs.type = ChipArgs::HX8K; + } + + if (vm.count("up5k")) { + if (chipArgs.type != ChipArgs::NONE) + goto help; + chipArgs.type = ChipArgs::UP5K; + } + + if (chipArgs.type == ChipArgs::NONE) + chipArgs.type = ChipArgs::HX1K; + +#ifdef ICE40_HX1K_ONLY + if (chipArgs.type != ChipArgs::HX1K) { + std::cout << "This version of nextpnr-ice40 is built with HX1K-support " + "only.\n"; + return 1; + } +#endif + + Design design(chipArgs); + init_python(argv[0]); + python_export_global("design", design); + + if (vm.count("test")) { + int bel_count = 0, wire_count = 0, pip_count = 0; + + std::cout << "Checking bel names.\n"; + for (auto bel : design.chip.getBels()) { + auto name = design.chip.getBelName(bel); + assert(bel == design.chip.getBelByName(name)); + bel_count++; + } + std::cout << " checked " << bel_count << " bels.\n"; + + std::cout << "Checking wire names.\n"; + for (auto wire : design.chip.getWires()) { + auto name = design.chip.getWireName(wire); + assert(wire == design.chip.getWireByName(name)); + wire_count++; + } + std::cout << " checked " << wire_count << " wires.\n"; + + std::cout << "Checking pip names.\n"; + for (auto pip : design.chip.getPips()) { + auto name = design.chip.getPipName(pip); + assert(pip == design.chip.getPipByName(name)); + pip_count++; + } + std::cout << " checked " << pip_count << " pips.\n"; + + std::cout << "Checking uphill -> downhill consistency.\n"; + for (auto dst : design.chip.getWires()) { + for (auto uphill_pip : design.chip.getPipsUphill(dst)) { + bool found_downhill = false; + for (auto downhill_pip : design.chip.getPipsDownhill( + design.chip.getPipSrcWire(uphill_pip))) { + if (uphill_pip == downhill_pip) { + assert(!found_downhill); + found_downhill = true; + } + } + assert(found_downhill); + } + } + + std::cout << "Checking downhill -> uphill consistency.\n"; + for (auto dst : design.chip.getWires()) { + for (auto downhill_pip : design.chip.getPipsDownhill(dst)) { + bool found_uphill = false; + for (auto uphill_pip : design.chip.getPipsUphill( + design.chip.getPipDstWire(downhill_pip))) { + if (uphill_pip == downhill_pip) { + assert(!found_uphill); + found_uphill = true; + } + } + assert(found_uphill); + } + } + + return 0; + } + + if (vm.count("svg")) { + std::cout << "<svg xmlns=\"http://www.w3.org/2000/svg\" " + "xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n"; + for (auto bel : design.chip.getBels()) { + std::cout << "<!-- " << design.chip.getBelName(bel) << " -->\n"; + for (auto &el : design.chip.getBelGraphics(bel)) + svg_dump_el(el); + } + std::cout << "<!-- Frame -->\n"; + for (auto &el : design.chip.getFrameGraphics()) + svg_dump_el(el); + std::cout << "</svg>\n"; + } + + if (vm.count("json")) { + std::string filename = vm["json"].as<std::string>(); + std::istream *f = new std::ifstream(filename); + + parse_json_file(f, filename, &design); + } + + if (vm.count("run")) { + std::vector<std::string> files = + vm["run"].as<std::vector<std::string>>(); + for (auto filename : files) + execute_python_file(filename.c_str()); + } + + if (vm.count("gui")) { + QApplication a(argc, argv); + MainWindow w; + w.show(); + + rc = a.exec(); + } + deinit_python(); + return rc; } diff --git a/ice40/pybindings.cc b/ice40/pybindings.cc index dc13f849..daf0be84 100644 --- a/ice40/pybindings.cc +++ b/ice40/pybindings.cc @@ -18,13 +18,15 @@ * */ -#include "design.h" #include "chip.h" +#include "design.h" + +// include after design.h/chip.h #include "pybindings.h" -void arch_wrap_python() { - class_<ChipArgs>("ChipArgs") - .def_readwrite("type", &ChipArgs::type); +void arch_wrap_python() +{ + class_<ChipArgs>("ChipArgs").def_readwrite("type", &ChipArgs::type); enum_<decltype(std::declval<ChipArgs>().type)>("iCE40Type") .value("NONE", ChipArgs::NONE) |