Made small bugfixes in C code generation.
This commit is contained in:
parent
2a4609234c
commit
b7c896872e
@ -8,10 +8,10 @@ class wire():
|
|||||||
def get_declaration_c(self):
|
def get_declaration_c(self):
|
||||||
return f" uint8_t {self.name} = 0;\n"
|
return f" uint8_t {self.name} = 0;\n"
|
||||||
|
|
||||||
def get_wire_value(self, offset : int = 0):
|
def get_wire_value_c(self, offset : int = 0):
|
||||||
return f"(({self.name} >> {offset}) & 0x01)"
|
return f"(({self.name} >> {offset}) & 0x01)"
|
||||||
|
|
||||||
def return_wire_value(self, offset : int = 0):
|
def return_wire_value_c(self, offset : int = 0):
|
||||||
return f"({self.name} & 0x01) << {offset}"
|
return f"({self.name} & 0x01) << {offset}"
|
||||||
|
|
||||||
class bus():
|
class bus():
|
||||||
@ -28,11 +28,11 @@ class bus():
|
|||||||
def connect(self, out_wire_index : int, inner_component_out_wire : wire):
|
def connect(self, out_wire_index : int, inner_component_out_wire : wire):
|
||||||
self.bus[out_wire_index] = inner_component_out_wire
|
self.bus[out_wire_index] = inner_component_out_wire
|
||||||
|
|
||||||
def get_wire_value(self, offset : int = 0):
|
def get_wire_value_c(self, offset : int = 0):
|
||||||
self.bus[offset].get_wire_value(offset)
|
self.bus[offset].get_wire_value_c(offset)
|
||||||
|
|
||||||
def return_wire_value(self, offset : int = 0):
|
def return_wire_value_c(self, offset : int = 0):
|
||||||
self.bus[offset].return_wire_value(offset)
|
self.bus[offset].return_wire_value_c(offset)
|
||||||
|
|
||||||
def get_declaration_c(self):
|
def get_declaration_c(self):
|
||||||
if self.N > 8:
|
if self.N > 8:
|
||||||
@ -46,6 +46,11 @@ class bus():
|
|||||||
|
|
||||||
#KOMPONENTY HRADEL
|
#KOMPONENTY HRADEL
|
||||||
class logic_gate():
|
class logic_gate():
|
||||||
|
def __init__(self, a : wire, b : wire, prefix : str = "w"):
|
||||||
|
self.a = wire(prefix+"_"+a.name.replace(prefix+"_", ''),a.value)
|
||||||
|
self.b = wire(prefix+"_"+b.name.replace(prefix+"_", ''),b.value)
|
||||||
|
self.prefix = prefix
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_includes_c():
|
def get_includes_c():
|
||||||
return f"#include <stdio.h>\n#include <stdint.h>\n\n"
|
return f"#include <stdio.h>\n#include <stdint.h>\n\n"
|
||||||
@ -60,7 +65,9 @@ class logic_gate():
|
|||||||
return f"{self.a.name} {self.operator} {self.b.name}"
|
return f"{self.a.name} {self.operator} {self.b.name}"
|
||||||
|
|
||||||
def get_function_c(self):
|
def get_function_c(self):
|
||||||
return f"{self.a.get_wire_value()} {self.operator} {self.b.get_wire_value(0)}"
|
self.a.name = self.a.name.replace(self.prefix+"_", '')
|
||||||
|
self.b.name = self.b.name.replace(self.prefix+"_", '')
|
||||||
|
return f"{self.a.get_wire_value_c()} {self.operator} {self.b.get_wire_value_c(0)}"
|
||||||
|
|
||||||
#generovani samostatneho obvodu logickeho hradla do jazyka C
|
#generovani samostatneho obvodu logickeho hradla do jazyka C
|
||||||
def get_c_code(self, file_object):
|
def get_c_code(self, file_object):
|
||||||
@ -75,6 +82,7 @@ class not_gate(logic_gate):
|
|||||||
self.gate_type = 'not_gate'
|
self.gate_type = 'not_gate'
|
||||||
self.operator = '~'
|
self.operator = '~'
|
||||||
self.a = wire(prefix+"_"+a.name.replace(prefix+"_", ''),a.value)
|
self.a = wire(prefix+"_"+a.name.replace(prefix+"_", ''),a.value)
|
||||||
|
self.prefix = prefix
|
||||||
|
|
||||||
if self.a.value == 1:
|
if self.a.value == 1:
|
||||||
self.output = wire(name=prefix+"_y"+str(outid),value=0)
|
self.output = wire(name=prefix+"_y"+str(outid),value=0)
|
||||||
@ -91,15 +99,15 @@ class not_gate(logic_gate):
|
|||||||
return f"{self.operator}{self.a.name}"
|
return f"{self.operator}{self.a.name}"
|
||||||
|
|
||||||
def get_function_c(self):
|
def get_function_c(self):
|
||||||
return f"{self.operator}{self.a.get_wire_value()} & 0x01 << 0"
|
self.a.name = self.a.name.replace(self.prefix+"_", '')
|
||||||
|
return f"{self.operator}{self.a.get_wire_value_c()} & 0x01 << 0"
|
||||||
|
|
||||||
#dvouvstupove
|
#dvouvstupove
|
||||||
class and_gate(logic_gate):
|
class and_gate(logic_gate):
|
||||||
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
||||||
|
super().__init__(a,b,prefix)
|
||||||
self.gate_type = 'and_gate'
|
self.gate_type = 'and_gate'
|
||||||
self.operator = '&'
|
self.operator = '&'
|
||||||
self.a = wire(prefix+"_"+a.name.replace(prefix+"_", ''),a.value)
|
|
||||||
self.b = wire(prefix+"_"+b.name.replace(prefix+"_", ''),a.value)
|
|
||||||
|
|
||||||
if a.value == 1 and b.value == 1:
|
if a.value == 1 and b.value == 1:
|
||||||
self.output = wire(name=prefix+"_y"+str(outid),value=1)
|
self.output = wire(name=prefix+"_y"+str(outid),value=1)
|
||||||
@ -108,12 +116,11 @@ class and_gate(logic_gate):
|
|||||||
|
|
||||||
class nand_gate(logic_gate):
|
class nand_gate(logic_gate):
|
||||||
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
||||||
|
super().__init__(a,b,prefix)
|
||||||
self.gate_type = 'nand_gate'
|
self.gate_type = 'nand_gate'
|
||||||
self.operator = '&'
|
self.operator = '&'
|
||||||
self.a = wire(prefix+"_"+a.name.replace(prefix+"_", ''),a.value)
|
|
||||||
self.b = wire(prefix+"_"+b.name.replace(prefix+"_", ''),a.value)
|
|
||||||
|
|
||||||
if self.a.value == 1 and self.b.value == 1:
|
if (self.a.value == 1 and self.b.value == 1):
|
||||||
self.output = wire(name=prefix+"_y"+str(outid),value=0)
|
self.output = wire(name=prefix+"_y"+str(outid),value=0)
|
||||||
else:
|
else:
|
||||||
self.output = wire(name=prefix+"_y"+str(outid),value=1)
|
self.output = wire(name=prefix+"_y"+str(outid),value=1)
|
||||||
@ -124,10 +131,9 @@ class nand_gate(logic_gate):
|
|||||||
|
|
||||||
class or_gate(logic_gate):
|
class or_gate(logic_gate):
|
||||||
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
||||||
|
super().__init__(a,b,prefix)
|
||||||
self.gate_type = 'or_gate'
|
self.gate_type = 'or_gate'
|
||||||
self.operator = '|'
|
self.operator = '|'
|
||||||
self.a = wire(prefix+"_"+a.name.replace(prefix+"_", ''),a.value)
|
|
||||||
self.b = wire(prefix+"_"+b.name.replace(prefix+"_", ''),a.value)
|
|
||||||
|
|
||||||
if self.a.value == 1 or self.b.value == 1:
|
if self.a.value == 1 or self.b.value == 1:
|
||||||
self.output = wire(name=prefix+"_y"+str(outid),value=1)
|
self.output = wire(name=prefix+"_y"+str(outid),value=1)
|
||||||
@ -136,10 +142,9 @@ class or_gate(logic_gate):
|
|||||||
|
|
||||||
class nor_gate(logic_gate):
|
class nor_gate(logic_gate):
|
||||||
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
||||||
|
super().__init__(a,b,prefix)
|
||||||
self.gate_type = 'nor_gate'
|
self.gate_type = 'nor_gate'
|
||||||
self.operator = '|'
|
self.operator = '|'
|
||||||
self.a = wire(prefix+"_"+a.name.replace(prefix+"_", ''),a.value)
|
|
||||||
self.b = wire(prefix+"_"+b.name.replace(prefix+"_", ''),a.value)
|
|
||||||
|
|
||||||
if self.a.value == 1 or self.b.value == 1:
|
if self.a.value == 1 or self.b.value == 1:
|
||||||
self.output = wire(name=prefix+"_y"+str(outid),value=0)
|
self.output = wire(name=prefix+"_y"+str(outid),value=0)
|
||||||
@ -152,10 +157,9 @@ class nor_gate(logic_gate):
|
|||||||
|
|
||||||
class xor_gate(logic_gate):
|
class xor_gate(logic_gate):
|
||||||
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
||||||
|
super().__init__(a,b,prefix)
|
||||||
self.gate_type = 'xor_gate'
|
self.gate_type = 'xor_gate'
|
||||||
self.operator = '^'
|
self.operator = '^'
|
||||||
self.a = wire(prefix+"_"+a.name.replace(prefix+"_", ''),a.value)
|
|
||||||
self.b = wire(prefix+"_"+b.name.replace(prefix+"_", ''),a.value)
|
|
||||||
|
|
||||||
if (a.value == 1 and b.value == 0) or (a.value == 0 and b.value == 1):
|
if (a.value == 1 and b.value == 0) or (a.value == 0 and b.value == 1):
|
||||||
self.output = wire(name=prefix+"_y"+str(outid),value=1)
|
self.output = wire(name=prefix+"_y"+str(outid),value=1)
|
||||||
@ -164,10 +168,9 @@ class xor_gate(logic_gate):
|
|||||||
|
|
||||||
class xnor_gate(logic_gate):
|
class xnor_gate(logic_gate):
|
||||||
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
def __init__(self, a : wire, b : wire, prefix : str = "w", outid : int = 0):
|
||||||
|
super().__init__(a,b,prefix)
|
||||||
self.gate_type = 'xnor_gate'
|
self.gate_type = 'xnor_gate'
|
||||||
self.operator = '^'
|
self.operator = '^'
|
||||||
self.a = wire(prefix+"_"+a.name.replace(prefix+"_", ''),a.value)
|
|
||||||
self.b = wire(prefix+"_"+b.name.replace(prefix+"_", ''),a.value)
|
|
||||||
|
|
||||||
if (self.a.value == 1 and self.b.value == 0) or (self.a.value == 0 and self.b.value == 1):
|
if (self.a.value == 1 and self.b.value == 0) or (self.a.value == 0 and self.b.value == 1):
|
||||||
self.output = wire(name=prefix+"_y"+str(outid),value=0)
|
self.output = wire(name=prefix+"_y"+str(outid),value=0)
|
||||||
@ -274,16 +277,16 @@ class half_adder(arithmetic_circuit):
|
|||||||
|
|
||||||
#inicializace hodnot vodicu polovicni scitacky
|
#inicializace hodnot vodicu polovicni scitacky
|
||||||
def get_initialization_c(self):
|
def get_initialization_c(self):
|
||||||
return f" {self.components[0].a.name} = {self.a.get_wire_value(offset=self.a.index)};\n" + \
|
return f" {self.components[0].a.name} = {self.a.get_wire_value_c(offset=self.a.index)};\n" + \
|
||||||
f" {self.components[0].b.name} = {self.b.get_wire_value(offset=self.b.index)};\n" + \
|
f" {self.components[0].b.name} = {self.b.get_wire_value_c(offset=self.b.index)};\n" + \
|
||||||
f" {self.components[0].output.name} = {self.components[0].get_initialization_c()};\n" + \
|
f" {self.components[0].output.name} = {self.components[0].get_initialization_c()};\n" + \
|
||||||
f" {self.components[1].output.name} = {self.components[1].get_initialization_c()};\n"
|
f" {self.components[1].output.name} = {self.components[1].get_initialization_c()};\n"
|
||||||
|
|
||||||
def get_function_sum_c(self, offset : int = 0):
|
def get_function_sum_c(self, offset : int = 0):
|
||||||
return f" {self.out.prefix} |= {self.components[0].output.return_wire_value(offset = offset)};\n"
|
return f" {self.out.prefix} |= {self.components[0].output.return_wire_value_c(offset = offset)};\n"
|
||||||
|
|
||||||
def get_function_carry_c(self, offset : int = 1):
|
def get_function_carry_c(self, offset : int = 1):
|
||||||
return f" {self.out.prefix} |= {self.components[1].output.return_wire_value(offset = offset)};\n"
|
return f" {self.out.prefix} |= {self.components[1].output.return_wire_value_c(offset = offset)};\n"
|
||||||
|
|
||||||
|
|
||||||
class full_adder(arithmetic_circuit):
|
class full_adder(arithmetic_circuit):
|
||||||
@ -343,9 +346,9 @@ class full_adder(arithmetic_circuit):
|
|||||||
|
|
||||||
#inicializace hodnot vodicu uplne scitacky
|
#inicializace hodnot vodicu uplne scitacky
|
||||||
def get_initialization_c(self):
|
def get_initialization_c(self):
|
||||||
return f" {self.components[0].a.name} = {self.a.get_wire_value(offset=self.a.index)};\n" + \
|
return f" {self.components[0].a.name} = {self.a.get_wire_value_c(offset=self.a.index)};\n" + \
|
||||||
f" {self.components[0].b.name} = {self.b.get_wire_value(offset=self.b.index)};\n" + \
|
f" {self.components[0].b.name} = {self.b.get_wire_value_c(offset=self.b.index)};\n" + \
|
||||||
f" {self.components[2].b.name} = {self.c.get_wire_value()};\n" + \
|
f" {self.components[2].b.name} = {self.c.get_wire_value_c()};\n" + \
|
||||||
f" {self.components[0].output.name} = {self.components[0].get_initialization_c()};\n" + \
|
f" {self.components[0].output.name} = {self.components[0].get_initialization_c()};\n" + \
|
||||||
f" {self.components[1].output.name} = {self.components[1].get_initialization_c()};\n" + \
|
f" {self.components[1].output.name} = {self.components[1].get_initialization_c()};\n" + \
|
||||||
f" {self.components[2].output.name} = {self.components[2].get_initialization_c()};\n" + \
|
f" {self.components[2].output.name} = {self.components[2].get_initialization_c()};\n" + \
|
||||||
@ -353,10 +356,10 @@ class full_adder(arithmetic_circuit):
|
|||||||
f" {self.components[4].output.name} = {self.components[4].get_initialization_c()};\n"
|
f" {self.components[4].output.name} = {self.components[4].get_initialization_c()};\n"
|
||||||
|
|
||||||
def get_function_sum_c(self, offset : int = 0):
|
def get_function_sum_c(self, offset : int = 0):
|
||||||
return f" {self.out.prefix} |= {self.components[2].output.return_wire_value(offset = offset)};\n"
|
return f" {self.out.prefix} |= {self.components[2].output.return_wire_value_c(offset = offset)};\n"
|
||||||
|
|
||||||
def get_function_carry_c(self, offset : int = 1):
|
def get_function_carry_c(self, offset : int = 1):
|
||||||
return f" {self.out.prefix} |= {self.components[4].output.return_wire_value(offset = offset)};\n"
|
return f" {self.out.prefix} |= {self.components[4].output.return_wire_value_c(offset = offset)};\n"
|
||||||
|
|
||||||
|
|
||||||
class ripple_carry_adder(arithmetic_circuit):
|
class ripple_carry_adder(arithmetic_circuit):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user