diff options
author | YRabbit <rabbit@yrabbit.cyou> | 2021-07-02 14:00:20 +1000 |
---|---|---|
committer | YRabbit <rabbit@yrabbit.cyou> | 2021-07-02 14:00:20 +1000 |
commit | a65f0e57b9affbcb2a5387347457d78d995b7d35 (patch) | |
tree | 2436a6e447f90e4a439528c520dda3f4f5ea1748 /gowin | |
parent | fe38e70dc1cd84a60e2fe05f7153c8deed1c16e9 (diff) | |
download | nextpnr-a65f0e57b9affbcb2a5387347457d78d995b7d35.tar.gz nextpnr-a65f0e57b9affbcb2a5387347457d78d995b7d35.tar.bz2 nextpnr-a65f0e57b9affbcb2a5387347457d78d995b7d35.zip |
Add IO_PORT parsing
Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
Diffstat (limited to 'gowin')
-rw-r--r-- | gowin/arch.cc | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/gowin/arch.cc b/gowin/arch.cc index e8a14522..63277438 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -483,37 +483,50 @@ DelayQuad Arch::getWireTypeDelay(IdString wire) void Arch::read_cst(std::istream &in) { - std::regex iobre = std::regex("IO_LOC +\"([^\"]+)\" +([^ ;]+);"); + std::regex iobre = std::regex("IO_LOC +\"([^\"]+)\" +([^ ;]+) *;.*"); + std::regex portre = std::regex("IO_PORT +\"([^\"]+)\" +([^ =;]+)=([^ =;]+) *;.*"); std::smatch match; std::string line; + boolean io_loc; while (!in.eof()) { std::getline(in, line); + io_loc = true; if (!std::regex_match(line, match, iobre)) { // empty line or comment - if (line.empty() || line.rfind("//", 0) == 0) { + if (line.empty()) == 0) { continue; } else { - log_warning("Invalid constraint: %s\n", line.c_str()); - continue; + if (!std::regex_match(line, match, portre)) { + io_loc = false; + } else if (line.rfind("//", 0) == 0) { + log_warning("Invalid constraint: %s\n", line.c_str()); + continue; + } } } // std::cout << match[1] << " " << match[2] << std::endl; + IdString net = id(match[1]); - IdString pinname = id(match[2]); - const PairPOD *belname = pairLookup(package->pins.get(), package->num_pins, pinname.index); - if (belname == nullptr) - log_error("Pin %s not found\n", pinname.c_str(this)); - // BelId bel = getBelByName(belname->src_id); - // for (auto cell : sorted(cells)) { - // std::cout << cell.first.str(this) << std::endl; - // } auto it = cells.find(net); if (it == cells.end()) { log_info("Cell %s not found\n", net.c_str(this)); continue; } - std::string bel = IdString(belname->src_id).str(this); - it->second->attrs[IdString(ID_BEL)] = bel; + if (io_loc) { // IO_LOC name pin + IdString pinname = id(match[2]); + const PairPOD *belname = pairLookup(package->pins.get(), package->num_pins, pinname.index); + if (belname == nullptr) + log_error("Pin %s not found\n", pinname.c_str(this)); + // BelId bel = getBelByName(belname->src_id); + // for (auto cell : sorted(cells)) { + // std::cout << cell.first.str(this) << std::endl; + // } + std::string bel = IdString(belname->src_id).str(this); + it->second->attrs[IdString(ID_BEL)] = bel; + } else { // IO_PORT attr=value + // XXX + log_info("XXX port attr found %s=%s\n", match[2], match[3]); + } } } |