python: Add bindings for hierarchy structures
Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
parent
9f6031cda1
commit
b100087024
@ -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::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(
|
readonly_wrapper<Context, decltype(&Context::net_aliases), &Context::net_aliases, wrap_context<AliasMap &>>::def_wrap(
|
||||||
ctx_cls, "net_aliases");
|
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>,
|
fn_wrapper_1a<Context, decltype(&Context::getNetByAlias), &Context::getNetByAlias, deref_and_wrap<NetInfo>,
|
||||||
conv_from_str<IdString>>::def_wrap(ctx_cls, "getNetByAlias");
|
conv_from_str<IdString>>::def_wrap(ctx_cls, "getNetByAlias");
|
||||||
|
@ -530,7 +530,7 @@ struct TimingConstraint
|
|||||||
// Represents the contents of a non-leaf cell in a design
|
// Represents the contents of a non-leaf cell in a design
|
||||||
// with hierarchy
|
// with hierarchy
|
||||||
|
|
||||||
struct HierachicalPort
|
struct HierarchicalPort
|
||||||
{
|
{
|
||||||
IdString name;
|
IdString name;
|
||||||
PortType dir;
|
PortType dir;
|
||||||
@ -539,12 +539,12 @@ struct HierachicalPort
|
|||||||
bool upto;
|
bool upto;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct HierachicalCell
|
struct HierarchicalCell
|
||||||
{
|
{
|
||||||
IdString name, type, parent, fullpath;
|
IdString name, type, parent, fullpath;
|
||||||
// Name inside cell instance -> global name
|
// Name inside cell instance -> global name
|
||||||
std::unordered_map<IdString, IdString> leaf_cells, nets;
|
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
|
// Name inside cell instance -> global name
|
||||||
std::unordered_map<IdString, IdString> hier_cells;
|
std::unordered_map<IdString, IdString> hier_cells;
|
||||||
};
|
};
|
||||||
@ -643,7 +643,7 @@ struct BaseCtx
|
|||||||
std::unordered_map<IdString, std::unique_ptr<CellInfo>> cells;
|
std::unordered_map<IdString, std::unique_ptr<CellInfo>> cells;
|
||||||
|
|
||||||
// Hierarchical (non-leaf) cells by full path
|
// 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
|
// This is the root of the above structure
|
||||||
IdString top_module;
|
IdString top_module;
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ BOOST_PYTHON_MODULE(MODULE_NAME)
|
|||||||
|
|
||||||
typedef std::unordered_map<IdString, Property> AttrMap;
|
typedef std::unordered_map<IdString, Property> AttrMap;
|
||||||
typedef std::unordered_map<IdString, PortInfo> PortMap;
|
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;
|
typedef std::unordered_map<IdString, std::unique_ptr<Region>> RegionMap;
|
||||||
|
|
||||||
class_<BaseCtx, BaseCtx *, boost::noncopyable>("BaseCtx", no_init);
|
class_<BaseCtx, BaseCtx *, boost::noncopyable>("BaseCtx", no_init);
|
||||||
@ -157,7 +157,7 @@ BOOST_PYTHON_MODULE(MODULE_NAME)
|
|||||||
conv_from_str<BelId>>::def_wrap(ci_cls, "bel");
|
conv_from_str<BelId>>::def_wrap(ci_cls, "bel");
|
||||||
readwrite_wrapper<CellInfo &, decltype(&CellInfo::belStrength), &CellInfo::belStrength, pass_through<PlaceStrength>,
|
readwrite_wrapper<CellInfo &, decltype(&CellInfo::belStrength), &CellInfo::belStrength, pass_through<PlaceStrength>,
|
||||||
pass_through<PlaceStrength>>::def_wrap(ci_cls, "belStrength");
|
pass_through<PlaceStrength>>::def_wrap(ci_cls, "belStrength");
|
||||||
readonly_wrapper<CellInfo &, decltype(&CellInfo::pins), &CellInfo::pins, wrap_context<PinMap &>>::def_wrap(ci_cls,
|
readonly_wrapper<CellInfo &, decltype(&CellInfo::pins), &CellInfo::pins, wrap_context<IdIdMap &>>::def_wrap(ci_cls,
|
||||||
"pins");
|
"pins");
|
||||||
|
|
||||||
fn_wrapper_1a_v<CellInfo &, decltype(&CellInfo::addInput), &CellInfo::addInput, conv_from_str<IdString>>::def_wrap(
|
fn_wrapper_1a_v<CellInfo &, decltype(&CellInfo::addInput), &CellInfo::addInput, conv_from_str<IdString>>::def_wrap(
|
||||||
@ -230,9 +230,25 @@ BOOST_PYTHON_MODULE(MODULE_NAME)
|
|||||||
readonly_wrapper<Region &, decltype(&Region::wires), &Region::wires, wrap_context<WireSet &>>::def_wrap(region_cls,
|
readonly_wrapper<Region &, decltype(&Region::wires), &Region::wires, wrap_context<WireSet &>>::def_wrap(region_cls,
|
||||||
"wires");
|
"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(AttrMap, conv_to_str<Property>, "AttrMap");
|
||||||
WRAP_MAP(PortMap, wrap_context<PortInfo &>, "PortMap");
|
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(WireMap, wrap_context<PipMap &>, "WireMap");
|
||||||
WRAP_MAP_UPTR(RegionMap, "RegionMap");
|
WRAP_MAP_UPTR(RegionMap, "RegionMap");
|
||||||
|
|
||||||
|
@ -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<CellInfo>> CellMap;
|
||||||
typedef std::unordered_map<IdString, std::unique_ptr<NetInfo>> NetMap;
|
typedef std::unordered_map<IdString, std::unique_ptr<NetInfo>> NetMap;
|
||||||
typedef std::unordered_map<IdString, IdString> AliasMap;
|
typedef std::unordered_map<IdString, IdString> AliasMap;
|
||||||
|
typedef std::unordered_map<IdString, HierarchicalCell> HierarchyMap;
|
||||||
|
|
||||||
auto belpin_cls = class_<ContextualWrapper<BelPin>>("BelPin", no_init);
|
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");
|
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(CellMap, "IdCellMap");
|
||||||
WRAP_MAP_UPTR(NetMap, "IdNetMap");
|
WRAP_MAP_UPTR(NetMap, "IdNetMap");
|
||||||
|
WRAP_MAP(HierarchyMap, wrap_context<HierarchicalCell &>, "HierarchyMap");
|
||||||
}
|
}
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
@ -500,6 +500,7 @@ template <typename FrontendType> struct GenericFrontend
|
|||||||
submod.prefix += '.';
|
submod.prefix += '.';
|
||||||
submod.parent_path = m.path;
|
submod.parent_path = m.path;
|
||||||
submod.path = ctx->id(m.path.str(ctx) + "/" + name);
|
submod.path = ctx->id(m.path.str(ctx) + "/" + name);
|
||||||
|
ctx->hierarchy[m.path].hier_cells[ctx->id(name)] = submod.path;
|
||||||
// Do the submodule import
|
// Do the submodule import
|
||||||
auto type = impl.get_cell_type(cd);
|
auto type = impl.get_cell_type(cd);
|
||||||
import_module(submod, name, type, mod_refs.at(ctx->id(type)));
|
import_module(submod, name, type, mod_refs.at(ctx->id(type)));
|
||||||
|
@ -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<CellInfo>> CellMap;
|
||||||
typedef std::unordered_map<IdString, std::unique_ptr<NetInfo>> NetMap;
|
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,
|
readonly_wrapper<Context, decltype(&Context::cells), &Context::cells, wrap_context<CellMap &>>::def_wrap(ctx_cls,
|
||||||
"cells");
|
"cells");
|
||||||
@ -231,6 +232,7 @@ void arch_wrap_python()
|
|||||||
|
|
||||||
WRAP_MAP_UPTR(CellMap, "IdCellMap");
|
WRAP_MAP_UPTR(CellMap, "IdCellMap");
|
||||||
WRAP_MAP_UPTR(NetMap, "IdNetMap");
|
WRAP_MAP_UPTR(NetMap, "IdNetMap");
|
||||||
|
WRAP_MAP(HierarchyMap, wrap_context<HierarchicalCell &>, "HierarchyMap");
|
||||||
WRAP_VECTOR(const std::vector<IdString>, conv_to_str<IdString>);
|
WRAP_VECTOR(const std::vector<IdString>, conv_to_str<IdString>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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<CellInfo>> CellMap;
|
||||||
typedef std::unordered_map<IdString, std::unique_ptr<NetInfo>> NetMap;
|
typedef std::unordered_map<IdString, std::unique_ptr<NetInfo>> NetMap;
|
||||||
|
typedef std::unordered_map<IdString, HierarchicalCell> HierarchyMap;
|
||||||
typedef std::unordered_map<IdString, IdString> AliasMap;
|
typedef std::unordered_map<IdString, IdString> AliasMap;
|
||||||
|
|
||||||
auto belpin_cls = class_<ContextualWrapper<BelPin>>("BelPin", no_init);
|
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(CellMap, "IdCellMap");
|
||||||
WRAP_MAP_UPTR(NetMap, "IdNetMap");
|
WRAP_MAP_UPTR(NetMap, "IdNetMap");
|
||||||
|
WRAP_MAP(HierarchyMap, wrap_context<HierarchicalCell &>, "HierarchyMap");
|
||||||
}
|
}
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
10
python/report_hierarchy.py
Normal file
10
python/report_hierarchy.py
Normal file
@ -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])
|
||||||
|
|
Loading…
Reference in New Issue
Block a user