aboutsummaryrefslogtreecommitdiffstats
path: root/gowin
diff options
context:
space:
mode:
authorYRabbit <rabbit@yrabbit.cyou>2021-07-02 14:00:20 +1000
committerYRabbit <rabbit@yrabbit.cyou>2021-07-02 14:00:20 +1000
commita65f0e57b9affbcb2a5387347457d78d995b7d35 (patch)
tree2436a6e447f90e4a439528c520dda3f4f5ea1748 /gowin
parentfe38e70dc1cd84a60e2fe05f7153c8deed1c16e9 (diff)
downloadnextpnr-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.cc41
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]);
+ }
}
}