From a65f0e57b9affbcb2a5387347457d78d995b7d35 Mon Sep 17 00:00:00 2001 From: YRabbit Date: Fri, 2 Jul 2021 14:00:20 +1000 Subject: Add IO_PORT parsing Signed-off-by: YRabbit --- gowin/arch.cc | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) (limited to 'gowin') 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]); + } } } -- cgit v1.2.3 From 9443267717cf0ea2278f800127db7fd9e962650f Mon Sep 17 00:00:00 2001 From: YRabbit Date: Fri, 2 Jul 2021 14:58:17 +1000 Subject: Syntax Signed-off-by: YRabbit --- gowin/arch.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'gowin') diff --git a/gowin/arch.cc b/gowin/arch.cc index 63277438..8dc5657c 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -487,13 +487,13 @@ void Arch::read_cst(std::istream &in) std::regex portre = std::regex("IO_PORT +\"([^\"]+)\" +([^ =;]+)=([^ =;]+) *;.*"); std::smatch match; std::string line; - boolean io_loc; + 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()) == 0) { + if (line.empty() == 0) { continue; } else { if (!std::regex_match(line, match, portre)) { @@ -525,7 +525,7 @@ void Arch::read_cst(std::istream &in) 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]); + log_info("XXX port attr found %s=%s\n", match.str(2).c_str(), match.str(3).c_str()); } } } -- cgit v1.2.3 From 5c5982c50a63c83dba2f68e9d5dcc2bb67cc4c67 Mon Sep 17 00:00:00 2001 From: YRabbit Date: Sat, 3 Jul 2021 08:23:25 +1000 Subject: Fix parser. Comments and IO_PORT Signed-off-by: YRabbit --- gowin/arch.cc | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) (limited to 'gowin') diff --git a/gowin/arch.cc b/gowin/arch.cc index 8dc5657c..b4c8c96f 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -492,19 +492,17 @@ void Arch::read_cst(std::istream &in) std::getline(in, line); io_loc = true; if (!std::regex_match(line, match, iobre)) { - // empty line or comment - if (line.empty() == 0) { - continue; - } else { - if (!std::regex_match(line, match, portre)) { - io_loc = false; - } else if (line.rfind("//", 0) == 0) { + 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; + continue; + } + } + + //std::cout << match[1] << " " << match[2] << std::endl; IdString net = id(match[1]); auto it = cells.find(net); -- cgit v1.2.3 From baa68fa4c13b2c383f976eb22d6bfddbcb598d62 Mon Sep 17 00:00:00 2001 From: YRabbit Date: Mon, 5 Jul 2021 08:31:01 +1000 Subject: Parser Signed-off-by: YRabbit --- gowin/arch.cc | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'gowin') diff --git a/gowin/arch.cc b/gowin/arch.cc index b4c8c96f..db8bddaf 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -18,6 +18,7 @@ * */ +#include #include #include #include @@ -524,6 +525,14 @@ void Arch::read_cst(std::istream &in) } 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()); + std::string attr = match[2]; + std::string value = match[3]; + boost::algorithm::to_upper(attr); + boost::algorithm::to_upper(value); + it->second->attrs[id(attr)] = value; + //for (auto at : it->second->attrs) { + // std::cout << at.first.str(this) << "=" << at.second.as_string() << std::endl; + //} } } } -- cgit v1.2.3 From fd7734f0006d6522dea1ea4ea29750c8bafc77c4 Mon Sep 17 00:00:00 2001 From: YRabbit Date: Wed, 7 Jul 2021 08:36:05 +1000 Subject: Wip parser Signed-off-by: YRabbit --- gowin/arch.cc | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) (limited to 'gowin') diff --git a/gowin/arch.cc b/gowin/arch.cc index db8bddaf..7fda387a 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -485,7 +485,7 @@ DelayQuad Arch::getWireTypeDelay(IdString wire) void Arch::read_cst(std::istream &in) { std::regex iobre = std::regex("IO_LOC +\"([^\"]+)\" +([^ ;]+) *;.*"); - std::regex portre = std::regex("IO_PORT +\"([^\"]+)\" +([^ =;]+)=([^ =;]+) *;.*"); + std::regex portre = std::regex("IO_PORT +\"([^\"]+)\" +([^ =;]+=[^ =;]+) *;.*"); std::smatch match; std::string line; bool io_loc; @@ -503,8 +503,6 @@ void Arch::read_cst(std::istream &in) } } - //std::cout << match[1] << " " << match[2] << std::endl; - IdString net = id(match[1]); auto it = cells.find(net); if (it == cells.end()) { @@ -516,23 +514,13 @@ void Arch::read_cst(std::istream &in) 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()); - std::string attr = match[2]; - std::string value = match[3]; + std::string attr = "&"; + attr += match[2]; boost::algorithm::to_upper(attr); - boost::algorithm::to_upper(value); - it->second->attrs[id(attr)] = value; - //for (auto at : it->second->attrs) { - // std::cout << at.first.str(this) << "=" << at.second.as_string() << std::endl; - //} + it->second->attrs[id(attr)] = 0; } } } -- cgit v1.2.3 From 5d8b27710d333ff969556edeb55ba3ab6bbfa619 Mon Sep 17 00:00:00 2001 From: YRabbit Date: Wed, 7 Jul 2021 22:02:43 +1000 Subject: Fix boolean value. Signed-off-by: YRabbit --- gowin/arch.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gowin') diff --git a/gowin/arch.cc b/gowin/arch.cc index 7fda387a..f47d00f7 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -520,7 +520,7 @@ void Arch::read_cst(std::istream &in) std::string attr = "&"; attr += match[2]; boost::algorithm::to_upper(attr); - it->second->attrs[id(attr)] = 0; + it->second->attrs[id(attr)] = 1; } } } -- cgit v1.2.3 From d613626ab998fd24d467101253fcd4e563669078 Mon Sep 17 00:00:00 2001 From: YRabbit Date: Wed, 7 Jul 2021 22:53:49 +1000 Subject: Fix formating Signed-off-by: YRabbit --- gowin/arch.cc | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) (limited to 'gowin') diff --git a/gowin/arch.cc b/gowin/arch.cc index f47d00f7..438c6ca9 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -488,20 +488,20 @@ void Arch::read_cst(std::istream &in) std::regex portre = std::regex("IO_PORT +\"([^\"]+)\" +([^ =;]+=[^ =;]+) *;.*"); std::smatch match; std::string line; - bool io_loc; + bool io_loc; while (!in.eof()) { std::getline(in, line); - io_loc = true; + io_loc = true; if (!std::regex_match(line, match, iobre)) { - 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; - } - } + 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; + } + } IdString net = id(match[1]); auto it = cells.find(net); @@ -509,19 +509,19 @@ void Arch::read_cst(std::istream &in) log_info("Cell %s not found\n", net.c_str(this)); continue; } - 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)); - std::string bel = IdString(belname->src_id).str(this); - it->second->attrs[IdString(ID_BEL)] = bel; - } else { // IO_PORT attr=value - std::string attr = "&"; - attr += match[2]; - boost::algorithm::to_upper(attr); - it->second->attrs[id(attr)] = 1; - } + 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)); + std::string bel = IdString(belname->src_id).str(this); + it->second->attrs[IdString(ID_BEL)] = bel; + } else { // IO_PORT attr=value + std::string attr = "&"; + attr += match[2]; + boost::algorithm::to_upper(attr); + it->second->attrs[id(attr)] = 0; + } } } -- cgit v1.2.3 From 881fd97c5aaa8c8898bd6ffa7d221bca5317a456 Mon Sep 17 00:00:00 2001 From: YRabbit Date: Thu, 8 Jul 2021 07:09:30 +1000 Subject: Fix the boolean. Signed-off-by: YRabbit --- gowin/arch.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gowin') diff --git a/gowin/arch.cc b/gowin/arch.cc index 438c6ca9..e4dce329 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -520,7 +520,7 @@ void Arch::read_cst(std::istream &in) std::string attr = "&"; attr += match[2]; boost::algorithm::to_upper(attr); - it->second->attrs[id(attr)] = 0; + it->second->attrs[id(attr)] = 1; } } } -- cgit v1.2.3