diff options
| -rw-r--r-- | gowin/arch.cc | 51 | 
1 files changed, 31 insertions, 20 deletions
diff --git a/gowin/arch.cc b/gowin/arch.cc index e8a14522..b4c8c96f 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -483,37 +483,48 @@ 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; +	bool 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) { -                continue; -            } else { -                log_warning("Invalid constraint: %s\n", line.c_str()); -                continue; -            } -        } -        // std::cout << match[1] << " " << match[2] << std::endl; +			if (std::regex_match(line, match, portre)) { +				io_loc = false; +			} else { +				if ( (!line.empty()) &&  (line.rfind("//", 0) == std::string::npos)) { +					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.str(2).c_str(), match.str(3).c_str()); +		}      }  }  | 
