예제 #1
0
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)
예제 #2
0
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
예제 #3
0
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)
예제 #4
0
    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
예제 #5
0
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)}