isomatch
circuitGroup.h
Go to the documentation of this file.
1 #pragma once
2 #include <string>
3 #include <vector>
4 #include <exception>
5 
6 #include "wireId.h"
7 #include "wireManager.h"
8 #include "circuitTree.h"
9 #include "subcircMatch.h"
10 
11 class CircuitGroup;
12 
14 class IOPin {
15  public:
16  class AlreadyConnected : std::exception {};
17 
19 
23  IOPin(std::string formalName, WireId* actual, CircuitGroup* group);
24 
28  void connect(WireId* formal);
29 
30  WireId* formal() const { return _formal; }
31  std::string formalName() const { return _formalName; }
32  WireId* actual() const { return _actual; }
33  CircuitGroup* group() const { return _group; }
34 
35  private:
36  void link();
37 
38  WireId* _formal;
39  std::string _formalName;
40  WireId* _actual;
41  CircuitGroup* _group;
42 
43  friend CircuitGroup;
44 };
45 
46 
47 class CircuitGroup : public CircuitTree {
48  protected:
49  // ========= I/O ITERATOR =============================================
51  typedef std::vector<IOPin*>::const_iterator LowIter;
52  LowIter ptr;
53  const CircuitGroup* circ;
54  public:
55  InnerIoIter(const CircuitGroup* circ, LowIter lowIter)
56  : ptr(lowIter), circ(circ)
57  {
58  nextValid();
59  }
61  : ptr(it.ptr) {}
62  virtual void operator++();
63  virtual WireId* operator*() { return (*ptr)->formal(); }
64  virtual InnerIoIter* clone() const {
65  return new InnerIoIter(*this);
66  }
67  protected:
68  virtual bool equal(const CircuitTree::InnerIoIter& oth_) const
69  {
70  const InnerIoIter& oth =
71  static_cast<const InnerIoIter&>(oth_);
72  return ptr == oth.ptr && circ == oth.circ;
73  }
74  private:
75  void nextValid();
76  void innerIncr();
77  };
78 
79  public:
80  IoIter inp_begin() const {
81  return IoIter(
82  new InnerIoIter(this, grpInputs.begin())
83  );
84  }
85  IoIter out_begin() const {
86  return IoIter(
87  new InnerIoIter(this, grpOutputs.begin())
88  );
89  }
90  IoIter out_end() const {
91  return IoIter(
92  new InnerIoIter(this, grpOutputs.end())
93  );
94  }
95  // ========= END I/O ITERATOR =========================================
96 
100  CircuitGroup(const std::string& name);
101 
108  CircuitGroup(const std::string& name, WireManager* manager);
109 
111  ~CircuitGroup();
112 
113  CircType circType() const { return CIRC_GROUP; }
114 
120  void addChild(CircuitTree* child);
121 
125  void addInput(const IOPin& pin);
126 
130  void addInput(const std::string& formal, WireId* actual);
131 
135  void addOutput(const IOPin& pin);
136 
140  void addOutput(const std::string& formal, WireId* actual);
141 
145  std::vector<CircuitTree*>& getChildren();
149  const std::vector<CircuitTree*>& getChildren() const;
150 
152  const std::vector<CircuitTree*>& getChildrenCst() const;
153 
156  std::vector<IOPin*>& getInputs();
158  const std::vector<IOPin*>& getInputs() const;
159 
162  std::vector<IOPin*>& getOutputs();
164  const std::vector<IOPin*>& getOutputs() const;
165 
170  sign_t ioSigOf(WireId* id);
171 
173  WireManager* wireManager() { return wireManager_; }
174  // Note: this cannot be `const`, since the `wireManager_` is muted
175  // whenever one tries to allocate a wire.
176 
182  std::vector<MatchResult> find(CircuitGroup* needle);
183 
185  const std::string& name() const { return name_; }
186 
187  // Documentation in CircuitTree*
188  size_t inputCount() const;
189  size_t outputCount() const;
190  WireId* nth_input(size_t circId) const;
191  WireId* nth_output(size_t circId) const;
192 
193  virtual void unplug();
194 
195  void toDot(std::basic_ostream<char>& out, int indent=0);
196 
197  protected:
198  void alteredChild();
199 
200  virtual sign_t innerSignature() const;
201  virtual bool innerEqual(CircuitTree* othTree);
202  void computeIoSigs();
203 
204  private:
206  class NoSuchChild: public std::exception {};
207 
208  void setAncestor(CircuitTree* tree) const;
209 
212  void disconnectChild(CircuitTree* toRemove);
213 
214  std::string name_;
215 
216  WireManager* wireManager_;
217 
218  std::vector<CircuitTree*> grpChildren;
219  std::vector<IOPin*> grpInputs, grpOutputs;
220 
221  memo_ts_t ioSigsTimestamp;
222  std::unordered_map<WireId*, sign_t> ioSigs_;
223 
224  friend class CircuitTree;
225 };
226 
WireManager * wireManager()
Definition: circuitGroup.h:173
InnerIoIter(const InnerIoIter &it)
Definition: circuitGroup.h:60
const std::string & name() const
Get the group&#39;s name.
Definition: circuitGroup.h:185
Definition: circuitTree.h:13
CircType circType() const
Definition: circuitGroup.h:113
IoIter out_end() const
Definition: circuitGroup.h:90
Definition: circuitGroup.h:50
Definition: wireId.h:21
CircuitGroup * group() const
Definition: circuitGroup.h:33
IoIter out_begin() const
Definition: circuitGroup.h:85
std::ostream & indent(std::ostream &stream, int indent)
Definition: dotPrint.cpp:21
void connect(WireId *formal)
Definition: circuitGroup.cpp:23
WireId * formal() const
Definition: circuitGroup.h:30
Definition: wireManager.h:17
Definition: circuitGroup.h:16
Definition: circuitGroup.h:47
virtual bool equal(const CircuitTree::InnerIoIter &oth_) const
Definition: circuitGroup.h:68
IOPin(WireId *formal, WireId *actual, CircuitGroup *group)
Definition: circuitGroup.cpp:13
Definition: circuitGroup.h:14
IoIter inp_begin() const
Definition: circuitGroup.h:80
WireId * actual() const
Definition: circuitGroup.h:32
size_t memo_ts_t
Definition: circuitTree.h:194
Definition: circuitTree.h:49
virtual InnerIoIter * clone() const
Definition: circuitGroup.h:64
Definition: circuitTree.h:10
InnerIoIter(const CircuitGroup *circ, LowIter lowIter)
Definition: circuitGroup.h:55
std::string formalName() const
Definition: circuitGroup.h:31
uint64_t sign_t
Type of a circuit signature.
Definition: isomatch.h:26
virtual WireId * operator*()
Definition: circuitGroup.h:63
CircType
Definition: circuitTree.h:40