aboutsummaryrefslogtreecommitdiffstats
path: root/frontend
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2019-11-29 15:58:02 +0000
committerDavid Shah <dave@ds0.me>2019-12-27 10:44:30 +0000
commit9f6031cda13a290903785a1c469af02838309b39 (patch)
tree95352044e09c1d0ba2b486d0d216a6fb2fb27d7c /frontend
parent6bf3c261fa3e13319430380096aca65042476ae3 (diff)
downloadnextpnr-9f6031cda13a290903785a1c469af02838309b39.tar.gz
nextpnr-9f6031cda13a290903785a1c469af02838309b39.tar.bz2
nextpnr-9f6031cda13a290903785a1c469af02838309b39.zip
frontend_base: Import cell hierarchy
Signed-off-by: David Shah <dave@ds0.me>
Diffstat (limited to 'frontend')
-rw-r--r--frontend/frontend_base.h19
1 files changed, 16 insertions, 3 deletions
diff --git a/frontend/frontend_base.h b/frontend/frontend_base.h
index c23e2196..be764266 100644
--- a/frontend/frontend_base.h
+++ b/frontend/frontend_base.h
@@ -131,8 +131,10 @@ template <typename FrontendType> struct GenericFrontend
HierModuleState m;
m.is_toplevel = true;
m.prefix = "";
+ m.path = top;
+ ctx->top_module = top;
// Do the actual import, starting from the top level module
- import_module(m, mod_refs.at(top));
+ import_module(m, top.str(ctx), top.str(ctx), mod_refs.at(top));
}
Context *ctx;
@@ -239,6 +241,7 @@ template <typename FrontendType> struct GenericFrontend
{
bool is_toplevel;
std::string prefix;
+ IdString parent_path, path;
// Map from index in module to "flat" index of nets
std::vector<int> index_to_net_flatindex;
// Get a reference to index_to_net; resizing if
@@ -255,8 +258,14 @@ template <typename FrontendType> struct GenericFrontend
std::vector<std::vector<std::string>> net_names;
};
- void import_module(HierModuleState &m, const mod_dat_t &data)
+ void import_module(HierModuleState &m, const std::string &name, const std::string &type, const mod_dat_t &data)
{
+ NPNR_ASSERT(!ctx->hierarchy.count(m.path));
+ ctx->hierarchy[m.path].name = ctx->id(name);
+ ctx->hierarchy[m.path].type = ctx->id(type);
+ ctx->hierarchy[m.path].parent = m.parent_path;
+ ctx->hierarchy[m.path].fullpath = m.path;
+
std::vector<NetInfo *> index_to_net;
if (!m.is_toplevel) {
// Import port connections; for submodules only
@@ -414,6 +423,7 @@ template <typename FrontendType> struct GenericFrontend
void import_leaf_cell(HierModuleState &m, const std::string &name, const cell_dat_t &cd)
{
IdString inst_name = unique_name(m.prefix, name, false);
+ ctx->hierarchy[m.path].leaf_cells[ctx->id(name)] = inst_name;
CellInfo *ci = ctx->createCell(inst_name, ctx->id(impl.get_cell_type(cd)));
// Import port directions
std::unordered_map<IdString, PortType> port_dirs;
@@ -488,8 +498,11 @@ template <typename FrontendType> struct GenericFrontend
submod.prefix = m.prefix;
submod.prefix += name;
submod.prefix += '.';
+ submod.parent_path = m.path;
+ submod.path = ctx->id(m.path.str(ctx) + "/" + name);
// Do the submodule import
- import_module(submod, mod_refs.at(ctx->id(impl.get_cell_type(cd))));
+ auto type = impl.get_cell_type(cd);
+ import_module(submod, name, type, mod_refs.at(ctx->id(type)));
}
// Import the cells section of a module