From 72b356df3c8839b1c02b4354d8b4e01a8a25313b Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Mon, 27 Sep 2021 02:41:51 +0200 Subject: [PATCH] some simulation fixes in eval_logic_expr() --- src/hilight.c | 20 ++++++++++---------- xschem_library/xschem_simulator/dev-1.sym | 4 ++-- xschem_library/xschem_simulator/invert-1.sym | 4 ++-- xschem_library/xschem_simulator/switch-1.sym | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/hilight.c b/src/hilight.c index d23f4338..f71ee52c 100644 --- a/src/hilight.c +++ b/src/hilight.c @@ -1158,7 +1158,7 @@ int eval_logic_expr(int inst, int output) case '~': /* negation operator */ if(sp > 0) { sp--; - if(!(stack[sp] & 2)) stack[sp] = !stack[sp]; + if(stack[sp] < 2) stack[sp] = !stack[sp]; else stack[sp] = 2; ++sp; } @@ -1166,24 +1166,24 @@ int eval_logic_expr(int inst, int output) case 'z': /* Tristate driver [signal,enable,'z']-> signal if z==1, Z (3) otherwise */ if(sp > 1) { s = stack[sp - 1]; - stack[sp - 2] = (s & 2) ? 2 : (s == 1 ) ? stack[sp - 2] : 3; + stack[sp - 2] = (s > 1) ? 2 : (s == 1 ) ? stack[sp - 2] : 3; sp--; } break; case 'M': /* mux operator */ - s = stack[sp - 1]; if(sp > 2) { - if(!(s & 2) ) { + s = stack[sp - 1]; + if(s < 2) { stack[sp - 3] = (s == 0) ? stack[sp - 3] : stack[sp - 2]; } - else stack[sp - 3] = 3; + else stack[sp - 3] = 2; sp -=2; } break; case 'm': /* mux operator , lower priority*/ - s = stack[sp - 1]; if(sp > 2) { - if(!(s & 2) ) { /* reduce pessimism, avoid infinite loops */ + s = stack[sp - 1]; + if(s < 2) { /* reduce pessimism, avoid infinite loops */ stack[sp - 3] = (s == 0) ? stack[sp - 3] : stack[sp - 2]; } else stack[sp - 3] = 4; @@ -1197,7 +1197,7 @@ int eval_logic_expr(int inst, int output) if(stack[i] == 1) { res = 1; break; - } else if(stack[i] & 2) { + } else if(stack[i] > 1) { res = 2; } } @@ -1212,7 +1212,7 @@ int eval_logic_expr(int inst, int output) if(stack[i] == 0) { res = 0; break; - } else if(stack[i] & 2) { + } else if(stack[i] > 1) { res = 2; } } @@ -1224,7 +1224,7 @@ int eval_logic_expr(int inst, int output) if(sp > 1) { res = 0; for(i = sp - 2; i < sp; i++) { - if(!(stack[i] & 2)) { + if(stack[i] < 2) { res = res ^ stack[i]; } else { diff --git a/xschem_library/xschem_simulator/dev-1.sym b/xschem_library/xschem_simulator/dev-1.sym index 3ab0a1be..738074fb 100644 --- a/xschem_library/xschem_simulator/dev-1.sym +++ b/xschem_library/xschem_simulator/dev-1.sym @@ -1,4 +1,4 @@ -v {xschem version=2.9.9 file_version=1.2 } +v {xschem version=3.0.0 file_version=1.2 } G {} K {type=switch function0="1 2 3 m" @@ -17,7 +17,7 @@ L 4 -10 0 10 0 {} B 5 -32.5 -2.5 -27.5 2.5 {name=t0 dir=inout} B 5 27.5 7.5 32.5 12.5 {name=t1 dir=inout } B 5 27.5 -12.5 32.5 -7.5 {name=t2 dir=inout } -B 5 -7.5 -47.5 7.5 -32.5 {name=g dir=inout goto=0,1,2} +B 5 -2.5 -42.5 2.5 -37.5 {name=g dir=inout goto=0,1,2} A 4 -8.75 0 1.25 360 360 {fill=true} A 4 10 -10 1.25 0 360 {fill=true} A 4 10 10 1.25 0 360 {fill=true} diff --git a/xschem_library/xschem_simulator/invert-1.sym b/xschem_library/xschem_simulator/invert-1.sym index f2b2b808..277bf23a 100644 --- a/xschem_library/xschem_simulator/invert-1.sym +++ b/xschem_library/xschem_simulator/invert-1.sym @@ -1,4 +1,4 @@ -v {xschem version=2.9.9 file_version=1.2 } +v {xschem version=3.0.0 file_version=1.2 } G {} K {type=switch function0="3 2 4 m" @@ -23,7 +23,7 @@ B 5 -32.5 -12.5 -27.5 -7.5 {name=t0 dir=inout} B 5 -32.5 7.5 -27.5 12.5 {name=t1 dir=inout} B 5 27.5 7.5 32.5 12.5 {name=t2 dir=inout } B 5 27.5 -12.5 32.5 -7.5 {name=t3 dir=inout } -B 5 -7.5 -47.5 7.5 -32.5 {name=g dir=inout goto=0,1,2,3} +B 5 -2.5 -42.5 2.5 -37.5 {name=g dir=inout goto=0,1,2,3} A 4 -10 -10 1.25 0 360 {fill=true} A 4 10 -10 1.25 0 360 {fill=true} A 4 10 10 1.25 0 360 {fill=true} diff --git a/xschem_library/xschem_simulator/switch-1.sym b/xschem_library/xschem_simulator/switch-1.sym index 79e796b4..0eb6fe07 100644 --- a/xschem_library/xschem_simulator/switch-1.sym +++ b/xschem_library/xschem_simulator/switch-1.sym @@ -1,4 +1,4 @@ -v {xschem version=2.9.9 file_version=1.2 } +v {xschem version=3.0.0 file_version=1.2 } G {} K {type=switch function0="Z 1 2 M" @@ -14,7 +14,7 @@ L 4 -10 0 10 -10 {} L 4 0 -40 0 -5 {} B 5 -32.5 -2.5 -27.5 2.5 {name=t0 dir=inout} B 5 27.5 -2.5 32.5 2.5 {name=t1 dir=inout } -B 5 -7.5 -47.5 7.5 -32.5 {name=g dir=inout goto=0,1} +B 5 -2.5 -43.75 2.5 -38.75 {name=g dir=inout goto=0,1} A 4 10 0 1.25 0 360 {fill=true} A 4 -10 0 1.25 0 360 {fill=true} T {1} 20 -7.5 0 0 0.1 0.1 {}