122 lines
3.5 KiB
Python
122 lines
3.5 KiB
Python
#KOMPONENTY PROPOJU
|
|
|
|
#todo ??
|
|
class wire():
|
|
def __init__(self, index):
|
|
self.index = index
|
|
|
|
class bus():
|
|
#inicializace sbernice
|
|
def __init__(self, N=1):
|
|
self.bus = [wire(index=i) for i in range(N)]
|
|
self.N = len(self.bus)
|
|
|
|
#vraci drat na prislusnem indexu sbernice
|
|
def get(self, wire_index):
|
|
return self.bus[wire_index]
|
|
|
|
#pripojeni vstupni, vystupni hodnoty komponenty k sbernici
|
|
def connect(self, wire_index, component_output_value):
|
|
self.bus[wire_index].value = component_output_value
|
|
|
|
#KOMPONENTY HRADEL
|
|
class not_gate():
|
|
def __init__(self, input_a):
|
|
self.input_a = input_a
|
|
if self.input_a == 1:
|
|
self.y = 0
|
|
else:
|
|
self.y = 1
|
|
|
|
class two_input_gate():
|
|
def __init__(self, input_a, input_b):
|
|
self.input_a = input_a
|
|
self.input_b = input_b
|
|
|
|
class or_gate(two_input_gate):
|
|
def __init__(self, input_a, input_b):
|
|
super().__init__(input_a, input_b)
|
|
if (self.input_a == 1 or self.input_b == 1):
|
|
self.y = 1
|
|
else:
|
|
self.y = 0
|
|
|
|
class xor_gate(two_input_gate):
|
|
def __init__(self, input_a, input_b):
|
|
if (input_a == 1 and input_b == 0) or (input_a == 0 and input_b == 1):
|
|
self.y = 1
|
|
else:
|
|
self.y = 0
|
|
|
|
class and_gate(two_input_gate):
|
|
def __init__(self, input_a, input_b):
|
|
if input_a == 1 and input_b == 1:
|
|
self.y = 1
|
|
else:
|
|
self.y = 0
|
|
|
|
|
|
|
|
#ARITMETICKE OBVODY
|
|
class arithmetic_circuit():
|
|
def __init__(self):
|
|
self.component_list = []
|
|
|
|
def add_component(self, component):
|
|
self.component_list.append(component)
|
|
|
|
#Export do jinych reprezentaci
|
|
def to_C():
|
|
pass
|
|
|
|
|
|
class half_adder(arithmetic_circuit):
|
|
def __init__(self, input_a, input_b):
|
|
super().__init__()
|
|
#2 draty pro vystupy komponenty (sum, cout)
|
|
self.out = bus(2)
|
|
|
|
#Sum
|
|
#XOR hradlo pro vypocet jednobitového souctu (sum)
|
|
obj_xor_gate = xor_gate(input_a, input_b)
|
|
self.add_component(obj_xor_gate)
|
|
self.out.connect(0,obj_xor_gate.y)
|
|
|
|
#Cout
|
|
#AND hradlo pro vypocet jednobitoveho priznaku prenosu do vyssiho radu (cout)jednobitového souctu (sum)
|
|
obj_and_gate = and_gate(input_a, input_b)
|
|
self.add_component(obj_and_gate)
|
|
self.out.connect(1,obj_and_gate.y)
|
|
|
|
class full_adder(arithmetic_circuit):
|
|
def __init__(self, input_a, input_b, carry_in):
|
|
super().__init__()
|
|
|
|
#2 draty pro vystupy komponenty (sum, cout)
|
|
self.out = bus(2)
|
|
|
|
#PG logika
|
|
propagate_xor_gate1 = xor_gate(input_a, input_b)
|
|
self.add_component(propagate_xor_gate1)
|
|
generate_and_gate1 = and_gate(input_a, input_b)
|
|
self.add_component(generate_and_gate1)
|
|
|
|
#Sum
|
|
#XOR hradlo pro vypocet jednobitového souctu (sum)
|
|
obj_xor_gate2 = xor_gate(propagate_xor_gate1.y, carry_in)
|
|
self.add_component(obj_xor_gate2)
|
|
self.out.connect(0,obj_xor_gate2.y)
|
|
|
|
#Cout
|
|
#AND hradlo pro vypocet jednobitoveho priznaku prenosu do vyssiho radu (cout)jednobitového souctu (sum)
|
|
obj_and_gate2 = and_gate(propagate_xor_gate1.y, carry_in)
|
|
self.add_component(obj_and_gate2)
|
|
|
|
obj_or_gate = or_gate(generate_and_gate1.y, obj_and_gate2.y)
|
|
self.add_component(obj_or_gate)
|
|
|
|
self.out.connect(1,obj_or_gate.y)
|
|
|
|
#todo nechat?
|
|
self.propagate = propagate_xor_gate1.y
|
|
self.generate = generate_and_gate1.y |