aboutsummaryrefslogtreecommitdiffstats
path: root/common/nextpnr.h
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2019-12-27 11:19:45 +0000
committerGitHub <noreply@github.com>2019-12-27 11:19:45 +0000
commit4e0ca50db137eb9d10098582be607c98601f8375 (patch)
tree7dd586694d7c3bca458502f3e6d677da1a6954b3 /common/nextpnr.h
parentb6e2159cecdf79d0d94d0e6a9dda8cef6389cac1 (diff)
parent5774b13984bb151909b90ee2c668bdfb08387a2b (diff)
downloadnextpnr-4e0ca50db137eb9d10098582be607c98601f8375.tar.gz
nextpnr-4e0ca50db137eb9d10098582be607c98601f8375.tar.bz2
nextpnr-4e0ca50db137eb9d10098582be607c98601f8375.zip
Merge pull request #353 from YosysHQ/generic-frontend
New hierarchy-capable generic frontend framework and json11 based JSON frontend
Diffstat (limited to 'common/nextpnr.h')
-rw-r--r--common/nextpnr.h40
1 files changed, 38 insertions, 2 deletions
diff --git a/common/nextpnr.h b/common/nextpnr.h
index 24f6948b..61e04415 100644
--- a/common/nextpnr.h
+++ b/common/nextpnr.h
@@ -387,7 +387,7 @@ struct ClockConstraint;
struct NetInfo : ArchNetInfo
{
- IdString name;
+ IdString name, hierpath;
int32_t udata = 0;
PortRef driver;
@@ -397,6 +397,8 @@ struct NetInfo : ArchNetInfo
// wire -> uphill_pip
std::unordered_map<WireId, PipMap> wires;
+ std::vector<IdString> aliases; // entries in net_aliases that point to this net
+
std::unique_ptr<ClockConstraint> clkconstr;
TimingConstrObjectId tmg_id;
@@ -421,7 +423,7 @@ struct PortInfo
struct CellInfo : ArchCellInfo
{
- IdString name, type;
+ IdString name, type, hierpath;
int32_t udata;
std::unordered_map<IdString, PortInfo> ports;
@@ -525,6 +527,31 @@ struct TimingConstraint
std::unordered_set<TimingConstrObjectId> to;
};
+// Represents the contents of a non-leaf cell in a design
+// with hierarchy
+
+struct HierarchicalPort
+{
+ IdString name;
+ PortType dir;
+ std::vector<IdString> nets;
+ int offset;
+ bool upto;
+};
+
+struct HierarchicalCell
+{
+ IdString name, type, parent, fullpath;
+ // Name inside cell instance -> global name
+ std::unordered_map<IdString, IdString> leaf_cells, nets;
+ // Global name -> name inside cell instance
+ std::unordered_map<IdString, IdString> leaf_cells_by_gname, nets_by_gname;
+ // Cell port to net
+ std::unordered_map<IdString, HierarchicalPort> ports;
+ // Name inside cell instance -> global name
+ std::unordered_map<IdString, IdString> hier_cells;
+};
+
inline bool operator==(const std::pair<const TimingConstrObjectId, TimingConstraint *> &a,
const std::pair<TimingConstrObjectId, TimingConstraint *> &b)
{
@@ -618,6 +645,11 @@ struct BaseCtx
std::unordered_map<IdString, std::unique_ptr<NetInfo>> nets;
std::unordered_map<IdString, std::unique_ptr<CellInfo>> cells;
+ // Hierarchical (non-leaf) cells by full path
+ std::unordered_map<IdString, HierarchicalCell> hierarchy;
+ // This is the root of the above structure
+ IdString top_module;
+
// Aliases for nets, which may have more than one name due to assignments and hierarchy
std::unordered_map<IdString, IdString> net_aliases;
@@ -807,6 +839,10 @@ struct Context : Arch, DeterministicRNG
std::unordered_map<WireId, PipId> *route = nullptr, bool useEstimate = true);
// --------------------------------------------------------------
+ // call after changing hierpath or adding/removing nets and cells
+ void fixupHierarchy();
+
+ // --------------------------------------------------------------
// provided by sdf.cc
void writeSDF(std::ostream &out, bool cvc_mode = false) const;