417 #include <unordered_map> 418 #include "vtr_range.h" 419 #include "vtr_logic.h" 420 #include "vtr_vector_map.h" 422 #include "logic_types.h" 428 template<
typename BlockId,
typename PortId,
typename PinId,
typename NetId>
445 template<
typename BlockId,
typename PortId,
typename PinId,
typename NetId>
448 typedef typename vtr::vector_map<BlockId, BlockId>::const_iterator
block_iterator;
449 typedef typename std::unordered_map<std::string, std::string>::const_iterator
attr_iterator;
450 typedef typename std::unordered_map<std::string, std::string>::const_iterator
param_iterator;
451 typedef typename vtr::vector_map<NetId, NetId>::const_iterator
net_iterator;
452 typedef typename vtr::vector_map<PinId, PinId>::const_iterator
pin_iterator;
453 typedef typename vtr::vector_map<PortId, PortId>::const_iterator
port_iterator;
465 Netlist(std::string name =
"", std::string
id =
"");
473 const std::string& netlist_name()
const;
479 const std::string& netlist_id()
const;
489 bool is_dirty()
const;
495 bool is_compressed()
const;
498 void print_stats()
const;
505 const std::string& block_name(
const BlockId blk_id)
const;
508 bool block_is_combinational(
const BlockId blk_id)
const;
511 attr_range block_attrs(
const BlockId blk_id)
const;
514 param_range block_params(
const BlockId blk_id)
const;
517 pin_range block_pins(
const BlockId blk_id)
const;
520 pin_range block_input_pins(
const BlockId blk_id)
const;
528 pin_range block_output_pins(
const BlockId blk_id)
const;
531 pin_range block_clock_pins(
const BlockId blk_id)
const;
534 port_range block_ports(
const BlockId blk_id)
const;
537 port_range block_input_ports(
const BlockId blk_id)
const;
545 port_range block_output_ports(
const BlockId blk_id)
const;
548 port_range block_clock_ports(
const BlockId blk_id)
const;
555 void remove_block(
const BlockId blk_id);
562 const std::string& port_name(
const PortId port_id)
const;
565 BlockId port_block(
const PortId port_id)
const;
568 pin_range port_pins(
const PortId port_id)
const;
578 PinId port_pin(
const PortId port_id,
const BitIndex port_bit)
const;
586 NetId port_net(
const PortId port_id,
const BitIndex port_bit)
const;
589 BitIndex port_width(
const PortId port_id)
const;
592 PortType port_type(
const PortId port_id)
const;
599 void remove_port(
const PortId port_id);
606 std::string pin_name(
const PinId pin_id)
const;
609 PinType pin_type(
const PinId pin_id)
const;
612 NetId pin_net(
const PinId pin_id)
const;
615 int pin_net_index(
const PinId pin_id)
const;
618 PortId pin_port(
const PinId pin_id)
const;
621 BitIndex pin_port_bit(
const PinId pin_id)
const;
624 BlockId pin_block(
const PinId pin_id)
const;
627 PortType pin_port_type(
const PinId pin_id)
const;
630 bool pin_is_constant(
const PinId pin_id)
const;
638 void remove_pin(
const PinId pin_id);
645 const std::string& net_name(
const NetId net_id)
const;
653 pin_range net_pins(
const NetId net_id)
const;
656 PinId net_pin(
const NetId net_id,
int net_pin_index)
const;
659 BlockId net_pin_block(
const NetId net_id,
int net_pin_index)
const;
662 PinId net_driver(
const NetId net_id)
const;
665 BlockId net_driver_block(
const NetId net_id)
const;
668 pin_range net_sinks(
const NetId net_id)
const;
671 bool net_is_constant(
const NetId net_id)
const;
679 void remove_net(
const NetId net_id);
689 void remove_net_pin(
const NetId net_id,
const PinId pin_id);
696 block_range blocks()
const;
699 port_range ports()
const;
702 net_range nets()
const;
705 pin_range pins()
const;
712 bool valid_block_id(BlockId block_id)
const;
713 bool valid_port_id(PortId port_id)
const;
714 bool valid_port_bit(PortId port_id,
BitIndex port_bit)
const;
715 bool valid_pin_id(PinId pin_id)
const;
716 bool valid_net_id(NetId net_id)
const;
727 BlockId find_block(
const std::string& name)
const;
737 PortId find_port(
const BlockId blk_id,
const std::string& name)
const;
743 NetId find_net(
const std::string& name)
const;
751 PinId find_pin(
const PortId port_id,
BitIndex port_bit)
const;
759 PinId find_pin(
const std::string name)
const;
770 void set_pin_net(
const PinId pin,
PinType pin_type,
const NetId net);
780 void set_pin_is_constant(
const PinId pin_id,
const bool value);
788 void set_block_name(
const BlockId blk_id,
const std::string new_name);
797 void set_block_attr(
const BlockId blk_id,
const std::string& name,
const std::string& value);
806 void set_block_param(
const BlockId blk_id,
const std::string& name,
const std::string& value);
815 void merge_nets(
const NetId driver_net,
const NetId sink_net);
827 IdRemapper remove_and_compress();
837 void remove_unused();
845 IdRemapper compress();
853 BlockId create_block(
const std::string name);
863 PortId create_port(
const BlockId blk_id,
const std::string name,
BitIndex width,
PortType type);
874 PinId create_pin(
const PortId port_id,
BitIndex port_bit,
const NetId net_id,
const PinType pin_type,
bool is_const =
false);
880 NetId create_net(
const std::string name);
889 NetId add_net(
const std::string name, PinId driver, std::vector<PinId> sinks);
892 struct string_id_tag;
895 typedef vtr::StrongId<string_id_tag>
StringId;
906 StringId find_string(
const std::string& str)
const;
912 BlockId find_block(
const StringId name_id)
const;
919 NetId find_net(
const StringId name_id)
const;
930 StringId create_string(
const std::string& str);
937 int associate_pin_with_net(
const PinId pin_id,
const PinType type,
const NetId net_id);
940 void associate_pin_with_port(
const PinId pin_id,
const PortId port_id);
943 void associate_pin_with_block(
const PinId pin_id,
const PortType type,
const BlockId blk_id);
946 void associate_port_with_block(
const PortId port_id,
const PortType type,
const BlockId blk_id);
958 IdRemapper build_id_maps();
961 void clean_blocks(
const vtr::vector_map<BlockId, BlockId>& block_id_map);
964 void clean_ports(
const vtr::vector_map<PortId, PortId>& port_id_map);
967 void clean_pins(
const vtr::vector_map<PinId, PinId>& pin_id_map);
970 void clean_nets(
const vtr::vector_map<NetId, NetId>& net_id_map);
973 void rebuild_lookups();
976 void rebuild_block_refs(
const vtr::vector_map<PinId, PinId>& pin_id_map,
977 const vtr::vector_map<PortId, PortId>& port_id_map);
980 void rebuild_port_refs(
const vtr::vector_map<BlockId, BlockId>& block_id_map,
981 const vtr::vector_map<PinId, PinId>& pin_id_map);
984 void rebuild_pin_refs(
const vtr::vector_map<PortId, PortId>& port_id_map,
985 const vtr::vector_map<NetId, NetId>& net_id_map);
988 void rebuild_net_refs(
const vtr::vector_map<PinId, PinId>& pin_id_map);
990 void shrink_to_fit();
997 bool verify_sizes()
const;
998 bool validate_block_sizes()
const;
999 bool validate_port_sizes()
const;
1000 bool validate_pin_sizes()
const;
1001 bool validate_net_sizes()
const;
1002 bool validate_string_sizes()
const;
1005 bool verify_refs()
const;
1006 bool validate_block_port_refs()
const;
1007 bool validate_block_pin_refs()
const;
1008 bool validate_port_pin_refs()
const;
1009 bool validate_net_pin_refs()
const;
1010 bool validate_string_refs()
const;
1013 bool verify_block_invariants()
const;
1016 bool verify_lookups()
const;
1019 bool valid_string_id(StringId string_id)
const;
1024 virtual void shrink_to_fit_impl() = 0;
1026 virtual bool validate_block_sizes_impl(
size_t num_blocks)
const = 0;
1027 virtual bool validate_port_sizes_impl(
size_t num_ports)
const = 0;
1028 virtual bool validate_pin_sizes_impl(
size_t num_pins)
const = 0;
1029 virtual bool validate_net_sizes_impl(
size_t num_nets)
const = 0;
1031 virtual void clean_blocks_impl(
const vtr::vector_map<BlockId, BlockId>& block_id_map) = 0;
1032 virtual void clean_ports_impl(
const vtr::vector_map<PortId, PortId>& port_id_map) = 0;
1033 virtual void clean_pins_impl(
const vtr::vector_map<PinId, PinId>& pin_id_map) = 0;
1034 virtual void clean_nets_impl(
const vtr::vector_map<NetId, NetId>& net_id_map) = 0;
1036 virtual void remove_block_impl(
const BlockId blk_id) = 0;
1037 virtual void remove_port_impl(
const PortId port_id) = 0;
1038 virtual void remove_pin_impl(
const PinId pin_id) = 0;
1039 virtual void remove_net_impl(
const NetId net_id) = 0;
1041 virtual void rebuild_block_refs_impl(
const vtr::vector_map<PinId, PinId>& pin_id_map,
const vtr::vector_map<PortId, PortId>& port_id_map) = 0;
1042 virtual void rebuild_port_refs_impl(
const vtr::vector_map<BlockId, BlockId>& block_id_map,
const vtr::vector_map<PinId, PinId>& pin_id_map) = 0;
1043 virtual void rebuild_pin_refs_impl(
const vtr::vector_map<PortId, PortId>& port_id_map,
const vtr::vector_map<NetId, NetId>& net_id_map) = 0;
1044 virtual void rebuild_net_refs_impl(
const vtr::vector_map<PinId, PinId>& pin_id_map) = 0;
1047 constexpr
static int INVALID_INDEX = -1;
1048 constexpr
static int NET_DRIVER_INDEX = 0;
1053 bool dirty_ =
false;
1069 vtr::vector_map<BlockId, std::unordered_map<std::string, std::string>>
block_params_;
1070 vtr::vector_map<BlockId, std::unordered_map<std::string, std::string>>
block_attrs_;
1106 #include "netlist.tpp" vtr::vector_map< StringId, StringId > string_ids_
Definition: netlist.h:1097
vtr::vector_map< NetId, StringId > net_names_
Definition: netlist.h:1090
vtr::vector_map< PinId, PortId > pin_ports_
Definition: netlist.h:1082
vtr::vector_map< PortId, BlockId > port_blocks_
Definition: netlist.h:1075
vtr::vector_map< NetId, NetId > net_id_map_
Definition: netlist.h:442
vtr::vector_map< NetId, NetId > net_ids_
Definition: netlist.h:1089
vtr::StrongId< string_id_tag > StringId
A unique identifier for a string in the netlist.
Definition: netlist.h:892
vtr::vector_map< PortId, PortType > port_types_
Definition: netlist.h:1078
vtr::vector_map< BlockId, unsigned > block_num_clock_ports_
Definition: netlist.h:1062
vtr::Range< block_iterator > block_range
Definition: netlist.h:455
vtr::vector_map< BlockId, unsigned > block_num_output_pins_
Definition: netlist.h:1066
vtr::vector_map< BlockId, std::vector< PortId > > block_ports_
Definition: netlist.h:1059
vtr::vector_map< PortId, StringId > port_names_
Definition: netlist.h:1074
vtr::vector_map< BlockId, std::unordered_map< std::string, std::string > > block_params_
Definition: netlist.h:1069
std::unordered_map< std::string, std::string >::const_iterator param_iterator
Definition: netlist.h:450
vtr::vector_map< BlockId, unsigned > block_num_input_ports_
Definition: netlist.h:1060
vtr::vector_map< BlockId, std::vector< PinId > > block_pins_
Definition: netlist.h:1064
vtr::vector_map< BlockId, unsigned > block_num_output_ports_
Definition: netlist.h:1061
vtr::Range< pin_iterator > pin_range
Definition: netlist.h:459
NetlistIdRemapper< BlockId, PortId, PinId, NetId > IdRemapper
Definition: netlist.h:462
vtr::vector_map< PortId, BitIndex > port_widths_
Definition: netlist.h:1077
NetId new_net_id(NetId old_net) const
vtr::Range< attr_iterator > attr_range
Definition: netlist.h:456
vtr::vector_map< PinId, BitIndex > pin_port_bits_
Definition: netlist.h:1083
vtr::Range< port_iterator > port_range
Definition: netlist.h:460
std::unordered_map< std::string, std::string >::const_iterator attr_iterator
Definition: netlist.h:449
PortType
The type of a port in the Netlist.
Definition: netlist_fwd.h:19
vtr::vector_map< PinId, PinId > pin_ids_
Definition: netlist.h:1081
vtr::vector_map< BlockId, unsigned > block_num_clock_pins_
Definition: netlist.h:1067
vtr::vector_map< StringId, NetId > net_name_to_net_id_
Definition: netlist.h:1102
vtr::Range< net_iterator > net_range
Definition: netlist.h:458
Definition: netlist.h:429
vtr::vector_map< StringId, std::string > strings_
Definition: netlist.h:1098
vtr::vector_map< StringId, BlockId > block_name_to_block_id_
Definition: netlist.h:1101
vtr::vector_map< NetId, NetId >::const_iterator net_iterator
Definition: netlist.h:451
PinId new_pin_id(PinId old_pin) const
vtr::vector_map< BlockId, BlockId > block_id_map_
Definition: netlist.h:439
vtr::vector_map< PinId, PinId > pin_id_map_
Definition: netlist.h:441
vtr::vector_map< PinId, PinId >::const_iterator pin_iterator
Definition: netlist.h:452
vtr::vector_map< PortId, PortId > port_ids_
Definition: netlist.h:1073
PinType
Definition: netlist_fwd.h:25
vtr::vector_map< PortId, PortId > port_id_map_
Definition: netlist.h:440
vtr::vector_map< PortId, std::vector< PinId > > port_pins_
Definition: netlist.h:1076
Definition: netlist.h:446
std::string netlist_id_
Definition: netlist.h:1052
vtr::vector_map< BlockId, BlockId > block_ids_
Definition: netlist.h:1056
vtr::vector_map< NetId, std::vector< PinId > > net_pins_
Definition: netlist.h:1091
vtr::Range< param_iterator > param_range
Definition: netlist.h:457
BlockId new_block_id(BlockId old_blk) const
vtr::vector_map< BlockId, std::unordered_map< std::string, std::string > > block_attrs_
Definition: netlist.h:1070
PortId new_port_id(PortId old_port) const
vtr::vector_map< BlockId, unsigned > block_num_input_pins_
Definition: netlist.h:1065
vtr::vector_map< PinId, int > pin_net_indices_
Definition: netlist.h:1085
vtr::vector_map< PortId, PortId >::const_iterator port_iterator
Definition: netlist.h:453
unsigned BitIndex
Definition: atom_netlist_fwd.h:41
vtr::vector_map< PinId, NetId > pin_nets_
Definition: netlist.h:1084
vtr::vector_map< BlockId, BlockId >::const_iterator block_iterator
Definition: netlist.h:448
std::unordered_map< std::string, StringId > string_to_string_id_
Definition: netlist.h:1103
vtr::vector_map< PinId, bool > pin_is_constant_
Definition: netlist.h:1086
std::string netlist_name_
Definition: netlist.h:1051
vtr::vector_map< BlockId, StringId > block_names_
Definition: netlist.h:1057