-
Notifications
You must be signed in to change notification settings - Fork 0
/
net.cpp
67 lines (62 loc) · 2.49 KB
/
net.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <queue>
#include "aspng.h"
#include "common.h"
#include "net.h"
Net::Net(std::shared_ptr<Port> starting_port, std::set<std::shared_ptr<Port>> &contained_ports) {
this->new_value = EmptyElectricalValue;
this->ports_in_net.insert(starting_port);
ASSERT(contained_ports.find(starting_port) == contained_ports.end());
contained_ports.insert(starting_port);
std::queue<std::shared_ptr<Port>> ports_to_visit;
ports_to_visit.push(starting_port);
while (!ports_to_visit.empty()) {
// Take a port off the to_visit queue.
auto port = ports_to_visit.front();
ports_to_visit.pop();
// What (immediate) other ports can be reached through this port?
auto more_ports_to_visit = port->propagate(port);
for (auto i = more_ports_to_visit.begin(); i != more_ports_to_visit.end(); i++) {
auto port2 = *i;
if (this->ports_in_net.find(port2) == this->ports_in_net.end()) {
this->ports_in_net.insert(port2);
ASSERT(contained_ports.find(port2) == contained_ports.end());
contained_ports.insert(port2);
ports_to_visit.push(port2);
}
}
}
}
// The value of a net is a function of the values of the individual
// Port-Devices in the net.
void Net::compute_new_value(void) {
this->new_value = EmptyElectricalValue;
// For each Port in the Net, figure out the new value and combine that
// value with what we have so far.
for (auto i = this->ports_in_net.begin(); i != this->ports_in_net.end(); i++) {
auto port = *i;
ElectricalValue v = port->compute_new_value(port);
try {
this->new_value = combine_electrical_values(v, this->new_value);
} catch (ElectricalValueException &e) {
throw AspngSimException("Net::compute_new_value", this->get_bounding_box());
}
}
}
void Net::apply_new_value(void) {
for (auto i = this->ports_in_net.begin(); i != this->ports_in_net.end(); i++) {
auto port = *i;
try {
port->apply_new_value(port, this->new_value);
} catch (ElectricalValueException &e) {
throw AspngSimException("Net::apply_new_value", this->get_bounding_box());
}
}
}
BoundingBox Net::get_bounding_box(void) {
BoundingBox bounding_box;
for (auto i = this->ports_in_net.begin(); i != this->ports_in_net.end(); i++) {
auto port = *i;
port->expand_bounding_box(bounding_box);
}
return bounding_box;
}