Опишите граф логической схемы а с помощью постфиксной нотации
Я хочу описать логическую схему в следующей форме
NODE_(node:id):функция node_function
VECTOR_(vector_id):vector_name-source_node_id:distenation_node_id
вот пример для полу-сумматора
вход:
module half_adder(input a, input b, output sum, output c); wire mid1 = a & ~b; wire mid2 = ~a & b; sum = mid1 | mid2; c = a & b; endmodule
выход:
NODE_INPUT_1: input_a NODE_INPUT_2: input_b NODE_OUTPUT_1: output_sum NODE_OUTPUT_2: output_c NODE_AND_1: and NODE_AND_2: and NODE_AND_3: and NODE_NOT_1: not NODE_NOT_2: not NODE_OR_1: or NODE_BRANCH_a: branch_a NODE_BRANCH_b: branch_b VECTOR_1: wire_a - NODE_INPUT_1:NODE_BRANCH_a-------- VECTOR_2: wire_b - NODE_INPUT_2:NODE_BRANCH_b-------- VECTOR_3: branch_a_1 - NODE_BRANCH_a:NODE_NOT_1------ VECTOR_4: branch_a_2 - NODE_BRANCH_a:NODE_AND_1 VECTOR_5: branch_a_3 - NODE_BRANCH_a:NODE_AND_3 VECTOR_6: branch_b_1 - NODE_BRANCH_b:NODE_NOT_2------- VECTOR_7: branch_b_2 - NODE_BRANCH_b:NODE_AND_2 VECTOR_8: branch_b_3 - NODE_BRANCH_b:NODE_AND_3 VECTOR_9: not_1_out - NODE_NOT_1:NODE_AND_2 VECTOR_10: not_2_out - NODE_NOT_2:NODE_AND_1 VECTOR_11: mid1 - NODE_AND_1:NODE_OR_1 VECTOR_12: mid2 - NODE_AND_2:NODE_OR_1 VECTOR_13: or_1_out - NODE_OR_1:NODE_OUTPUT_1 VECTOR_14: and_3_out - NODE_AND_3:NODE_OUTPUT_2
Я описал узлы и для векторов я преобразую каждое описание инфикса в постфикс
но до сих пор не знаю, как можно описать векторы с помощью постфикса.
как бы то ни было если вы не хотите читать ниже код вы можете предположить что у меня есть
a b ~ & a ~ b & mid1 mid2 | a b &
и хотите описать график схемы полусумматора (есть ли какой-нибудь алгоритм, например, оценить постфикс с помощью стека или что-то еще?)
Что я уже пробовал:
from pyparsing import * from functools import reduce and_counter=1 or_counter=1 not_counter=1 def add_and_counter(): global and_counter and_counter+=1 def add_or_counter(): global or_counter or_counter+=1 def add_not_counter(): global not_counter not_counter+=1 def noding_input_output(s,loc,toks): nodeOutput=1 nodeInput=1 for i in toks: if i[0]=="input": print("NODE_INPUT_"+str(nodeInput)+": input_"+str(i[1])) nodeInput+=1 else: print("NODE_OUTPUT_"+str(nodeOutput)+": output_"+str(i[1])) nodeOutput+=1 def noding_booleans(s,loc,toks): input_or_output=toks[0][0] toks=toks[0][1:] for j in toks: for k in j: if k==and_op: print("NODE_AND_"+str(and_counter)+": and") add_and_counter() elif k==or_op: print("NODE_OR_"+str(or_counter)+": or") add_or_counter() elif k==not_op: print("NODE_NOT_"+str(not_counter)+": not") add_not_counter() expr=reduce(lambda x,y:x+y,toks[2]) expr=" ".join(toks) vector=infix_to_postfix(expr) #if input_or_output==input: def infix_to_postfix(ins): preced={"~":3,"&":2,"|":2,"(":1} def pushOperator(component): while stack!=[] and \ preced[stack[-1]]>=preced[component]: ans.append(stack.pop()) stack.append(component) ans=[] stack=[] token=ins.split() for component in token: if component=="(": stack.append(component) elif component==")": while stack!=[]: t=stack.pop() if t=="(": break ans.append(t) elif isOperation(component): while stack!=[] and preced[stack[-1]]>=preced[component]: ans.append(stack.pop()) stack.append(component) else: ans.append(component) while stack!=[]: t=stack.pop() if t=="(": break ans.append(t) ans=" ".join(ans) return ans def isOperation(xs): operation=["~","&","|"] for op in operation: if xs==op: return True return False identifier=Word(srange("[a-z0-9_]")) module_ins_name=Group(identifier) lp=Literal("(").suppress() rp=Literal(")").suppress() semi=Literal(";").suppress() assignment=Literal("=").suppress() and_op=Literal("&").suppress() or_op=Literal("|").suppress() not_op=Literal("~").suppress() input=Keyword("input").suppress() output=Keyword("output").suppress() wire=Keyword("wire").suppress() module=Keyword("module").suppress() endmodule=Keyword("endmodule").suppress() arguments=Group(lp+delimitedList(Group(2*identifier)).setParseAction(noding_input_output)+rp) #arguments.parseString("(input i1, input i2, output out)") input_output_instance=Group(identifier+assignment+OneOrMore(Word(srange("[a-z0-9_()&|~]")))+semi).setParseAction(noding_booleans) wire_definition=Group(wire+delimitedList(identifier)+semi+OneOrMore(input_output_instance))|Group(wire+input_output_instance) output_definition=OneOrMore(input_output_instance) wire_output_definition=OneOrMore(wire_definition)+OneOrMore(output_definition) #print(OneOrMore(wire_definition).parseString("wire mid1= a & ~b;\nwire mid2 = ~a & b;")) #print(output_definition.parseString("sum = mid1 | mid2;\nc = a & b;")) #print(wire_output_definition.parseString("wire mid1= a & ~b;\nwire mid2 = ~a & b;\nsum = mid1 | mid2;\nc = a & b;"))