diff options
| -rw-r--r-- | common/arch_pybindings_shared.h | 4 | ||||
| -rw-r--r-- | common/nextpnr.h | 8 | ||||
| -rw-r--r-- | common/pybindings.cc | 24 | ||||
| -rw-r--r-- | ecp5/arch_pybindings.cc | 2 | ||||
| -rw-r--r-- | frontend/frontend_base.h | 1 | ||||
| -rw-r--r-- | generic/arch_pybindings.cc | 2 | ||||
| -rw-r--r-- | ice40/arch_pybindings.cc | 2 | ||||
| -rw-r--r-- | python/report_hierarchy.py | 10 | 
8 files changed, 45 insertions, 8 deletions
diff --git a/common/arch_pybindings_shared.h b/common/arch_pybindings_shared.h index f681af92..89a61dad 100644 --- a/common/arch_pybindings_shared.h +++ b/common/arch_pybindings_shared.h @@ -5,6 +5,10 @@ readonly_wrapper<Context, decltype(&Context::cells), &Context::cells, wrap_conte  readonly_wrapper<Context, decltype(&Context::nets), &Context::nets, wrap_context<NetMap &>>::def_wrap(ctx_cls, "nets");  readonly_wrapper<Context, decltype(&Context::net_aliases), &Context::net_aliases, wrap_context<AliasMap &>>::def_wrap(          ctx_cls, "net_aliases"); +readonly_wrapper<Context, decltype(&Context::hierarchy), &Context::hierarchy, wrap_context<HierarchyMap &>>::def_wrap( +        ctx_cls, "hierarchy"); +readwrite_wrapper<Context, decltype(&Context::top_module), &Context::top_module, conv_to_str<IdString>, +                  conv_from_str<IdString>>::def_wrap(ctx_cls, "top_module");  fn_wrapper_1a<Context, decltype(&Context::getNetByAlias), &Context::getNetByAlias, deref_and_wrap<NetInfo>,                conv_from_str<IdString>>::def_wrap(ctx_cls, "getNetByAlias"); diff --git a/common/nextpnr.h b/common/nextpnr.h index ceea2088..7dfebd62 100644 --- a/common/nextpnr.h +++ b/common/nextpnr.h @@ -530,7 +530,7 @@ struct TimingConstraint  // Represents the contents of a non-leaf cell in a design  // with hierarchy -struct HierachicalPort +struct HierarchicalPort  {      IdString name;      PortType dir; @@ -539,12 +539,12 @@ struct HierachicalPort      bool upto;  }; -struct HierachicalCell +struct HierarchicalCell  {      IdString name, type, parent, fullpath;      // Name inside cell instance -> global name      std::unordered_map<IdString, IdString> leaf_cells, nets; -    std::unordered_map<IdString, HierachicalPort> ports; +    std::unordered_map<IdString, HierarchicalPort> ports;      // Name inside cell instance -> global name      std::unordered_map<IdString, IdString> hier_cells;  }; @@ -643,7 +643,7 @@ struct BaseCtx      std::unordered_map<IdString, std::unique_ptr<CellInfo>> cells;      // Hierarchical (non-leaf) cells by full path -    std::unordered_map<IdString, HierachicalCell> hierarchy; +    std::unordered_map<IdString, HierarchicalCell> hierarchy;      // This is the root of the above structure      IdString top_module; diff --git a/common/pybindings.cc b/common/pybindings.cc index 53830284..3b2a3744 100644 --- a/common/pybindings.cc +++ b/common/pybindings.cc @@ -131,7 +131,7 @@ BOOST_PYTHON_MODULE(MODULE_NAME)      typedef std::unordered_map<IdString, Property> AttrMap;      typedef std::unordered_map<IdString, PortInfo> PortMap; -    typedef std::unordered_map<IdString, IdString> PinMap; +    typedef std::unordered_map<IdString, IdString> IdIdMap;      typedef std::unordered_map<IdString, std::unique_ptr<Region>> RegionMap;      class_<BaseCtx, BaseCtx *, boost::noncopyable>("BaseCtx", no_init); @@ -157,8 +157,8 @@ BOOST_PYTHON_MODULE(MODULE_NAME)                        conv_from_str<BelId>>::def_wrap(ci_cls, "bel");      readwrite_wrapper<CellInfo &, decltype(&CellInfo::belStrength), &CellInfo::belStrength, pass_through<PlaceStrength>,                        pass_through<PlaceStrength>>::def_wrap(ci_cls, "belStrength"); -    readonly_wrapper<CellInfo &, decltype(&CellInfo::pins), &CellInfo::pins, wrap_context<PinMap &>>::def_wrap(ci_cls, -                                                                                                               "pins"); +    readonly_wrapper<CellInfo &, decltype(&CellInfo::pins), &CellInfo::pins, wrap_context<IdIdMap &>>::def_wrap(ci_cls, +                                                                                                                "pins");      fn_wrapper_1a_v<CellInfo &, decltype(&CellInfo::addInput), &CellInfo::addInput, conv_from_str<IdString>>::def_wrap(              ci_cls, "addInput"); @@ -230,9 +230,25 @@ BOOST_PYTHON_MODULE(MODULE_NAME)      readonly_wrapper<Region &, decltype(&Region::wires), &Region::wires, wrap_context<WireSet &>>::def_wrap(region_cls,                                                                                                              "wires"); +    auto hierarchy_cls = class_<ContextualWrapper<HierarchicalCell &>>("HierarchicalCell", no_init); +    readwrite_wrapper<HierarchicalCell &, decltype(&HierarchicalCell::name), &HierarchicalCell::name, +                      conv_to_str<IdString>, conv_from_str<IdString>>::def_wrap(hierarchy_cls, "name"); +    readwrite_wrapper<HierarchicalCell &, decltype(&HierarchicalCell::type), &HierarchicalCell::type, +                      conv_to_str<IdString>, conv_from_str<IdString>>::def_wrap(hierarchy_cls, "type"); +    readwrite_wrapper<HierarchicalCell &, decltype(&HierarchicalCell::parent), &HierarchicalCell::parent, +                      conv_to_str<IdString>, conv_from_str<IdString>>::def_wrap(hierarchy_cls, "parent"); +    readwrite_wrapper<HierarchicalCell &, decltype(&HierarchicalCell::fullpath), &HierarchicalCell::fullpath, +                      conv_to_str<IdString>, conv_from_str<IdString>>::def_wrap(hierarchy_cls, "fullpath"); + +    readonly_wrapper<HierarchicalCell &, decltype(&HierarchicalCell::leaf_cells), &HierarchicalCell::leaf_cells, +                     wrap_context<IdIdMap &>>::def_wrap(hierarchy_cls, "leaf_cells"); +    readonly_wrapper<HierarchicalCell &, decltype(&HierarchicalCell::nets), &HierarchicalCell::nets, +                     wrap_context<IdIdMap &>>::def_wrap(hierarchy_cls, "nets"); +    readonly_wrapper<HierarchicalCell &, decltype(&HierarchicalCell::hier_cells), &HierarchicalCell::hier_cells, +                     wrap_context<IdIdMap &>>::def_wrap(hierarchy_cls, "hier_cells");      WRAP_MAP(AttrMap, conv_to_str<Property>, "AttrMap");      WRAP_MAP(PortMap, wrap_context<PortInfo &>, "PortMap"); -    WRAP_MAP(PinMap, conv_to_str<IdString>, "PinMap"); +    WRAP_MAP(IdIdMap, conv_to_str<IdString>, "IdIdMap");      WRAP_MAP(WireMap, wrap_context<PipMap &>, "WireMap");      WRAP_MAP_UPTR(RegionMap, "RegionMap"); diff --git a/ecp5/arch_pybindings.cc b/ecp5/arch_pybindings.cc index da6d3e50..cd5e31c3 100644 --- a/ecp5/arch_pybindings.cc +++ b/ecp5/arch_pybindings.cc @@ -49,6 +49,7 @@ void arch_wrap_python()      typedef std::unordered_map<IdString, std::unique_ptr<CellInfo>> CellMap;      typedef std::unordered_map<IdString, std::unique_ptr<NetInfo>> NetMap;      typedef std::unordered_map<IdString, IdString> AliasMap; +    typedef std::unordered_map<IdString, HierarchicalCell> HierarchyMap;      auto belpin_cls = class_<ContextualWrapper<BelPin>>("BelPin", no_init);      readonly_wrapper<BelPin, decltype(&BelPin::bel), &BelPin::bel, conv_to_str<BelId>>::def_wrap(belpin_cls, "bel"); @@ -64,6 +65,7 @@ void arch_wrap_python()      WRAP_MAP_UPTR(CellMap, "IdCellMap");      WRAP_MAP_UPTR(NetMap, "IdNetMap"); +    WRAP_MAP(HierarchyMap, wrap_context<HierarchicalCell &>, "HierarchyMap");  }  NEXTPNR_NAMESPACE_END diff --git a/frontend/frontend_base.h b/frontend/frontend_base.h index be764266..9e16cb24 100644 --- a/frontend/frontend_base.h +++ b/frontend/frontend_base.h @@ -500,6 +500,7 @@ template <typename FrontendType> struct GenericFrontend          submod.prefix += '.';          submod.parent_path = m.path;          submod.path = ctx->id(m.path.str(ctx) + "/" + name); +        ctx->hierarchy[m.path].hier_cells[ctx->id(name)] = submod.path;          // Do the submodule import          auto type = impl.get_cell_type(cd);          import_module(submod, name, type, mod_refs.at(ctx->id(type))); diff --git a/generic/arch_pybindings.cc b/generic/arch_pybindings.cc index 8526e409..2600cac0 100644 --- a/generic/arch_pybindings.cc +++ b/generic/arch_pybindings.cc @@ -141,6 +141,7 @@ void arch_wrap_python()      typedef std::unordered_map<IdString, std::unique_ptr<CellInfo>> CellMap;      typedef std::unordered_map<IdString, std::unique_ptr<NetInfo>> NetMap; +    typedef std::unordered_map<IdString, HierarchicalCell> HierarchyMap;      readonly_wrapper<Context, decltype(&Context::cells), &Context::cells, wrap_context<CellMap &>>::def_wrap(ctx_cls,                                                                                                               "cells"); @@ -231,6 +232,7 @@ void arch_wrap_python()      WRAP_MAP_UPTR(CellMap, "IdCellMap");      WRAP_MAP_UPTR(NetMap, "IdNetMap"); +    WRAP_MAP(HierarchyMap, wrap_context<HierarchicalCell &>, "HierarchyMap");      WRAP_VECTOR(const std::vector<IdString>, conv_to_str<IdString>);  } diff --git a/ice40/arch_pybindings.cc b/ice40/arch_pybindings.cc index cef7c58f..e2022091 100644 --- a/ice40/arch_pybindings.cc +++ b/ice40/arch_pybindings.cc @@ -59,6 +59,7 @@ void arch_wrap_python()      typedef std::unordered_map<IdString, std::unique_ptr<CellInfo>> CellMap;      typedef std::unordered_map<IdString, std::unique_ptr<NetInfo>> NetMap; +    typedef std::unordered_map<IdString, HierarchicalCell> HierarchyMap;      typedef std::unordered_map<IdString, IdString> AliasMap;      auto belpin_cls = class_<ContextualWrapper<BelPin>>("BelPin", no_init); @@ -75,6 +76,7 @@ void arch_wrap_python()      WRAP_MAP_UPTR(CellMap, "IdCellMap");      WRAP_MAP_UPTR(NetMap, "IdNetMap"); +    WRAP_MAP(HierarchyMap, wrap_context<HierarchicalCell &>, "HierarchyMap");  }  NEXTPNR_NAMESPACE_END diff --git a/python/report_hierarchy.py b/python/report_hierarchy.py new file mode 100644 index 00000000..6d409a9b --- /dev/null +++ b/python/report_hierarchy.py @@ -0,0 +1,10 @@ +def visit(indent, data): +	istr = " " * indent +	print("{}{}: {}".format(istr, data.name, data.type)) +	for lname, gname in data.leaf_cells: +		print("{}    {} -> {}".format(istr, lname, gname)) +	for lname, gname in data.hier_cells: +		visit(indent + 4, ctx.hierarchy[gname]) + +visit(0, ctx.hierarchy[ctx.top_module]) +  | 
