diff options
-rw-r--r-- | gowin/arch.cc | 29 | ||||
-rw-r--r-- | gowin/gfx.cc | 8 |
2 files changed, 21 insertions, 16 deletions
diff --git a/gowin/arch.cc b/gowin/arch.cc index c55d4a71..07938326 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -671,10 +671,13 @@ static Loc getLoc(std::smatch match, int maxX, int maxY) void Arch::read_cst(std::istream &in) { - std::regex iobre = std::regex("IO_LOC +\"([^\"]+)\" +([^ ;]+) *;.*"); + // If two locations are specified separated by commas (for differential I/O buffers), + // only the first location is actually recognized and used. + // And pin A will be Positive and pin B will be Negative in any case. + std::regex iobre = std::regex("IO_LOC +\"([^\"]+)\" +([^ ,;]+)(, *[^ ;]+)? *;.*"); std::regex portre = std::regex("IO_PORT +\"([^\"]+)\" +([^;]+;).*"); std::regex port_attrre = std::regex("([^ =;]+=[^ =;]+) *([^;]*;)"); - std::regex iobelre = std::regex("IO([TRBL])([0-9]+)([A-Z])"); + std::regex iobelre = std::regex("IO([TRBL])([0-9]+)\\[?([A-Z])\\]?"); std::regex inslocre = std::regex("INS_LOC +\"([^\"]+)\" +R([0-9]+)C([0-9]+)\\[([0-9])\\]\\[([AB])\\] *;.*"); std::smatch match, match_attr, match_pinloc; std::string line, pinline; @@ -718,17 +721,19 @@ void Arch::read_cst(std::istream &in) if (belname != nullptr) { std::string bel = IdString(belname->src_id).str(this); it->second->setAttr(IdString(ID_BEL), bel); - } else if (std::regex_match(pinline, match_pinloc, iobelre)) { - // may be it's IOx#[AB] style? - Loc loc = getLoc(match_pinloc, getGridDimX(), getGridDimY()); - BelId bel = getBelByLocation(loc); - if (bel == BelId()) { - log_error("Pin %s not found\n", pinline.c_str()); - } - std::string belname = getCtx()->nameOfBel(bel); - it->second->setAttr(IdString(ID_BEL), belname); } else { - log_error("Pin %s not found\n", pinname.c_str(this)); + if (std::regex_match(pinline, match_pinloc, iobelre)) { + // may be it's IOx#[AB] style? + Loc loc = getLoc(match_pinloc, getGridDimX(), getGridDimY()); + BelId bel = getBelByLocation(loc); + if (bel == BelId()) { + log_error("Pin %s not found (TRBL style). \n", pinline.c_str()); + } + std::string belname = getCtx()->nameOfBel(bel); + it->second->setAttr(IdString(ID_BEL), belname); + } else { + log_error("Pin %s not found (pin# style)\n", pinname.c_str(this)); + } } } break; case insloc: { // INS_LOC diff --git a/gowin/gfx.cc b/gowin/gfx.cc index a851f53a..daae5c71 100644 --- a/gowin/gfx.cc +++ b/gowin/gfx.cc @@ -5260,7 +5260,8 @@ void gfxSetWireDefaultDecal(Arch *arch, WireInfo &wire) snprintf(buf, sizeof(buf), "%s_active", wire.name.c_str(arch)); active_id = arch->id(buf); active.decal = active_id; - inactive_id = IdString(); + snprintf(buf, sizeof(buf), "%s_inactive", wire.name.c_str(arch)); + inactive_id = arch->id(buf); inactive.decal = inactive_id; active.x = inactive.x = 0; active.y = inactive.y = 0; @@ -5301,9 +5302,8 @@ void gfxSetWireDefaultDecal(Arch *arch, WireInfo &wire) snprintf(buf, sizeof(buf), "%s_active", wire.name.c_str(arch)); active_id = arch->id(buf); active.decal = active_id; - // snprintf(buf, sizeof(buf), "%s_inactive", wire.name.c_str(arch)); - // inactive_id = arch->id(buf); - inactive_id = IdString(); + snprintf(buf, sizeof(buf), "%s_inactive", wire.name.c_str(arch)); + inactive_id = arch->id(buf); inactive.decal = inactive_id; active.x = inactive.x = 0; active.y = inactive.y = 0; |