|
2 | 2 | from functools import reduce |
3 | 3 | from typing import Tuple, FrozenSet, NamedTuple, Union |
4 | 4 |
|
| 5 | +import attr |
5 | 6 | import funcy as fn |
6 | 7 | from toposort import toposort |
7 | 8 |
|
@@ -66,7 +67,8 @@ def _is_const_true(node): |
66 | 67 | Node = Union[AndGate, ConstFalse, Inverter, Input, LatchIn] |
67 | 68 |
|
68 | 69 |
|
69 | | -class AIG(NamedTuple): |
| 70 | +@attr.s(frozen=True, slots=True, auto_attribs=True, repr=False) |
| 71 | +class AIG: |
70 | 72 | inputs: FrozenSet[str] = frozenset() |
71 | 73 | node_map: FrozenSet[Tuple[str, Node]] = frozenset() |
72 | 74 | latch_map: FrozenSet[Tuple[str, Node]] = frozenset() |
@@ -98,6 +100,9 @@ def __getitem__(self, others): |
98 | 100 | input_kinds = (Input,) if kind == 'i' else (LatchIn,) |
99 | 101 | return seq_compose(cmn.tee(relabels), self, input_kinds=input_kinds) |
100 | 102 |
|
| 103 | + def evolve(self, **kwargs): |
| 104 | + return attr.evolve(self, **kwargs) |
| 105 | + |
101 | 106 | @property |
102 | 107 | def outputs(self): |
103 | 108 | return frozenset(fn.pluck(0, self.node_map)) |
@@ -165,7 +170,7 @@ def sub(node): |
165 | 170 |
|
166 | 171 | circ = self._modify_leafs(sub) |
167 | 172 | _cones = {(l_map[k][0], v) for k, v in circ.latch_map if k in latches} |
168 | | - aig = self._replace( |
| 173 | + aig = self.evolve( |
169 | 174 | node_map=circ.node_map | _cones, |
170 | 175 | inputs=self.inputs | {n for n, _ in l_map.values()}, |
171 | 176 | latch_map={(k, v) for k, v in circ.latch_map if k not in latches}, |
@@ -201,7 +206,7 @@ def sub(node): |
201 | 206 | out2latch = {oname: lname for oname, lname in zip(outputs, latches)} |
202 | 207 | _latch_map = {(out2latch[k], v) for k, v in _latch_map} |
203 | 208 | l2init = frozenset((n, val) for n, val in zip(latches, initials)) |
204 | | - return aig._replace( |
| 209 | + return aig.evolve( |
205 | 210 | inputs=aig.inputs - set(inputs), |
206 | 211 | node_map=aig.node_map if keep_outputs else frozenset(node_map), |
207 | 212 | latch_map=aig.latch_map | _latch_map, |
@@ -261,7 +266,7 @@ def _mod(node): |
261 | 266 |
|
262 | 267 | node_map = ((name, _mod(cone)) for name, cone in self.node_map) |
263 | 268 | latch_map = ((name, _mod(cone)) for name, cone in self.latch_map) |
264 | | - return self._replace( |
| 269 | + return self.evolve( |
265 | 270 | node_map=frozenset(node_map), |
266 | 271 | latch_map=frozenset(latch_map) |
267 | 272 | ) |
|
0 commit comments