blob: 4949eac286b8282c9f41c074f3741a1e78f94ca8 [file] [log] [blame]
#ifndef NETLIST_WALKER_H
#define NETLIST_WALKER_H
#include "vpr_types.h"
class NetlistVisitor;
class NetlistWalker {
public:
NetlistWalker(NetlistVisitor& netlist_visitor)
: visitor_(netlist_visitor) {}
void walk();
private:
void walk_blocks(const t_pb_routes& pb_route, const t_pb* pb);
private:
NetlistVisitor& visitor_;
};
class NetlistVisitor {
public:
virtual ~NetlistVisitor() = default;
void start() { start_impl(); }
void visit_top(const char* top_level_name) { visit_top_impl(top_level_name); }
void visit_clb(ClusterBlockId blk_id, const t_pb* clb) { visit_clb_impl(blk_id, clb); }
// visit_atom is called on leaf pb nodes that map to a netlist element.
void visit_atom(const t_pb* atom) { visit_atom_impl(atom); }
// visit_route_through is called on leaf pb nodes that do not map to a
// netlist element. This is generally used for route-through nodes.
void visit_route_through(const t_pb* atom) {
visit_route_through_impl(atom);
}
// visit_all is called on all t_pb nodes that are in use for any
// reason.
//
// top_pb_route is the pb_route for the cluster being visited.
// pb is the current element in the cluster being visited.
void visit_all(const t_pb_routes& top_pb_route, const t_pb* pb) {
visit_all_impl(top_pb_route, pb);
}
void finish() { finish_impl(); }
protected:
//All implementation methods are no-ops in this base class
virtual void start_impl();
virtual void visit_top_impl(const char* top_level_name);
virtual void visit_clb_impl(ClusterBlockId blk_id, const t_pb* clb);
virtual void visit_atom_impl(const t_pb* atom);
virtual void visit_route_through_impl(const t_pb* atom);
virtual void visit_all_impl(const t_pb_routes& top_pb_route, const t_pb* pb);
virtual void finish_impl();
};
#endif