blob: ed5cfb7406e423df7c83c1f3ab326269bb13adfd [file] [log] [blame]
#include "netlist_walker.h"
#include "globals.h"
#include "atom_netlist.h"
void NetlistWalker::walk() {
auto& atom_ctx = g_vpr_ctx.atom();
auto& cluster_ctx = g_vpr_ctx.clustering();
visitor_.visit_top(atom_ctx.nlist.netlist_name().c_str());
for(auto blk_id : cluster_ctx.clb_nlist.blocks()) {
//Visit the top-level block
visitor_.visit_clb(cluster_ctx.clb_nlist.block_pb(blk_id));
//Visit all the block's primitives
walk_atoms(cluster_ctx.clb_nlist.block_pb(blk_id));
}
visitor_.finish();
}
void NetlistWalker::walk_atoms(const t_pb* pb) {
//Recursively travers this pb calling visitor_.visit_atom()
//on any of its primitive pb's
if(pb == nullptr || pb->name == nullptr) {
//Empty pb
return;
}
if(pb->child_pbs == nullptr) {
//Primitive pb
visitor_.visit_atom(pb);
return;
}
//Recurse
const t_pb_type* pb_type = pb->pb_graph_node->pb_type;
if(pb_type->num_modes > 0) {
for(int i = 0; i < pb_type->modes[pb->mode].num_pb_type_children; i++) {
for(int j = 0; j < pb_type->modes[pb->mode].pb_type_children[i].num_pb; j++) {
walk_atoms(&pb->child_pbs[i][j]);
}
}
}
}
void NetlistVisitor::start_impl() {
//noop
}
void NetlistVisitor::visit_top_impl(const char* /*top_level_name*/) {
//noop
}
void NetlistVisitor::visit_clb_impl(const t_pb* /*clb*/) {
//noop
}
void NetlistVisitor::visit_atom_impl(const t_pb* /*atom*/) {
//noop
}
void NetlistVisitor::finish_impl() {
//noop
}