def test_split_gate(a, b): circ = common.split_gate('input', 4, 'a', 4, 'b') val = circ({ 'input': common.encode_int(4, a) + common.encode_int(4, b), })[0] assert common.decode_int(val['a']) == a assert common.decode_int(val['b']) == b
def test_signed_le(a, b): circ = common.signed_le_gate(3, left='a', right='b', output='out') val = circ({ 'a': common.encode_int(4, a, signed=True), 'b': common.encode_int(4, b, signed=True), })[0]['out'][0] assert val == (a <= b)
def test_eq(a, b): circ = common.eq_gate(4, left='a', right='b', output='out') val = circ({ 'a': common.encode_int(4, a), 'b': common.encode_int(4, b), })[0]['out'] assert val[0] == (a == b)
def test_unsigned_ge(a, b): circ = common.unsigned_ge_gate(2, left='a', right='b', output='out') val = circ({ 'a': common.encode_int(3, a, signed=False), 'b': common.encode_int(3, b, signed=False), })[0]['out'][0] assert val == (a >= b)
def test_subtraction(a, b): circ = common.subtract_gate(4, left='a', right='b', output='out') val = circ({ 'a': common.encode_int(4, a), 'b': common.encode_int(4, b), })[0]['out'] assert common.decode_int(val) == a - b
def test_bitwise_or(a, b): circ = common.bitwise_or(4, left='a', right='b', output='out') val = circ({ 'a': common.encode_int(4, a), 'b': common.encode_int(4, b), })[0]['out'] assert common.decode_int(val) == a | b
def test_combine_gate(a, b): circ = common.combine_gate(4, 'a', 4, 'b', output='out') val = circ({ 'a': common.encode_int(4, a), 'b': common.encode_int(4, b) })[0]['out'] assert common.decode_int(val[:4]) == a assert common.decode_int(val[4:]) == b
def _test_kmodels(k): circ = common.kmodels(4, k, input='x', output='x') models = 0 for i in range(2**4): val = circ({'x': common.encode_int(4, i, signed=False)})[0]['x'][0] if val: models += 1 assert models == k
def test_dec(a): circ = common.dec_gate(4, input='a', output='out') assert circ.inputs == {'a'} assert len(circ.aig.inputs) == 4 assert circ.outputs == {'out'} assert len(circ.aig.outputs) == 4 val = circ({'a': common.encode_int(4, a)})[0]['out'] assert common.decode_int(val) == a - 1
def test_logical_right_shift(a, b): circ = common.logical_right_shift_gate(8, b, 'a', output='out') val = circ({ 'a': common.encode_int(8, a, signed=True), })[0]['out'] val2 = common.decode_int(val) assert (val2 & (0xff >> b)) == ((a >> b) & (0xff >> b)) if b != 0: assert val[-1] is False
def test_seqcomp(a): circ1 = common.identity_gate(4, input='a', output='tmp') circ2 = common.identity_gate(4, input='tmp', output='out') circ3 = circ1 >> circ2 assert circ3.inputs == circ1.inputs assert circ3.outputs == circ2.outputs val = circ3({ 'a': common.encode_int(4, a), })[0]['out'] assert common.decode_int(val) == a
def test_lookup(a): lookup = {0: 0, 1: 1, 2: 0, 3: -1} circ = common.lookup(mapping=lookup, input='x', output='out', inlen=2, outlen=4, in_signed=False) val = circ({ 'x': common.encode_int(2, a, signed=False), })[0]['out'] assert common.decode_int(val) == lookup[a]
def feedback(self, inputs, outputs, initials=None, latches=None, keep_outputs=False, signed=False): if latches is None: latches = inputs idrop, imap = fn.lsplit(lambda x: x[0] in inputs, self.input_map) odrop, omap = fn.lsplit(lambda x: x[0] in outputs, self.output_map) wordlens = [len(vals) for i, vals in idrop] new_latches = [(n, common.named_indexes(k, n)) for k, n in zip(wordlens, latches)] if initials is None: initials = [0 for _ in inputs] assert len(inputs) == len(outputs) == len(initials) == len(latches) initials = fn.lcat( common.encode_int(k, i, signed) for k, i in zip(wordlens, initials)) def get_names(key_vals): return fn.lcat(fn.pluck(1, key_vals)) aig = self.aig.feedback( inputs=get_names(idrop), outputs=get_names(odrop), latches=get_names(new_latches), initials=initials, keep_outputs=keep_outputs, ) imap, odrop, omap = map(frozenset, [imap, odrop, omap]) return AIGBV( aig=aig, input_map=imap, output_map=omap | (odrop if keep_outputs else frozenset()), latch_map=self.latch_map | set(new_latches), )
def test_reverse(a): circ = common.reverse_gate(4, input='a', output='out') val = circ({'a': common.encode_int(4, a)})[0]['out'] assert common.decode_int(val[::-1]) == a
def test_identity(a): circ = common.identity_gate(4, input='a', output='out') val = circ({'a': common.encode_int(4, a)})[0]['out'] assert common.decode_int(val) == a
def test_arithmetic_right_shift(a, b): circ = common.arithmetic_right_shift_gate(8, b, 'a', output='out') val = circ({ 'a': common.encode_int(8, a, signed=True), })[0]['out'] assert common.decode_int(val) == a >> b
def test_abs(a): circ = common.abs_gate(8, 'a', output='out') val = circ({ 'a': common.encode_int(8, a, signed=True), })[0]['out'] assert common.decode_int(val) == abs(a)
def test_is_zero(a): circ = common.is_zero_gate(4, input='a', output='out') val = circ({'a': common.encode_int(4, a)})[0]['out'] assert val[0] == (a == 0)
def test_bitwise_negate(a): circ = common.bitwise_negate(4, input='a', output='out') val = circ({'a': common.encode_int(4, a)})[0]['out'] assert common.decode_int(val) == ~a