aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorgatecat <gatecat@ds0.me>2021-02-26 10:07:00 +0000
committergatecat <gatecat@ds0.me>2021-02-26 10:07:00 +0000
commitb64f45a8baf8d22476737db0130190abb87f9f1e (patch)
tree6e5b9771269cbb5f276456192e9de1bd23485ffb /common
parent89928a0e6baf8b4ff39318c3655c7bd05df07057 (diff)
downloadnextpnr-b64f45a8baf8d22476737db0130190abb87f9f1e.tar.gz
nextpnr-b64f45a8baf8d22476737db0130190abb87f9f1e.tar.bz2
nextpnr-b64f45a8baf8d22476737db0130190abb87f9f1e.zip
Remove unused advanced timing constraint API
This API was simply an attractive nuisance as no code was ever developed to actually process timing constraints (other than clock constraints which use a different API). While I do want to consider basic false path support, among other things, in the near future; I plan for this to use a new API that doesn't add complexity to the BaseCtx/Context monstrosity and that is easier to use on the timing analysis side. Signed-off-by: gatecat <gatecat@ds0.me>
Diffstat (limited to 'common')
-rw-r--r--common/nextpnr.cc101
-rw-r--r--common/nextpnr.h86
2 files changed, 0 insertions, 187 deletions
diff --git a/common/nextpnr.cc b/common/nextpnr.cc
index dd1ebc59..f05f4a55 100644
--- a/common/nextpnr.cc
+++ b/common/nextpnr.cc
@@ -104,13 +104,6 @@ std::string IdStringList::str(const Context *ctx) const
return s;
}
-TimingConstrObjectId BaseCtx::timingWildcardObject()
-{
- TimingConstrObjectId id;
- id.index = 0;
- return id;
-}
-
std::string &StrRingBuffer::next()
{
std::string &s = buffer.at(index++);
@@ -119,76 +112,6 @@ std::string &StrRingBuffer::next()
return s;
}
-TimingConstrObjectId BaseCtx::timingClockDomainObject(NetInfo *clockDomain)
-{
- NPNR_ASSERT(clockDomain->clkconstr != nullptr);
- if (clockDomain->clkconstr->domain_tmg_id != TimingConstrObjectId()) {
- return clockDomain->clkconstr->domain_tmg_id;
- } else {
- TimingConstraintObject obj;
- TimingConstrObjectId id;
- id.index = int(constraintObjects.size());
- obj.id = id;
- obj.type = TimingConstraintObject::CLOCK_DOMAIN;
- obj.entity = clockDomain->name;
- clockDomain->clkconstr->domain_tmg_id = id;
- constraintObjects.push_back(obj);
- return id;
- }
-}
-
-TimingConstrObjectId BaseCtx::timingNetObject(NetInfo *net)
-{
- if (net->tmg_id != TimingConstrObjectId()) {
- return net->tmg_id;
- } else {
- TimingConstraintObject obj;
- TimingConstrObjectId id;
- id.index = int(constraintObjects.size());
- obj.id = id;
- obj.type = TimingConstraintObject::NET;
- obj.entity = net->name;
- constraintObjects.push_back(obj);
- net->tmg_id = id;
- return id;
- }
-}
-
-TimingConstrObjectId BaseCtx::timingCellObject(CellInfo *cell)
-{
- if (cell->tmg_id != TimingConstrObjectId()) {
- return cell->tmg_id;
- } else {
- TimingConstraintObject obj;
- TimingConstrObjectId id;
- id.index = int(constraintObjects.size());
- obj.id = id;
- obj.type = TimingConstraintObject::CELL;
- obj.entity = cell->name;
- constraintObjects.push_back(obj);
- cell->tmg_id = id;
- return id;
- }
-}
-
-TimingConstrObjectId BaseCtx::timingPortObject(CellInfo *cell, IdString port)
-{
- if (cell->ports.at(port).tmg_id != TimingConstrObjectId()) {
- return cell->ports.at(port).tmg_id;
- } else {
- TimingConstraintObject obj;
- TimingConstrObjectId id;
- id.index = int(constraintObjects.size());
- obj.id = id;
- obj.type = TimingConstraintObject::CELL_PORT;
- obj.entity = cell->name;
- obj.port = port;
- constraintObjects.push_back(obj);
- cell->ports.at(port).tmg_id = id;
- return id;
- }
-}
-
Property::Property() : is_string(false), str(""), intval(0) {}
Property::Property(int64_t intval, int width) : is_string(false), intval(intval)
@@ -286,30 +209,6 @@ Property Property::from_string(const std::string &s)
return p;
}
-void BaseCtx::addConstraint(std::unique_ptr<TimingConstraint> constr)
-{
- for (auto fromObj : constr->from)
- constrsFrom.emplace(fromObj, constr.get());
- for (auto toObj : constr->to)
- constrsTo.emplace(toObj, constr.get());
- IdString name = constr->name;
- constraints[name] = std::move(constr);
-}
-
-void BaseCtx::removeConstraint(IdString constrName)
-{
- TimingConstraint *constr = constraints[constrName].get();
- for (auto fromObj : constr->from) {
- auto fromConstrs = constrsFrom.equal_range(fromObj);
- constrsFrom.erase(std::find(fromConstrs.first, fromConstrs.second, std::make_pair(fromObj, constr)));
- }
- for (auto toObj : constr->to) {
- auto toConstrs = constrsFrom.equal_range(toObj);
- constrsFrom.erase(std::find(toConstrs.first, toConstrs.second, std::make_pair(toObj, constr)));
- }
- constraints.erase(constrName);
-}
-
const char *BaseCtx::nameOfBel(BelId bel) const
{
const Context *ctx = getCtx();
diff --git a/common/nextpnr.h b/common/nextpnr.h
index 549e8e35..ab2f8dca 100644
--- a/common/nextpnr.h
+++ b/common/nextpnr.h
@@ -372,14 +372,6 @@ struct ArcBounds
};
};
-struct TimingConstrObjectId
-{
- int32_t index = -1;
-
- bool operator==(const TimingConstrObjectId &other) const { return index == other.index; }
- bool operator!=(const TimingConstrObjectId &other) const { return index != other.index; }
-};
-
NEXTPNR_NAMESPACE_END
namespace std {
@@ -394,15 +386,6 @@ template <> struct hash<NEXTPNR_NAMESPACE_PREFIX Loc>
return seed;
}
};
-
-template <> struct hash<NEXTPNR_NAMESPACE_PREFIX TimingConstrObjectId>
-{
- std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX TimingConstrObjectId &obj) const noexcept
- {
- return hash<int>()(obj.index);
- }
-};
-
} // namespace std
#include "archdefs.h"
@@ -612,8 +595,6 @@ struct NetInfo : ArchNetInfo
std::unique_ptr<ClockConstraint> clkconstr;
- TimingConstrObjectId tmg_id;
-
Region *region = nullptr;
};
@@ -629,7 +610,6 @@ struct PortInfo
IdString name;
NetInfo *net;
PortType type;
- TimingConstrObjectId tmg_id;
};
struct CellInfo : ArchCellInfo
@@ -654,7 +634,6 @@ struct CellInfo : ArchCellInfo
// parent.[xyz] := 0 when (constr_parent == nullptr)
Region *region = nullptr;
- TimingConstrObjectId tmg_id;
void addInput(IdString name);
void addOutput(IdString name);
@@ -706,41 +685,6 @@ struct ClockConstraint
DelayPair high;
DelayPair low;
DelayPair period;
-
- TimingConstrObjectId domain_tmg_id;
-};
-
-struct TimingConstraintObject
-{
- TimingConstrObjectId id;
- enum
- {
- ANYTHING,
- CLOCK_DOMAIN,
- NET,
- CELL,
- CELL_PORT
- } type;
- IdString entity; // Name of clock net; net or cell
- IdString port; // Name of port on a cell
-};
-
-struct TimingConstraint
-{
- IdString name;
-
- enum
- {
- FALSE_PATH,
- MIN_DELAY,
- MAX_DELAY,
- MULTICYCLE,
- } type;
-
- delay_t value;
-
- std::unordered_set<TimingConstrObjectId> from;
- std::unordered_set<TimingConstrObjectId> to;
};
// Represents the contents of a non-leaf cell in a design
@@ -768,12 +712,6 @@ struct HierarchicalCell
std::unordered_map<IdString, IdString> hier_cells;
};
-inline bool operator==(const std::pair<const TimingConstrObjectId, TimingConstraint *> &a,
- const std::pair<TimingConstrObjectId, TimingConstraint *> &b)
-{
- return a.first == b.first && a.second == b.second;
-}
-
struct DeterministicRNG
{
uint64_t rngstate;
@@ -899,11 +837,6 @@ struct BaseCtx
IdString::initialize_add(this, "", 0);
IdString::initialize_arch(this);
- TimingConstraintObject wildcard;
- wildcard.id.index = 0;
- wildcard.type = TimingConstraintObject::ANYTHING;
- constraintObjects.push_back(wildcard);
-
design_loaded = false;
}
@@ -1014,30 +947,11 @@ struct BaseCtx
// --------------------------------------------------------------
- // Timing Constraint API
-
- // constraint name -> constraint
- std::unordered_map<IdString, std::unique_ptr<TimingConstraint>> constraints;
- // object ID -> object
- std::vector<TimingConstraintObject> constraintObjects;
- // object ID -> constraint
- std::unordered_multimap<TimingConstrObjectId, TimingConstraint *> constrsFrom;
- std::unordered_multimap<TimingConstrObjectId, TimingConstraint *> constrsTo;
-
- TimingConstrObjectId timingWildcardObject();
- TimingConstrObjectId timingClockDomainObject(NetInfo *clockDomain);
- TimingConstrObjectId timingNetObject(NetInfo *net);
- TimingConstrObjectId timingCellObject(CellInfo *cell);
- TimingConstrObjectId timingPortObject(CellInfo *cell, IdString port);
-
NetInfo *getNetByAlias(IdString alias) const
{
return nets.count(alias) ? nets.at(alias).get() : nets.at(net_aliases.at(alias)).get();
}
- void addConstraint(std::unique_ptr<TimingConstraint> constr);
- void removeConstraint(IdString constrName);
-
// Intended to simplify Python API
void addClock(IdString net, float freq);
void createRectangularRegion(IdString name, int x0, int y0, int x1, int y1);