def chain(n, state_name='x', action='a', start=None, clip=True, can_stay=True): if start is None: start = n // 2 else: start -= 1 start = encode_int(n, 1 << start, signed=False) x = atom(n, state_name, signed=False) a = atom(2, action, signed=False) backward, forward = a[0], a[1] x2 = ite(forward, x << 1, x >> 1) stay = atom(1, 1, signed=False) if clip: stay = (x2 == 0) if can_stay: stay |= ~(forward | backward) if clip or can_stay: x2 = ite(stay, x, x2) circ = x2.aigbv['o', {x2.output: state_name}] return circ.feedback(inputs=[state_name], outputs=[state_name], initials=[start], keep_outputs=True)
def encode_inputs(inputs, imap, encodings): for key, val in inputs.items(): size = imap[key].size if key in encodings: # Convert to tuple of bools. val = encodings[key].encode(val) assert isinstance(val, int) val = BV.encode_int(size, val, signed=False) assert len(val) == size yield key, val
def chain(n, state_name='x', action='H'): bits = n + 1 start = encode_int(bits, 1, signed=False) x = atom(bits, state_name, signed=False) forward = atom(1, action, signed=False) x2 = ite(forward, x << 1, x) circ = x2.aigbv['o', {x2.output: state_name}] return circ.feedback(inputs=[state_name], outputs=[state_name], latches=[f"{state_name}_prev"], initials=[start], keep_outputs=True)
def _encode_wiring(self, wiring): if 'init' not in wiring: return wiring wiring = dict(wiring) # copy to avoid side-effect. name, init = wiring['input'], wiring['init'] if wiring.get('input_encoding', True): encodings = self.input_encodings else: encodings = self.output_encodings if name in encodings: init = wiring['encoding'].encode(init) assert isinstance(init, int) size = self.circ.imap[name].size wiring['init'] = BV.encode_int(size, init, signed=False) return wiring
def encode_state(x, y): x, y = [BV.encode_int(8, 1 << (v - 1), signed=False) for v in (x, y)] return {'x': tuple(x), 'y': tuple(y)}