Horizon
block.hpp
1 #pragma once
2 #include "bus.hpp"
3 #include "component.hpp"
4 #include "nlohmann/json_fwd.hpp"
5 #include "net.hpp"
6 #include "net_class.hpp"
7 #include "util/uuid.hpp"
8 #include "bom_export_settings.hpp"
9 #include "block_instance.hpp"
10 #include "net_tie.hpp"
11 #include <map>
12 #include <set>
13 #include <vector>
14 #include "util/item_set.hpp"
15 #include "util/uuid_vec.hpp"
16 #include "util/template_util.hpp"
17 
18 namespace horizon {
19 using json = nlohmann::json;
20 
29 class Block {
30 public:
31  Block(const UUID &uu, const json &, class IPool &pool, class IBlockProvider &prv);
32  Block(const UUID &uu);
33  static Block new_from_file(const std::string &filename, IPool &pool, class IBlockProvider &prv);
34  static std::map<std::string, std::string> peek_project_meta(const std::string &filename);
35  static std::set<UUID> peek_instantiated_blocks(const std::string &filename);
36  Net *get_net(const UUID &uu);
37  UUID uuid;
38  std::string name;
39  std::map<UUID, Net> nets;
40  std::map<UUID, NetTie> net_ties;
41  std::map<UUID, Bus> buses;
42  std::map<UUID, Component> components;
43  std::map<UUID, BlockInstance> block_instances;
44  std::map<UUID, NetClass> net_classes;
45  uuid_ptr<NetClass> net_class_default = nullptr;
46 
47  std::map<UUIDVec, BlockInstanceMapping> block_instance_mappings;
48 
49  std::map<UUID, std::string> group_names;
50  std::map<UUID, std::string> tag_names;
51  std::map<std::string, std::string> project_meta;
52  std::string get_group_name(const UUID &uu) const;
53  std::string get_tag_name(const UUID &uu) const;
54 
55  BOMExportSettings bom_export_settings;
56  std::map<const class Part *, BOMRow> get_BOM(const BOMExportSettings &settings) const;
57 
58  bool can_swap_gates(const UUID &comp, const UUID &g1, const UUID &g2) const;
59  void swap_gates(const UUID &comp, const UUID &g1, const UUID &g2);
60 
61  Block(const Block &block);
62  void operator=(const Block &block);
63 
64  void merge_nets(Net *net, Net *into);
65 
69  void vacuum_nets();
70  void vacuum_group_tag_names();
71 
77  struct NetPinsAndPorts {
78  std::set<UUIDPath<3>> pins; // component/gate/pin
79  std::set<UUIDPath<2>> ports; // instance/port
80  };
81  Net *extract_pins(const NetPinsAndPorts &pins, Net *net = nullptr);
82 
83  void update_connection_count();
84 
85  void update_diffpairs();
86 
91  Net *insert_net();
92 
93  std::string get_net_name(const UUID &uu) const;
94 
95  ItemSet get_pool_items_used() const;
96 
97  void update_non_top(Block &other) const;
98 
99  void create_instance_mappings();
100 
101  Block flatten() const;
102 
103  UUID get_uuid() const;
104 
105  BlockInstanceMapping::ComponentInfo get_component_info(const Component &comp, const UUIDVec &instance_path) const;
106  std::string get_refdes(const Component &comp, const UUIDVec &instance_path) const;
107  void set_refdes(Component &comp, const UUIDVec &instance_path, const std::string &rd);
108  void set_nopopulate(Component &comp, const UUIDVec &instance_path, bool nopopulate);
109 
110  template <bool c> struct BlockItem {
111  BlockItem(make_const_ref_t<c, Block> b, const UUIDVec &p) : block(b), instance_path(p)
112  {
113  }
114  make_const_ref_t<c, Block> block;
115  UUIDVec instance_path;
116  };
117 
118  std::vector<BlockItem<false>> get_instantiated_blocks();
119  std::vector<BlockItem<true>> get_instantiated_blocks() const;
120  std::vector<BlockItem<false>> get_instantiated_blocks_and_top();
121  std::vector<BlockItem<true>> get_instantiated_blocks_and_top() const;
122 
123  std::string instance_path_to_string(const UUIDVec &instance_path) const;
124 
125  bool can_delete_power_net(const UUID &uu) const;
126 
127  bool can_add_block_instance(const UUID &where, const UUID &block_inst) const;
128 
129  json serialize() const;
130 
131  static const size_t max_instance_path_len;
132  static bool instance_path_too_long(const UUIDVec &path, const char *funcname);
133 
134 private:
135  void update_refs();
136  std::vector<BlockItem<false>> get_instantiated_blocks(bool inc_top);
137  std::vector<BlockItem<true>> get_instantiated_blocks(bool inc_top) const;
138 };
139 } // namespace horizon
Definition: bom_export_settings.hpp:12
Definition: block_instance.hpp:13
A block is one level of hierarchy in the netlist.
Definition: block.hpp:29
Net * insert_net()
creates new net
Definition: block.cpp:166
void vacuum_nets()
deletes unreferenced nets
Definition: block.cpp:220
A Component is an instanced Entity in a Block.
Definition: component.hpp:40
Definition: iblock_provider.hpp:5
Definition: ipool.hpp:14
Definition: net.hpp:11
This class encapsulates a UUID and allows it to be uses as a value type.
Definition: uuid.hpp:16
Definition: uuid_ptr.hpp:8
a class to store JSON values
Definition: json.hpp:177
basic_json<> json
default JSON class
Definition: json_fwd.hpp:62
Definition: block.hpp:110
Takes pins specified by pins&ports and moves them over to net.
Definition: block.hpp:77