Merge branch 'master' of gitlab.com:SymbioticEDA/nextpnr into q3k/fix-zoom
This commit is contained in:
commit
681d824131
@ -136,7 +136,7 @@ NEXTPNR_NAMESPACE_BEGIN
|
|||||||
|
|
||||||
struct GraphicElement
|
struct GraphicElement
|
||||||
{
|
{
|
||||||
enum
|
enum type_t
|
||||||
{
|
{
|
||||||
G_NONE,
|
G_NONE,
|
||||||
G_LINE,
|
G_LINE,
|
||||||
@ -145,6 +145,14 @@ struct GraphicElement
|
|||||||
G_LABEL
|
G_LABEL
|
||||||
} type = G_NONE;
|
} type = G_NONE;
|
||||||
|
|
||||||
|
enum style_t
|
||||||
|
{
|
||||||
|
G_FRAME,
|
||||||
|
G_HIDDEN,
|
||||||
|
G_INACTIVE,
|
||||||
|
G_ACTIVE,
|
||||||
|
} style = G_FRAME;
|
||||||
|
|
||||||
float x1 = 0, y1 = 0, x2 = 0, y2 = 0, z = 0;
|
float x1 = 0, y1 = 0, x2 = 0, y2 = 0, z = 0;
|
||||||
std::string text;
|
std::string text;
|
||||||
};
|
};
|
||||||
|
@ -317,7 +317,7 @@ DecalXY Arch::getWireDecal(WireId wire) const { return {}; }
|
|||||||
|
|
||||||
DecalXY Arch::getPipDecal(PipId pip) const { return {}; };
|
DecalXY Arch::getPipDecal(PipId pip) const { return {}; };
|
||||||
|
|
||||||
DecalXY Arch::getGroupDecal(PipId pip) const { return {}; };
|
DecalXY Arch::getGroupDecal(GroupId pip) const { return {}; };
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -1,6 +1,17 @@
|
|||||||
|
|
||||||
set(devices 45k)
|
set(devices 45k)
|
||||||
|
|
||||||
|
if (NOT DEFINED TRELLIS_ROOT)
|
||||||
|
message(FATAL_ERROR "you must define TRELLIS_ROOT using -DTRELLIS_ROOT=/path/to/prjtrellis for ECP5 support")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
file( GLOB found_pytrellis ${TRELLIS_ROOT}/libtrellis/pytrellis.*)
|
||||||
|
|
||||||
|
if ("${found_pytrellis}" STREQUAL "")
|
||||||
|
message(FATAL_ERROR "failed to find pytrellis library in ${TRELLIS_ROOT}/libtrellis/")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/trellis_import.py)
|
set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/trellis_import.py)
|
||||||
|
|
||||||
file(MAKE_DIRECTORY ecp5/chipdbs/)
|
file(MAKE_DIRECTORY ecp5/chipdbs/)
|
||||||
|
@ -243,6 +243,13 @@ void LineShader::draw(const LineShaderData &line, const QMatrix4x4 &projection)
|
|||||||
FPGAViewWidget::FPGAViewWidget(QWidget *parent)
|
FPGAViewWidget::FPGAViewWidget(QWidget *parent)
|
||||||
: QOpenGLWidget(parent), lineShader_(this), zoom_(500.f), ctx_(nullptr)
|
: QOpenGLWidget(parent), lineShader_(this), zoom_(500.f), ctx_(nullptr)
|
||||||
{
|
{
|
||||||
|
backgroundColor = QColor("#ffffff");
|
||||||
|
gridColor = QColor("#ddd");
|
||||||
|
belColor = QColor("#303030");
|
||||||
|
wireColor = QColor("#303030");
|
||||||
|
pipColor = QColor("#303030");
|
||||||
|
groupColor = QColor("#303030");
|
||||||
|
frameColor = QColor("#0066ba");
|
||||||
auto fmt = format();
|
auto fmt = format();
|
||||||
fmt.setMajorVersion(3);
|
fmt.setMajorVersion(3);
|
||||||
fmt.setMinorVersion(1);
|
fmt.setMinorVersion(1);
|
||||||
@ -277,7 +284,7 @@ void FPGAViewWidget::initializeGL()
|
|||||||
log_error("Could not compile shader.\n");
|
log_error("Could not compile shader.\n");
|
||||||
}
|
}
|
||||||
initializeOpenGLFunctions();
|
initializeOpenGLFunctions();
|
||||||
glClearColor(1.0, 1.0, 1.0, 0.0);
|
glClearColor(backgroundColor.red()/255, backgroundColor.green()/255, backgroundColor.blue()/255, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FPGAViewWidget::drawElement(LineShaderData &out, const GraphicElement &el)
|
void FPGAViewWidget::drawElement(LineShaderData &out, const GraphicElement &el)
|
||||||
@ -325,7 +332,7 @@ void FPGAViewWidget::paintGL()
|
|||||||
float thick11Px = mouseToWorldCoordinates(1.1, 0).x();
|
float thick11Px = mouseToWorldCoordinates(1.1, 0).x();
|
||||||
|
|
||||||
// Draw grid.
|
// Draw grid.
|
||||||
auto grid = LineShaderData(thick1Px, QColor("#DDD"));
|
auto grid = LineShaderData(thick1Px, gridColor);
|
||||||
for (float i = -100.0f; i < 100.0f; i += 1.0f) {
|
for (float i = -100.0f; i < 100.0f; i += 1.0f) {
|
||||||
PolyLine(-100.0f, i, 100.0f, i).build(grid);
|
PolyLine(-100.0f, i, 100.0f, i).build(grid);
|
||||||
PolyLine(i, -100.0f, i, 100.0f).build(grid);
|
PolyLine(i, -100.0f, i, 100.0f).build(grid);
|
||||||
@ -333,7 +340,7 @@ void FPGAViewWidget::paintGL()
|
|||||||
lineShader_.draw(grid, matrix);
|
lineShader_.draw(grid, matrix);
|
||||||
|
|
||||||
// Draw Bels.
|
// Draw Bels.
|
||||||
auto bels = LineShaderData(thick11Px, QColor("#b000ba"));
|
auto bels = LineShaderData(thick11Px, belColor);
|
||||||
if (ctx_) {
|
if (ctx_) {
|
||||||
for (auto bel : ctx_->getBels()) {
|
for (auto bel : ctx_->getBels()) {
|
||||||
for (auto &el : ctx_->getBelGraphics(bel))
|
for (auto &el : ctx_->getBelGraphics(bel))
|
||||||
@ -343,7 +350,7 @@ void FPGAViewWidget::paintGL()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Draw Wires.
|
// Draw Wires.
|
||||||
auto wires = LineShaderData(thick11Px, QColor("#b000ba"));
|
auto wires = LineShaderData(thick11Px, wireColor);
|
||||||
if (ctx_) {
|
if (ctx_) {
|
||||||
for (auto wire : ctx_->getWires()) {
|
for (auto wire : ctx_->getWires()) {
|
||||||
for (auto &el : ctx_->getWireGraphics(wire))
|
for (auto &el : ctx_->getWireGraphics(wire))
|
||||||
@ -353,7 +360,7 @@ void FPGAViewWidget::paintGL()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Draw Pips.
|
// Draw Pips.
|
||||||
auto pips = LineShaderData(thick11Px, QColor("#b000ba"));
|
auto pips = LineShaderData(thick11Px, pipColor);
|
||||||
if (ctx_) {
|
if (ctx_) {
|
||||||
for (auto wire : ctx_->getPips()) {
|
for (auto wire : ctx_->getPips()) {
|
||||||
for (auto &el : ctx_->getPipGraphics(wire))
|
for (auto &el : ctx_->getPipGraphics(wire))
|
||||||
@ -363,7 +370,7 @@ void FPGAViewWidget::paintGL()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Draw Groups.
|
// Draw Groups.
|
||||||
auto groups = LineShaderData(thick11Px, QColor("#b000ba"));
|
auto groups = LineShaderData(thick11Px, groupColor);
|
||||||
if (ctx_) {
|
if (ctx_) {
|
||||||
for (auto group : ctx_->getGroups()) {
|
for (auto group : ctx_->getGroups()) {
|
||||||
for (auto &el : ctx_->getGroupGraphics(group))
|
for (auto &el : ctx_->getGroupGraphics(group))
|
||||||
@ -373,7 +380,7 @@ void FPGAViewWidget::paintGL()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Draw Frame Graphics.
|
// Draw Frame Graphics.
|
||||||
auto frames = LineShaderData(thick11Px, QColor("#0066ba"));
|
auto frames = LineShaderData(thick11Px, frameColor);
|
||||||
if (ctx_) {
|
if (ctx_) {
|
||||||
for (auto &el : ctx_->getFrameGraphics()) {
|
for (auto &el : ctx_->getFrameGraphics()) {
|
||||||
drawElement(frames, el);
|
drawElement(frames, el);
|
||||||
|
@ -216,6 +216,13 @@ class LineShader
|
|||||||
class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions
|
class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QColor backgroundColor MEMBER backgroundColor DESIGNABLE true)
|
||||||
|
Q_PROPERTY(QColor belColor MEMBER belColor DESIGNABLE true)
|
||||||
|
Q_PROPERTY(QColor gridColor MEMBER gridColor DESIGNABLE true)
|
||||||
|
Q_PROPERTY(QColor wireColor MEMBER wireColor DESIGNABLE true)
|
||||||
|
Q_PROPERTY(QColor pipColor MEMBER pipColor DESIGNABLE true)
|
||||||
|
Q_PROPERTY(QColor groupColor MEMBER groupColor DESIGNABLE true)
|
||||||
|
Q_PROPERTY(QColor frameColor MEMBER frameColor DESIGNABLE true)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FPGAViewWidget(QWidget *parent = 0);
|
FPGAViewWidget(QWidget *parent = 0);
|
||||||
@ -258,6 +265,13 @@ class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions
|
|||||||
const float zoomLvl2_ = 50.0f;
|
const float zoomLvl2_ = 50.0f;
|
||||||
|
|
||||||
Context *ctx_;
|
Context *ctx_;
|
||||||
|
QColor backgroundColor;
|
||||||
|
QColor gridColor;
|
||||||
|
QColor belColor;
|
||||||
|
QColor wireColor;
|
||||||
|
QColor pipColor;
|
||||||
|
QColor groupColor;
|
||||||
|
QColor frameColor;
|
||||||
};
|
};
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
@ -478,6 +478,8 @@ DecalXY Arch::getBelDecal(BelId bel) const
|
|||||||
DecalXY Arch::getWireDecal(WireId wire) const
|
DecalXY Arch::getWireDecal(WireId wire) const
|
||||||
{
|
{
|
||||||
DecalXY decalxy;
|
DecalXY decalxy;
|
||||||
|
decalxy.decal.type = DecalId::TYPE_WIRE;
|
||||||
|
decalxy.decal.index = wire.index;
|
||||||
return decalxy;
|
return decalxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -510,6 +512,21 @@ std::vector<GraphicElement> Arch::getDecalGraphics(DecalId decal) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (decal.type == DecalId::TYPE_WIRE)
|
||||||
|
{
|
||||||
|
WireId wire;
|
||||||
|
wire.index = decal.index;
|
||||||
|
|
||||||
|
int n = chip_info->wire_data[wire.index].num_segments;
|
||||||
|
const WireSegmentPOD *p = chip_info->wire_data[wire.index].segments.get();
|
||||||
|
|
||||||
|
GraphicElement::style_t style = wire_to_net.at(wire.index) != IdString() ?
|
||||||
|
GraphicElement::G_ACTIVE : GraphicElement::G_INACTIVE;
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
gfxTileWire(ret, p[i].x, p[i].y, GfxTileWireId(p[i].index), style);
|
||||||
|
}
|
||||||
|
|
||||||
if (decal.type == DecalId::TYPE_BEL)
|
if (decal.type == DecalId::TYPE_BEL)
|
||||||
{
|
{
|
||||||
BelId bel;
|
BelId bel;
|
||||||
@ -520,6 +537,7 @@ std::vector<GraphicElement> Arch::getDecalGraphics(DecalId decal) const
|
|||||||
if (bel_type == TYPE_ICESTORM_LC) {
|
if (bel_type == TYPE_ICESTORM_LC) {
|
||||||
GraphicElement el;
|
GraphicElement el;
|
||||||
el.type = GraphicElement::G_BOX;
|
el.type = GraphicElement::G_BOX;
|
||||||
|
el.style = bel_to_cell.at(bel.index) != IdString() ? GraphicElement::G_ACTIVE : GraphicElement::G_INACTIVE;
|
||||||
el.x1 = chip_info->bel_data[bel.index].x + logic_cell_x1;
|
el.x1 = chip_info->bel_data[bel.index].x + logic_cell_x1;
|
||||||
el.x2 = chip_info->bel_data[bel.index].x + logic_cell_x2;
|
el.x2 = chip_info->bel_data[bel.index].x + logic_cell_x2;
|
||||||
el.y1 = chip_info->bel_data[bel.index].y + logic_cell_y1 + (chip_info->bel_data[bel.index].z) * logic_cell_pitch;
|
el.y1 = chip_info->bel_data[bel.index].y + logic_cell_y1 + (chip_info->bel_data[bel.index].z) * logic_cell_pitch;
|
||||||
@ -534,6 +552,7 @@ std::vector<GraphicElement> Arch::getDecalGraphics(DecalId decal) const
|
|||||||
// Main switchbox
|
// Main switchbox
|
||||||
GraphicElement main_sw;
|
GraphicElement main_sw;
|
||||||
main_sw.type = GraphicElement::G_BOX;
|
main_sw.type = GraphicElement::G_BOX;
|
||||||
|
main_sw.style = GraphicElement::G_FRAME;
|
||||||
main_sw.x1 = tx + main_swbox_x1;
|
main_sw.x1 = tx + main_swbox_x1;
|
||||||
main_sw.x2 = tx + main_swbox_x2;
|
main_sw.x2 = tx + main_swbox_x2;
|
||||||
main_sw.y1 = ty + main_swbox_y1;
|
main_sw.y1 = ty + main_swbox_y1;
|
||||||
@ -543,16 +562,13 @@ std::vector<GraphicElement> Arch::getDecalGraphics(DecalId decal) const
|
|||||||
// Local tracks to LUT input switchbox
|
// Local tracks to LUT input switchbox
|
||||||
GraphicElement local_sw;
|
GraphicElement local_sw;
|
||||||
local_sw.type = GraphicElement::G_BOX;
|
local_sw.type = GraphicElement::G_BOX;
|
||||||
|
local_sw.style = GraphicElement::G_FRAME;
|
||||||
local_sw.x1 = tx + local_swbox_x1;
|
local_sw.x1 = tx + local_swbox_x1;
|
||||||
local_sw.x2 = tx + local_swbox_x2;
|
local_sw.x2 = tx + local_swbox_x2;
|
||||||
local_sw.y1 = ty + local_swbox_y1;
|
local_sw.y1 = ty + local_swbox_y1;
|
||||||
local_sw.y2 = ty + local_swbox_y2;
|
local_sw.y2 = ty + local_swbox_y2;
|
||||||
local_sw.z = 0;
|
local_sw.z = 0;
|
||||||
ret.push_back(local_sw);
|
ret.push_back(local_sw);
|
||||||
|
|
||||||
// All the wires
|
|
||||||
for (int i = TILE_WIRE_GLB2LOCAL_0; i <= TILE_WIRE_SP12_H_L_23; i++)
|
|
||||||
gfxTileWire(ret, tx, ty, GfxTileWireId(i));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,6 +70,11 @@ NPNR_PACKED_STRUCT(struct PipInfoPOD {
|
|||||||
int32_t switch_index;
|
int32_t switch_index;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
NPNR_PACKED_STRUCT(struct WireSegmentPOD {
|
||||||
|
int8_t x, y;
|
||||||
|
int16_t index;
|
||||||
|
});
|
||||||
|
|
||||||
NPNR_PACKED_STRUCT(struct WireInfoPOD {
|
NPNR_PACKED_STRUCT(struct WireInfoPOD {
|
||||||
RelPtr<char> name;
|
RelPtr<char> name;
|
||||||
int32_t num_uphill, num_downhill;
|
int32_t num_uphill, num_downhill;
|
||||||
@ -79,6 +84,9 @@ NPNR_PACKED_STRUCT(struct WireInfoPOD {
|
|||||||
BelPortPOD bel_uphill;
|
BelPortPOD bel_uphill;
|
||||||
RelPtr<BelPortPOD> bels_downhill;
|
RelPtr<BelPortPOD> bels_downhill;
|
||||||
|
|
||||||
|
int32_t num_segments;
|
||||||
|
RelPtr<WireSegmentPOD> segments;
|
||||||
|
|
||||||
int8_t x, y;
|
int8_t x, y;
|
||||||
WireType type;
|
WireType type;
|
||||||
int8_t padding_0;
|
int8_t padding_0;
|
||||||
|
@ -11,6 +11,7 @@ group.add_argument("-b", "--binary", action="store_true")
|
|||||||
group.add_argument("-c", "--c_file", action="store_true")
|
group.add_argument("-c", "--c_file", action="store_true")
|
||||||
parser.add_argument("filename", type=str, help="chipdb input filename")
|
parser.add_argument("filename", type=str, help="chipdb input filename")
|
||||||
parser.add_argument("-p", "--portspins", type=str, help="path to portpins.inc")
|
parser.add_argument("-p", "--portspins", type=str, help="path to portpins.inc")
|
||||||
|
parser.add_argument("-g", "--gfxh", type=str, help="path to gfx.h")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
endianness = "le"
|
endianness = "le"
|
||||||
@ -54,6 +55,9 @@ beltypes = dict()
|
|||||||
tiletypes = dict()
|
tiletypes = dict()
|
||||||
wiretypes = dict()
|
wiretypes = dict()
|
||||||
|
|
||||||
|
gfx_wire_ids = dict()
|
||||||
|
wire_segments = dict()
|
||||||
|
|
||||||
with open(args.portspins) as f:
|
with open(args.portspins) as f:
|
||||||
for line in f:
|
for line in f:
|
||||||
line = line.replace("(", " ")
|
line = line.replace("(", " ")
|
||||||
@ -66,6 +70,18 @@ with open(args.portspins) as f:
|
|||||||
idx = len(portpins) + 1
|
idx = len(portpins) + 1
|
||||||
portpins[line[1]] = idx
|
portpins[line[1]] = idx
|
||||||
|
|
||||||
|
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:
|
||||||
|
idx = len(gfx_wire_ids)
|
||||||
|
name = line.strip().rstrip(",")
|
||||||
|
gfx_wire_ids[name] = idx
|
||||||
|
|
||||||
beltypes["ICESTORM_LC"] = 1
|
beltypes["ICESTORM_LC"] = 1
|
||||||
beltypes["ICESTORM_RAM"] = 2
|
beltypes["ICESTORM_RAM"] = 2
|
||||||
beltypes["SB_IO"] = 3
|
beltypes["SB_IO"] = 3
|
||||||
@ -371,6 +387,10 @@ with open(args.filename, "r") as f:
|
|||||||
if mode[1] not in wire_xy:
|
if mode[1] not in wire_xy:
|
||||||
wire_xy[mode[1]] = list()
|
wire_xy[mode[1]] = list()
|
||||||
wire_xy[mode[1]].append((int(line[0]), int(line[1])))
|
wire_xy[mode[1]].append((int(line[0]), int(line[1])))
|
||||||
|
if mode[1] not in wire_segments:
|
||||||
|
wire_segments[mode[1]] = set()
|
||||||
|
if ("TILE_WIRE_" + wname[2].upper()) in gfx_wire_ids:
|
||||||
|
wire_segments[mode[1]].add((wname[0], wname[1], gfx_wire_ids["TILE_WIRE_" + wname[2].upper()]))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if mode[0] in ("buffer", "routing"):
|
if mode[0] in ("buffer", "routing"):
|
||||||
@ -1040,7 +1060,7 @@ for t in range(num_tile_types):
|
|||||||
tileinfo.append(ti)
|
tileinfo.append(ti)
|
||||||
|
|
||||||
bba.l("wire_data_%s" % dev_name, "WireInfoPOD")
|
bba.l("wire_data_%s" % dev_name, "WireInfoPOD")
|
||||||
for info in wireinfo:
|
for wire, info in enumerate(wireinfo):
|
||||||
bba.s(info["name"], "name")
|
bba.s(info["name"], "name")
|
||||||
bba.u32(info["num_uphill"], "num_uphill")
|
bba.u32(info["num_uphill"], "num_uphill")
|
||||||
bba.u32(info["num_downhill"], "num_downhill")
|
bba.u32(info["num_downhill"], "num_downhill")
|
||||||
@ -1050,11 +1070,24 @@ for info in wireinfo:
|
|||||||
bba.u32(info["uphill_bel"], "bel_uphill.bel_index")
|
bba.u32(info["uphill_bel"], "bel_uphill.bel_index")
|
||||||
bba.u32(info["uphill_pin"], "bel_uphill.port")
|
bba.u32(info["uphill_pin"], "bel_uphill.port")
|
||||||
bba.r(info["list_bels_downhill"], "bels_downhill")
|
bba.r(info["list_bels_downhill"], "bels_downhill")
|
||||||
|
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.u8(info["x"], "x")
|
bba.u8(info["x"], "x")
|
||||||
bba.u8(info["y"], "y")
|
bba.u8(info["y"], "y")
|
||||||
bba.u8(wiretypes[wire_type(info["name"])], "type")
|
bba.u8(wiretypes[wire_type(info["name"])], "type")
|
||||||
bba.u8(0, "padding")
|
bba.u8(0, "padding")
|
||||||
|
|
||||||
|
for wire in range(num_wires):
|
||||||
|
if len(wire_segments[wire]):
|
||||||
|
bba.l("wire_segments_%d" % wire, "WireSegmentPOD")
|
||||||
|
for seg in sorted(wire_segments[wire]):
|
||||||
|
bba.u8(seg[0], "x")
|
||||||
|
bba.u8(seg[1], "y")
|
||||||
|
bba.u16(seg[2], "index")
|
||||||
|
|
||||||
bba.l("pip_data_%s" % dev_name, "PipInfoPOD")
|
bba.l("pip_data_%s" % dev_name, "PipInfoPOD")
|
||||||
for info in pipinfo:
|
for info in pipinfo:
|
||||||
bba.u32(info["src"], "src")
|
bba.u32(info["src"], "src")
|
||||||
|
@ -21,8 +21,9 @@ if (MSVC)
|
|||||||
set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
|
set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
|
||||||
set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bin)
|
set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bin)
|
||||||
set(DEV_PORTS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/portpins.inc)
|
set(DEV_PORTS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/portpins.inc)
|
||||||
|
set(DEV_GFXH ${CMAKE_CURRENT_SOURCE_DIR}/ice40/gfx.h)
|
||||||
add_custom_command(OUTPUT ${DEV_CC_DB}
|
add_custom_command(OUTPUT ${DEV_CC_DB}
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -b -p ${DEV_PORTS_INC} ${DEV_TXT_DB} > ${DEV_CC_DB}
|
COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -b -p ${DEV_PORTS_INC} -g ${DEV_GFXH} ${DEV_TXT_DB} > ${DEV_CC_DB}
|
||||||
DEPENDS ${DEV_TXT_DB} ${DB_PY}
|
DEPENDS ${DEV_TXT_DB} ${DB_PY}
|
||||||
)
|
)
|
||||||
target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB})
|
target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB})
|
||||||
@ -37,8 +38,9 @@ else()
|
|||||||
set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
|
set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
|
||||||
set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.cc)
|
set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.cc)
|
||||||
set(DEV_PORTS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/portpins.inc)
|
set(DEV_PORTS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/portpins.inc)
|
||||||
|
set(DEV_GFXH ${CMAKE_CURRENT_SOURCE_DIR}/ice40/gfx.h)
|
||||||
add_custom_command(OUTPUT ${DEV_CC_DB}
|
add_custom_command(OUTPUT ${DEV_CC_DB}
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -c -p ${DEV_PORTS_INC} ${DEV_TXT_DB} > ${DEV_CC_DB}.new
|
COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -c -p ${DEV_PORTS_INC} -g ${DEV_GFXH} ${DEV_TXT_DB} > ${DEV_CC_DB}.new
|
||||||
COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB}
|
COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB}
|
||||||
DEPENDS ${DEV_TXT_DB} ${DB_PY}
|
DEPENDS ${DEV_TXT_DB} ${DB_PY}
|
||||||
)
|
)
|
||||||
|
47
ice40/gfx.cc
47
ice40/gfx.cc
@ -21,15 +21,16 @@
|
|||||||
|
|
||||||
NEXTPNR_NAMESPACE_BEGIN
|
NEXTPNR_NAMESPACE_BEGIN
|
||||||
|
|
||||||
void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id, GraphicElement::style_t style)
|
||||||
{
|
{
|
||||||
|
GraphicElement el;
|
||||||
|
el.type = GraphicElement::G_LINE;
|
||||||
|
el.style = style;
|
||||||
|
|
||||||
// Horizontal Span-4 Wires
|
// Horizontal Span-4 Wires
|
||||||
|
|
||||||
if (id >= TILE_WIRE_SP4_H_L_36 && id <= TILE_WIRE_SP4_H_L_47) {
|
if (id >= TILE_WIRE_SP4_H_L_36 && id <= TILE_WIRE_SP4_H_L_47) {
|
||||||
int idx = (id - TILE_WIRE_SP4_H_L_36) + 48;
|
int idx = (id - TILE_WIRE_SP4_H_L_36) + 48;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
|
|
||||||
float y1 = y + 1.0 - (0.03 + 0.0025 * (60 - idx));
|
float y1 = y + 1.0 - (0.03 + 0.0025 * (60 - idx));
|
||||||
|
|
||||||
el.x1 = x + 0.0;
|
el.x1 = x + 0.0;
|
||||||
@ -47,8 +48,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_SP4_H_R_0 && id <= TILE_WIRE_SP4_H_R_47) {
|
if (id >= TILE_WIRE_SP4_H_R_0 && id <= TILE_WIRE_SP4_H_R_47) {
|
||||||
int idx = id - TILE_WIRE_SP4_H_R_0;
|
int idx = id - TILE_WIRE_SP4_H_R_0;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
|
|
||||||
float y1 = y + 1.0 - (0.03 + 0.0025 * (60 - idx));
|
float y1 = y + 1.0 - (0.03 + 0.0025 * (60 - idx));
|
||||||
float y2 = y + 1.0 - (0.03 + 0.0025 * (60 - (idx ^ 1)));
|
float y2 = y + 1.0 - (0.03 + 0.0025 * (60 - (idx ^ 1)));
|
||||||
@ -91,8 +90,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_SP4_V_T_36 && id <= TILE_WIRE_SP4_V_T_47) {
|
if (id >= TILE_WIRE_SP4_V_T_36 && id <= TILE_WIRE_SP4_V_T_47) {
|
||||||
int idx = (id - TILE_WIRE_SP4_V_T_36) + 48;
|
int idx = (id - TILE_WIRE_SP4_V_T_36) + 48;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
|
|
||||||
float x1 = x + 0.03 + 0.0025 * (60 - idx);
|
float x1 = x + 0.03 + 0.0025 * (60 - idx);
|
||||||
|
|
||||||
@ -111,8 +108,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_SP4_V_B_0 && id <= TILE_WIRE_SP4_V_B_47) {
|
if (id >= TILE_WIRE_SP4_V_B_0 && id <= TILE_WIRE_SP4_V_B_47) {
|
||||||
int idx = id - TILE_WIRE_SP4_V_B_0;
|
int idx = id - TILE_WIRE_SP4_V_B_0;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
|
|
||||||
float x1 = x + 0.03 + 0.0025 * (60 - (idx ^ 1));
|
float x1 = x + 0.03 + 0.0025 * (60 - (idx ^ 1));
|
||||||
float x2 = x + 0.03 + 0.0025 * (60 - idx);
|
float x2 = x + 0.03 + 0.0025 * (60 - idx);
|
||||||
@ -161,8 +156,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_SP12_H_L_22 && id <= TILE_WIRE_SP12_H_L_23) {
|
if (id >= TILE_WIRE_SP12_H_L_22 && id <= TILE_WIRE_SP12_H_L_23) {
|
||||||
int idx = (id - TILE_WIRE_SP12_H_L_22) + 24;
|
int idx = (id - TILE_WIRE_SP12_H_L_22) + 24;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
|
|
||||||
float y1 = y + 1.0 - (0.03 + 0.0025 * (90 - idx));
|
float y1 = y + 1.0 - (0.03 + 0.0025 * (90 - idx));
|
||||||
|
|
||||||
@ -181,8 +174,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_SP12_H_R_0 && id <= TILE_WIRE_SP12_H_R_23) {
|
if (id >= TILE_WIRE_SP12_H_R_0 && id <= TILE_WIRE_SP12_H_R_23) {
|
||||||
int idx = id - TILE_WIRE_SP12_H_R_0;
|
int idx = id - TILE_WIRE_SP12_H_R_0;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
|
|
||||||
float y1 = y + 1.0 - (0.03 + 0.0025 * (90 - (idx ^ 1)));
|
float y1 = y + 1.0 - (0.03 + 0.0025 * (90 - (idx ^ 1)));
|
||||||
float y2 = y + 1.0 - (0.03 + 0.0025 * (90 - idx));
|
float y2 = y + 1.0 - (0.03 + 0.0025 * (90 - idx));
|
||||||
@ -225,8 +216,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_SP4_R_V_B_0 && id <= TILE_WIRE_SP4_R_V_B_47) {
|
if (id >= TILE_WIRE_SP4_R_V_B_0 && id <= TILE_WIRE_SP4_R_V_B_47) {
|
||||||
int idx = id - TILE_WIRE_SP4_R_V_B_0;
|
int idx = id - TILE_WIRE_SP4_R_V_B_0;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
|
|
||||||
float y1 = y + 1.0 - (0.03 + 0.0025 * (145 - idx));
|
float y1 = y + 1.0 - (0.03 + 0.0025 * (145 - idx));
|
||||||
|
|
||||||
@ -241,8 +230,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_SP12_V_T_22 && id <= TILE_WIRE_SP12_V_T_23) {
|
if (id >= TILE_WIRE_SP12_V_T_22 && id <= TILE_WIRE_SP12_V_T_23) {
|
||||||
int idx = (id - TILE_WIRE_SP12_V_T_22) + 24;
|
int idx = (id - TILE_WIRE_SP12_V_T_22) + 24;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
|
|
||||||
float x1 = x + 0.03 + 0.0025 * (90 - idx);
|
float x1 = x + 0.03 + 0.0025 * (90 - idx);
|
||||||
|
|
||||||
@ -261,8 +248,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_SP12_V_B_0 && id <= TILE_WIRE_SP12_V_B_23) {
|
if (id >= TILE_WIRE_SP12_V_B_0 && id <= TILE_WIRE_SP12_V_B_23) {
|
||||||
int idx = id - TILE_WIRE_SP12_V_B_0;
|
int idx = id - TILE_WIRE_SP12_V_B_0;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
|
|
||||||
float x1 = x + 0.03 + 0.0025 * (90 - idx);
|
float x1 = x + 0.03 + 0.0025 * (90 - idx);
|
||||||
float x2 = x + 0.03 + 0.0025 * (90 - (idx ^ 1));
|
float x2 = x + 0.03 + 0.0025 * (90 - (idx ^ 1));
|
||||||
@ -305,8 +290,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_GLB2LOCAL_0 && id <= TILE_WIRE_GLB2LOCAL_3) {
|
if (id >= TILE_WIRE_GLB2LOCAL_0 && id <= TILE_WIRE_GLB2LOCAL_3) {
|
||||||
int idx = id - TILE_WIRE_GLB2LOCAL_0;
|
int idx = id - TILE_WIRE_GLB2LOCAL_0;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
el.x1 = x + main_swbox_x1 + 0.005 * (idx + 5);
|
el.x1 = x + main_swbox_x1 + 0.005 * (idx + 5);
|
||||||
el.x2 = el.x1;
|
el.x2 = el.x1;
|
||||||
el.y1 = y + main_swbox_y1;
|
el.y1 = y + main_swbox_y1;
|
||||||
@ -318,8 +301,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_GLB_NETWK_0 && id <= TILE_WIRE_GLB_NETWK_7) {
|
if (id >= TILE_WIRE_GLB_NETWK_0 && id <= TILE_WIRE_GLB_NETWK_7) {
|
||||||
int idx = id - TILE_WIRE_GLB_NETWK_0;
|
int idx = id - TILE_WIRE_GLB_NETWK_0;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
el.x1 = x + main_swbox_x1 - 0.05;
|
el.x1 = x + main_swbox_x1 - 0.05;
|
||||||
el.x2 = x + main_swbox_x1;
|
el.x2 = x + main_swbox_x1;
|
||||||
el.y1 = y + main_swbox_y1 + 0.005 * (13 - idx);
|
el.y1 = y + main_swbox_y1 + 0.005 * (13 - idx);
|
||||||
@ -331,8 +312,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_NEIGH_OP_BNL_0 && id <= TILE_WIRE_NEIGH_OP_TOP_7) {
|
if (id >= TILE_WIRE_NEIGH_OP_BNL_0 && id <= TILE_WIRE_NEIGH_OP_TOP_7) {
|
||||||
int idx = id - TILE_WIRE_NEIGH_OP_BNL_0;
|
int idx = id - TILE_WIRE_NEIGH_OP_BNL_0;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
el.y1 = y + main_swbox_y2 - (0.0025 * (idx + 10) + 0.01 * (idx / 8));
|
el.y1 = y + main_swbox_y2 - (0.0025 * (idx + 10) + 0.01 * (idx / 8));
|
||||||
el.y2 = el.y1;
|
el.y2 = el.y1;
|
||||||
el.x1 = x + main_swbox_x1 - 0.05;
|
el.x1 = x + main_swbox_x1 - 0.05;
|
||||||
@ -344,8 +323,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_LOCAL_G0_0 && id <= TILE_WIRE_LOCAL_G3_7) {
|
if (id >= TILE_WIRE_LOCAL_G0_0 && id <= TILE_WIRE_LOCAL_G3_7) {
|
||||||
int idx = id - TILE_WIRE_LOCAL_G0_0;
|
int idx = id - TILE_WIRE_LOCAL_G0_0;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
el.x1 = x + main_swbox_x2;
|
el.x1 = x + main_swbox_x2;
|
||||||
el.x2 = x + local_swbox_x1;
|
el.x2 = x + local_swbox_x1;
|
||||||
float yoff = y + (local_swbox_y1 + local_swbox_y2) / 2 - 0.005 * 16 - 0.075;
|
float yoff = y + (local_swbox_y1 + local_swbox_y2) / 2 - 0.005 * 16 - 0.075;
|
||||||
@ -360,8 +337,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
int idx = id - TILE_WIRE_LUTFF_0_IN_0;
|
int idx = id - TILE_WIRE_LUTFF_0_IN_0;
|
||||||
int z = idx / 4;
|
int z = idx / 4;
|
||||||
int input = idx % 4;
|
int input = idx % 4;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
el.x1 = x + local_swbox_x2;
|
el.x1 = x + local_swbox_x2;
|
||||||
el.x2 = x + logic_cell_x1;
|
el.x2 = x + logic_cell_x1;
|
||||||
el.y1 = y + (logic_cell_y1 + logic_cell_y2) / 2 - 0.0075 + (0.005 * input) + z * logic_cell_pitch;
|
el.y1 = y + (logic_cell_y1 + logic_cell_y2) / 2 - 0.0075 + (0.005 * input) + z * logic_cell_pitch;
|
||||||
@ -376,8 +351,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
float y1 = y + 1.0 - (0.03 + 0.0025 * (152 + idx));
|
float y1 = y + 1.0 - (0.03 + 0.0025 * (152 + idx));
|
||||||
|
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
el.y1 = y1;
|
el.y1 = y1;
|
||||||
el.y2 = y1;
|
el.y2 = y1;
|
||||||
el.x1 = x + main_swbox_x2;
|
el.x1 = x + main_swbox_x2;
|
||||||
@ -398,8 +371,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_LUTFF_GLOBAL_CEN && id <= TILE_WIRE_LUTFF_GLOBAL_S_R) {
|
if (id >= TILE_WIRE_LUTFF_GLOBAL_CEN && id <= TILE_WIRE_LUTFF_GLOBAL_S_R) {
|
||||||
int idx = id - TILE_WIRE_LUTFF_GLOBAL_CEN;
|
int idx = id - TILE_WIRE_LUTFF_GLOBAL_CEN;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
|
|
||||||
el.x1 = x + main_swbox_x2 - 0.005 * (idx + 5);
|
el.x1 = x + main_swbox_x2 - 0.005 * (idx + 5);
|
||||||
el.x2 = el.x1;
|
el.x2 = el.x1;
|
||||||
@ -426,8 +397,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_LUTFF_0_LOUT && id <= TILE_WIRE_LUTFF_6_LOUT) {
|
if (id >= TILE_WIRE_LUTFF_0_LOUT && id <= TILE_WIRE_LUTFF_6_LOUT) {
|
||||||
int idx = id - TILE_WIRE_LUTFF_0_LOUT;
|
int idx = id - TILE_WIRE_LUTFF_0_LOUT;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
el.x1 = x + logic_cell_x1 + 0.005 * 5;
|
el.x1 = x + logic_cell_x1 + 0.005 * 5;
|
||||||
el.x2 = el.x1;
|
el.x2 = el.x1;
|
||||||
el.y1 = y + logic_cell_y2 + idx * logic_cell_pitch;
|
el.y1 = y + logic_cell_y2 + idx * logic_cell_pitch;
|
||||||
@ -439,8 +408,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
|
|
||||||
if (id >= TILE_WIRE_LUTFF_0_COUT && id <= TILE_WIRE_LUTFF_7_COUT) {
|
if (id >= TILE_WIRE_LUTFF_0_COUT && id <= TILE_WIRE_LUTFF_7_COUT) {
|
||||||
int idx = id - TILE_WIRE_LUTFF_0_COUT;
|
int idx = id - TILE_WIRE_LUTFF_0_COUT;
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
el.x1 = x + logic_cell_x1 + 0.005 * 3;
|
el.x1 = x + logic_cell_x1 + 0.005 * 3;
|
||||||
el.x2 = el.x1;
|
el.x2 = el.x1;
|
||||||
el.y1 = y + logic_cell_y2 + idx * logic_cell_pitch;
|
el.y1 = y + logic_cell_y2 + idx * logic_cell_pitch;
|
||||||
@ -449,8 +416,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (id == TILE_WIRE_CARRY_IN) {
|
if (id == TILE_WIRE_CARRY_IN) {
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
el.x1 = x + logic_cell_x1 + 0.005 * 3;
|
el.x1 = x + logic_cell_x1 + 0.005 * 3;
|
||||||
el.x2 = el.x1;
|
el.x2 = el.x1;
|
||||||
el.y1 = y;
|
el.y1 = y;
|
||||||
@ -459,8 +424,6 @@ void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (id == TILE_WIRE_CARRY_IN_MUX) {
|
if (id == TILE_WIRE_CARRY_IN_MUX) {
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::G_LINE;
|
|
||||||
el.x1 = x + logic_cell_x1 + 0.005 * 3;
|
el.x1 = x + logic_cell_x1 + 0.005 * 3;
|
||||||
el.x2 = el.x1;
|
el.x2 = el.x1;
|
||||||
el.y1 = y + 0.02;
|
el.y1 = y + 0.02;
|
||||||
|
@ -466,7 +466,7 @@ enum GfxTileWireId {
|
|||||||
TILE_WIRE_SP12_H_L_23
|
TILE_WIRE_SP12_H_L_23
|
||||||
};
|
};
|
||||||
|
|
||||||
void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id);
|
void gfxTileWire(std::vector<GraphicElement> &g, int x, int y, GfxTileWireId id, GraphicElement::style_t style);
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user