Verilog to Routing - VPR
netlist.h
Go to the documentation of this file.
1 #ifndef NETLIST_H
2 #define NETLIST_H
3 
415 #include <string>
416 #include <vector>
417 #include <unordered_map>
418 #include "vtr_range.h"
419 #include "vtr_logic.h"
420 #include "vtr_vector_map.h"
421 
422 #include "logic_types.h"
423 
424 #include "netlist_fwd.h"
425 #include "netlist_utils.h"
426 
427 //Forward declaration for private methods
428 template<typename BlockId, typename PortId, typename PinId, typename NetId>
430  public:
431  BlockId new_block_id(BlockId old_blk) const;
432  PortId new_port_id(PortId old_port) const;
433  PinId new_pin_id(PinId old_pin) const;
434  NetId new_net_id(NetId old_net) const;
435 
436  private:
438 
439  vtr::vector_map<BlockId, BlockId> block_id_map_;
440  vtr::vector_map<PortId, PortId> port_id_map_;
441  vtr::vector_map<PinId, PinId> pin_id_map_;
442  vtr::vector_map<NetId, NetId> net_id_map_;
443 };
444 
445 template<typename BlockId, typename PortId, typename PinId, typename NetId>
446 class Netlist {
447  public: //Public Types
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;
454 
455  typedef typename vtr::Range<block_iterator> block_range;
456  typedef typename vtr::Range<attr_iterator> attr_range;
457  typedef typename vtr::Range<param_iterator> param_range;
458  typedef typename vtr::Range<net_iterator> net_range;
459  typedef typename vtr::Range<pin_iterator> pin_range;
460  typedef typename vtr::Range<port_iterator> port_range;
461 
463 
464  public:
465  Netlist(std::string name = "", std::string id = "");
466  virtual ~Netlist();
467 
468  public: //Public Accessors
469  /*
470  * Netlist
471  */
473  const std::string& netlist_name() const;
474 
479  const std::string& netlist_id() const;
480 
481  /*
482  * Utility
483  */
484 
486  bool verify() const;
487 
489  bool is_dirty() const;
490 
495  bool is_compressed() const;
496 
498  void print_stats() const;
499 
500  /*
501  * Blocks
502  */
503 
505  const std::string& block_name(const BlockId blk_id) const;
506 
508  bool block_is_combinational(const BlockId blk_id) const;
509 
511  attr_range block_attrs(const BlockId blk_id) const;
512 
514  param_range block_params(const BlockId blk_id) const;
515 
517  pin_range block_pins(const BlockId blk_id) const;
518 
520  pin_range block_input_pins(const BlockId blk_id) const;
521 
528  pin_range block_output_pins(const BlockId blk_id) const;
529 
531  pin_range block_clock_pins(const BlockId blk_id) const;
532 
534  port_range block_ports(const BlockId blk_id) const;
535 
537  port_range block_input_ports(const BlockId blk_id) const;
538 
545  port_range block_output_ports(const BlockId blk_id) const;
546 
548  port_range block_clock_ports(const BlockId blk_id) const;
549 
555  void remove_block(const BlockId blk_id);
556 
557  /*
558  * Ports
559  */
560 
562  const std::string& port_name(const PortId port_id) const;
563 
565  BlockId port_block(const PortId port_id) const;
566 
568  pin_range port_pins(const PortId port_id) const;
569 
578  PinId port_pin(const PortId port_id, const BitIndex port_bit) const;
579 
586  NetId port_net(const PortId port_id, const BitIndex port_bit) const;
587 
589  BitIndex port_width(const PortId port_id) const;
590 
592  PortType port_type(const PortId port_id) const;
593 
599  void remove_port(const PortId port_id);
600 
601  /*
602  * Pins
603  */
604 
606  std::string pin_name(const PinId pin_id) const;
607 
609  PinType pin_type(const PinId pin_id) const;
610 
612  NetId pin_net(const PinId pin_id) const;
613 
615  int pin_net_index(const PinId pin_id) const;
616 
618  PortId pin_port(const PinId pin_id) const;
619 
621  BitIndex pin_port_bit(const PinId pin_id) const;
622 
624  BlockId pin_block(const PinId pin_id) const;
625 
627  PortType pin_port_type(const PinId pin_id) const;
628 
630  bool pin_is_constant(const PinId pin_id) const;
631 
638  void remove_pin(const PinId pin_id);
639 
640  /*
641  * Nets
642  */
643 
645  const std::string& net_name(const NetId net_id) const;
646 
653  pin_range net_pins(const NetId net_id) const;
654 
656  PinId net_pin(const NetId net_id, int net_pin_index) const;
657 
659  BlockId net_pin_block(const NetId net_id, int net_pin_index) const;
660 
662  PinId net_driver(const NetId net_id) const;
663 
665  BlockId net_driver_block(const NetId net_id) const;
666 
668  pin_range net_sinks(const NetId net_id) const;
669 
671  bool net_is_constant(const NetId net_id) const;
672 
679  void remove_net(const NetId net_id);
680 
689  void remove_net_pin(const NetId net_id, const PinId pin_id);
690 
691  /*
692  * Aggregates
693  */
694 
696  block_range blocks() const;
697 
699  port_range ports() const;
700 
702  net_range nets() const;
703 
705  pin_range pins() const;
706 
707  /*
708  * ID Checks
709  *
710  * Validates that the specified ID is valid in the current netlist state
711  */
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;
717 
718  /*
719  * Lookups
720  */
721 
727  BlockId find_block(const std::string& name) const;
728 
737  PortId find_port(const BlockId blk_id, const std::string& name) const;
738 
743  NetId find_net(const std::string& name) const;
744 
751  PinId find_pin(const PortId port_id, BitIndex port_bit) const;
752 
759  PinId find_pin(const std::string name) const;
760 
761  public: //Public Mutators
770  void set_pin_net(const PinId pin, PinType pin_type, const NetId net);
771 
780  void set_pin_is_constant(const PinId pin_id, const bool value);
781 
788  void set_block_name(const BlockId blk_id, const std::string new_name);
789 
797  void set_block_attr(const BlockId blk_id, const std::string& name, const std::string& value);
798 
806  void set_block_param(const BlockId blk_id, const std::string& name, const std::string& value);
807 
815  void merge_nets(const NetId driver_net, const NetId sink_net);
816 
817  /*
818  * Note: all remove_*() will mark the associated items as invalid, but the items
819  * will not be removed until compress() is called.
820  */
821 
827  IdRemapper remove_and_compress();
828 
837  void remove_unused();
838 
845  IdRemapper compress();
846 
847  protected: //Protected Mutators
853  BlockId create_block(const std::string name);
854 
863  PortId create_port(const BlockId blk_id, const std::string name, BitIndex width, PortType type);
864 
874  PinId create_pin(const PortId port_id, BitIndex port_bit, const NetId net_id, const PinType pin_type, bool is_const = false);
875 
880  NetId create_net(const std::string name); //An empty or existing net
881 
889  NetId add_net(const std::string name, PinId driver, std::vector<PinId> sinks);
890 
891  protected: //Protected Base Types
892  struct string_id_tag;
893 
895  typedef vtr::StrongId<string_id_tag> StringId;
896 
897  protected: //Protected Base Members
898  /*
899  * Lookups
900  */
901 
906  StringId find_string(const std::string& str) const;
907 
912  BlockId find_block(const StringId name_id) const;
913 
919  NetId find_net(const StringId name_id) const;
920 
921  /*
922  * Mutators
923  */
924 
930  StringId create_string(const std::string& str);
931 
937  int associate_pin_with_net(const PinId pin_id, const PinType type, const NetId net_id);
938 
940  void associate_pin_with_port(const PinId pin_id, const PortId port_id);
941 
943  void associate_pin_with_block(const PinId pin_id, const PortType type, const BlockId blk_id);
944 
946  void associate_port_with_block(const PortId port_id, const PortType type, const BlockId blk_id);
947 
948  /*
949  * Netlist compression/optimization
950  */
951 
958  IdRemapper build_id_maps();
959 
961  void clean_blocks(const vtr::vector_map<BlockId, BlockId>& block_id_map);
962 
964  void clean_ports(const vtr::vector_map<PortId, PortId>& port_id_map);
965 
967  void clean_pins(const vtr::vector_map<PinId, PinId>& pin_id_map);
968 
970  void clean_nets(const vtr::vector_map<NetId, NetId>& net_id_map);
971 
973  void rebuild_lookups();
974 
976  void rebuild_block_refs(const vtr::vector_map<PinId, PinId>& pin_id_map,
977  const vtr::vector_map<PortId, PortId>& port_id_map);
978 
980  void rebuild_port_refs(const vtr::vector_map<BlockId, BlockId>& block_id_map,
981  const vtr::vector_map<PinId, PinId>& pin_id_map);
982 
984  void rebuild_pin_refs(const vtr::vector_map<PortId, PortId>& port_id_map,
985  const vtr::vector_map<NetId, NetId>& net_id_map);
986 
988  void rebuild_net_refs(const vtr::vector_map<PinId, PinId>& pin_id_map);
989 
990  void shrink_to_fit();
991 
992  /*
993  * Sanity Checks
994  */
995 
996  //Verify the internal data structure sizes match
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;
1003 
1004  //Verify that internal data structure cross-references are consistent
1005  bool verify_refs() const; //All cross-references
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;
1011 
1013  bool verify_block_invariants() const;
1014 
1016  bool verify_lookups() const;
1017 
1019  bool valid_string_id(StringId string_id) const;
1020 
1021  protected: //Protected virtual functions implemented in derived classes
1022  //The functions follow the Non-Virtual Interface (NVI) idiom, and
1023  //are called from this class in their respective non-impl() functions.
1024  virtual void shrink_to_fit_impl() = 0;
1025 
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;
1030 
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;
1035 
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;
1040 
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;
1045 
1046  protected:
1047  constexpr static int INVALID_INDEX = -1;
1048  constexpr static int NET_DRIVER_INDEX = 0;
1049 
1050  private: //Data
1051  std::string netlist_name_;
1052  std::string netlist_id_;
1053  bool dirty_ = false;
1055  //Block data
1056  vtr::vector_map<BlockId, BlockId> block_ids_;
1057  vtr::vector_map<BlockId, StringId> block_names_;
1059  vtr::vector_map<BlockId, std::vector<PortId>> block_ports_;
1060  vtr::vector_map<BlockId, unsigned> block_num_input_ports_;
1061  vtr::vector_map<BlockId, unsigned> block_num_output_ports_;
1062  vtr::vector_map<BlockId, unsigned> block_num_clock_ports_;
1064  vtr::vector_map<BlockId, std::vector<PinId>> block_pins_;
1065  vtr::vector_map<BlockId, unsigned> block_num_input_pins_;
1066  vtr::vector_map<BlockId, unsigned> block_num_output_pins_;
1067  vtr::vector_map<BlockId, unsigned> block_num_clock_pins_;
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_;
1072  //Port data
1073  vtr::vector_map<PortId, PortId> port_ids_;
1074  vtr::vector_map<PortId, StringId> port_names_;
1075  vtr::vector_map<PortId, BlockId> port_blocks_;
1076  vtr::vector_map<PortId, std::vector<PinId>> port_pins_;
1077  vtr::vector_map<PortId, BitIndex> port_widths_;
1078  vtr::vector_map<PortId, PortType> port_types_;
1080  //Pin data
1081  vtr::vector_map<PinId, PinId> pin_ids_;
1082  vtr::vector_map<PinId, PortId> pin_ports_;
1083  vtr::vector_map<PinId, BitIndex> pin_port_bits_;
1084  vtr::vector_map<PinId, NetId> pin_nets_;
1085  vtr::vector_map<PinId, int> pin_net_indices_;
1086  vtr::vector_map<PinId, bool> pin_is_constant_;
1088  //Net data
1089  vtr::vector_map<NetId, NetId> net_ids_;
1090  vtr::vector_map<NetId, StringId> net_names_;
1091  vtr::vector_map<NetId, std::vector<PinId>> net_pins_;
1093  //String data
1094  // We store each unique string once, and reference it by an StringId
1095  // This avoids duplicating the strings in the fast look-ups (i.e. the look-ups
1096  // only store the Ids)
1097  vtr::vector_map<StringId, StringId> string_ids_;
1098  vtr::vector_map<StringId, std::string> strings_;
1100  private: //Fast lookups
1101  vtr::vector_map<StringId, BlockId> block_name_to_block_id_;
1102  vtr::vector_map<StringId, NetId> net_name_to_net_id_;
1103  std::unordered_map<std::string, StringId> string_to_string_id_;
1104 };
1105 
1106 #include "netlist.tpp"
1107 #endif
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