Horizon
Loading...
Searching...
No Matches
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
18namespace horizon {
19using json = nlohmann::json;
20
29class Block {
30public:
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
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
134private:
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:15
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