aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2018-06-12 15:50:33 +0200
committerClifford Wolf <clifford@clifford.at>2018-06-12 15:50:33 +0200
commit9c275d0a653b11f2a494321be2ab66678117db2d (patch)
treecccabe4cfbb191697527e915175b70105ac470f6
parent7e879953d62d486eff62a27fe94b7b5894a251b8 (diff)
downloadnextpnr-9c275d0a653b11f2a494321be2ab66678117db2d.tar.gz
nextpnr-9c275d0a653b11f2a494321be2ab66678117db2d.tar.bz2
nextpnr-9c275d0a653b11f2a494321be2ab66678117db2d.zip
Add fast IdString <-> PortPin conversion
Signed-off-by: Clifford Wolf <clifford@clifford.at>
-rw-r--r--common/nextpnr.cc10
-rw-r--r--common/nextpnr.h4
-rw-r--r--dummy/chip.cc3
-rw-r--r--ice40/chip.cc26
-rw-r--r--ice40/chip.h1
5 files changed, 28 insertions, 16 deletions
diff --git a/common/nextpnr.cc b/common/nextpnr.cc
index ce2cef63..d2b887de 100644
--- a/common/nextpnr.cc
+++ b/common/nextpnr.cc
@@ -28,7 +28,15 @@ void IdString::initialize()
{
database_str_to_idx = new std::unordered_map<std::string, int>;
database_idx_to_str = new std::vector<const std::string*>;
- auto insert_rc = database_str_to_idx->insert({std::string(), 0});
+ initialize_add("", 0);
+ initialize_chip();
+}
+
+void IdString::initialize_add(const char *s, int idx)
+{
+ assert(database_str_to_idx->count(s) == 0);
+ assert(database_idx_to_str->size() == idx);
+ auto insert_rc = database_str_to_idx->insert({s, idx});
database_idx_to_str->push_back(&insert_rc.first->first);
}
diff --git a/common/nextpnr.h b/common/nextpnr.h
index dad6239f..fc14299d 100644
--- a/common/nextpnr.h
+++ b/common/nextpnr.h
@@ -48,7 +48,9 @@ struct IdString
static std::unordered_map<std::string, int> *database_str_to_idx;
static std::vector<const std::string*> *database_idx_to_str;
- void initialize();
+ static void initialize();
+ static void initialize_chip();
+ static void initialize_add(const char *s, int idx);
IdString() {}
diff --git a/dummy/chip.cc b/dummy/chip.cc
index 23aa0e9d..ae962508 100644
--- a/dummy/chip.cc
+++ b/dummy/chip.cc
@@ -24,6 +24,9 @@ NEXTPNR_NAMESPACE_BEGIN
Chip::Chip(ChipArgs) {}
std::string Chip::getChipName() { return "Dummy"; }
+
+void IdString::initialize_chip() {}
+
// ---------------------------------------------------------------
BelId Chip::getBelByName(IdString name) const { return BelId(); }
diff --git a/ice40/chip.cc b/ice40/chip.cc
index 88fcc512..918a7fb4 100644
--- a/ice40/chip.cc
+++ b/ice40/chip.cc
@@ -52,27 +52,25 @@ BelType belTypeFromId(IdString id)
// -----------------------------------------------------------------------
-IdString portPinToId(PortPin type)
+void IdString::initialize_chip()
{
-#define X(t) \
- if (type == PIN_##t) \
- return #t;
-
+#define X(t) initialize_add(#t, PIN_##t);
#include "portpins.inc"
-
#undef X
- return IdString();
}
-PortPin portPinFromId(IdString id)
+IdString portPinToId(PortPin type)
{
-#define X(t) \
- if (id == #t) \
- return PIN_##t;
-
-#include "portpins.inc"
+ IdString ret;
+ if (type > 0 && type < PIN_MAXIDX)
+ ret.index = type;
+ return ret;
+}
-#undef X
+PortPin portPinFromId(IdString id)
+{
+ if (id.index > 0 && id.index < PIN_MAXIDX)
+ return PortPin(id.index);
return PIN_NONE;
}
diff --git a/ice40/chip.h b/ice40/chip.h
index 73e8d33b..f8946610 100644
--- a/ice40/chip.h
+++ b/ice40/chip.h
@@ -62,6 +62,7 @@ enum PortPin
#define X(t) PIN_##t,
#include "portpins.inc"
#undef X
+ PIN_MAXIDX
};
IdString portPinToId(PortPin type);