def test_merge(self): a = Bus(1) b = Bus(1, 1) buses = [a, b] merged = Bus.merge(buses) for a, b in zip(buses, merged): self.assertEqual(a, b)
def sweep(cls, buses): """From dict of buses, generate list of signals that sweep over all possible value for buses. Return instance of SignalGen with the list of dictionaries as signals""" labels = list(buses.keys()) listed_buses = [buses[label] for label in labels] super_bus = Bus.merge(listed_buses) #tuple of slices that will enable isolating the signal value for a bus at each time #tuple consists of a right bitshift value and a mask to isolate the value of the signal #for that particular bus bus_slices = [(0, 2**len(listed_buses[0]) - 1)] bus_slices += [(len(Bus.merge(listed_buses[:i + 1])), 2**len(bus) - 1) for i, bus in enumerate(listed_buses[1:])] values = range(2**len(super_bus)) signals = [] for value in values: d = { label: (value >> slice[0]) & (slice[1]) for label, slice in zip(labels, bus_slices) } signals.append(d) return cls(buses, signals)
def make(self): i = self.get_inputs() word_size = self.sizes['a'] adders = [FullAdder(size=1) for _ in range(word_size)] a_split = i.a.split() b_split = i.b.split() #set input for adders for a, b, adder in zip(a_split, b_split, adders): adder.connect(a=a, b=b) #set cins adders[0].connect(cin=i.cin) for i, adder in enumerate(adders[1:]): adder.connect(cin=adders[i].cout) s = Bus.merge([adder.s for adder in adders]) self.set_outputs(s=s, cout=adders[-1].cout)
def y(self): return Bus.merge(self.get_buses(self.output_labels))