cond in sdf parser. ignored for now.
This commit is contained in:
1 parent
a6243b43f6
commit
4bb3f3424a
5 files changed
+58
-20
No files matched your search
+8
-1
@@ -156,6 +156,10 @@ class SdfTransformer(Transformer):
|
|||||||
entries = [e for a in args if hasattr(a, 'children') for e in a.children]
|
entries = [e for a in args if hasattr(a, 'children') for e in a.children]
|
||||||
return name, entries
|
return name, entries
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def cond(args): # ignore conditions
|
||||||
|
return args[1]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def start(args):
|
def start(args):
|
||||||
name = next((a for a in args if isinstance(a, str)), None)
|
name = next((a for a in args if isinstance(a, str)), None)
|
||||||
@@ -180,9 +184,12 @@ GRAMMAR = r"""
|
|||||||
| "(INSTANCE" ID? ")"
|
| "(INSTANCE" ID? ")"
|
||||||
| "(TIMINGCHECK" _ignore* ")"
|
| "(TIMINGCHECK" _ignore* ")"
|
||||||
| delay )* ")"
|
| delay )* ")"
|
||||||
delay: "(DELAY" "(ABSOLUTE" (interconnect | iopath)* ")" ")"
|
delay: "(DELAY" "(ABSOLUTE" (interconnect | iopath | cond)* ")" ")"
|
||||||
interconnect: "(INTERCONNECT" ID ID triple* ")"
|
interconnect: "(INTERCONNECT" ID ID triple* ")"
|
||||||
iopath: "(IOPATH" ID_OR_EDGE ID_OR_EDGE triple* ")"
|
iopath: "(IOPATH" ID_OR_EDGE ID_OR_EDGE triple* ")"
|
||||||
|
cond: "(" "COND" cond_port_expr iopath ")"
|
||||||
|
?cond_port_expr: ID | "(" cond_port_expr ")" | cond_port_expr BINARY_OP cond_port_expr
|
||||||
|
BINARY_OP: /&&/ | /==/
|
||||||
NAME: /[^"]+/
|
NAME: /[^"]+/
|
||||||
ID_OR_EDGE: ( /[^() ]+/ | "(" /[^)]+/ ")" )
|
ID_OR_EDGE: ( /[^() ]+/ | "(" /[^)]+/ ")" )
|
||||||
ID: ( /[^"() ]+/ | "\"" /[^"]+/ "\"" )
|
ID: ( /[^"() ]+/ | "\"" /[^"]+/ "\"" )
|
||||||
|
|||||||
+33
-6
@@ -7,22 +7,49 @@
|
|||||||
(TEMPERATURE 25.00:25.00:25.00)
|
(TEMPERATURE 25.00:25.00:25.00)
|
||||||
(TIMESCALE 1ns)
|
(TIMESCALE 1ns)
|
||||||
(CELL
|
(CELL
|
||||||
(CELLTYPE "NAND2X1")
|
(CELLTYPE "NAND2_X1")
|
||||||
(INSTANCE nandgate)
|
(INSTANCE nandgate)
|
||||||
(DELAY
|
(DELAY
|
||||||
(ABSOLUTE
|
(ABSOLUTE
|
||||||
(IOPATH IN1 QN (0.099:0.103:0.103) (0.122:0.127:0.127))
|
(IOPATH A1 ZN (0.099:0.103:0.103) (0.122:0.127:0.127))
|
||||||
(IOPATH IN2 QN (0.083:0.086:0.086) (0.100:0.104:0.104))
|
(IOPATH A2 ZN (0.083:0.086:0.086) (0.100:0.104:0.104))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(CELL
|
(CELL
|
||||||
(CELLTYPE "AND2X1")
|
(CELLTYPE "AND2_X1")
|
||||||
(INSTANCE andgate)
|
(INSTANCE andgate)
|
||||||
(DELAY
|
(DELAY
|
||||||
(ABSOLUTE
|
(ABSOLUTE
|
||||||
(IOPATH IN1 Q (0.367:0.378:0.378) (0.351:0.377:0.377))
|
(IOPATH A1 ZN (0.367:0.378:0.378) (0.351:0.377:0.377))
|
||||||
(IOPATH IN2 Q (0.366:0.375:0.375) (0.359:0.370:0.370))
|
(IOPATH A2 ZN (0.366:0.375:0.375) (0.359:0.370:0.370))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(CELL
|
||||||
|
(CELLTYPE "OAI21_X1")
|
||||||
|
(INSTANCE oai21gate)
|
||||||
|
(DELAY
|
||||||
|
(ABSOLUTE
|
||||||
|
(IOPATH B1 ZN (0.000:0.025:0.025) (0.000:0.013:0.013))
|
||||||
|
(IOPATH B2 ZN (0.000:0.030:0.030) (0.000:0.016:0.016))
|
||||||
|
( COND (B1 == 1'b0) && (B2 == 1'b1) (IOPATH A ZN (0.000:0.018:0.018)))
|
||||||
|
(COND (B1 == 1'b1) && (B2 == 1'b0) (IOPATH A ZN (0.000:0.018:0.018) (0.000:0.016:0.016)))
|
||||||
|
(COND (B1 == 1'b1) && (B2 == 1'b1) (IOPATH A ZN (0.000:0.019:0.019) (0.000:0.014:0.014)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(CELL
|
||||||
|
(CELLTYPE "MUX2_X1")
|
||||||
|
(INSTANCE mux2gate)
|
||||||
|
(DELAY
|
||||||
|
(ABSOLUTE
|
||||||
|
(COND (B == 1'b0) && (S == 1'b0) (IOPATH A Z (0.000:0.037:0.037) (0.000:0.058:0.058)))
|
||||||
|
(COND (B == 1'b1) && (S == 1'b0) (IOPATH A Z (0.000:0.037:0.037) (0.000:0.058:0.058)))
|
||||||
|
(COND (A == 1'b0) && (S == 1'b1) (IOPATH B Z (0.000:0.035:0.035) (0.000:0.056:0.056)))
|
||||||
|
(COND (A == 1'b1) && (S == 1'b1) (IOPATH B Z (0.000:0.035:0.035) (0.000:0.056:0.056)))
|
||||||
|
(COND (A == 1'b0) && (B == 1'b1) (IOPATH S Z (0.000:0.047:0.047) (0.000:0.073:0.073)))
|
||||||
|
(COND (A == 1'b1) && (B == 1'b0) (IOPATH S Z (0.000:0.072:0.072) (0.000:0.064:0.064)))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
+8
-4
@@ -1,11 +1,15 @@
|
|||||||
module gates (a, b, o0, o1 );
|
module gates (a, b, c, o0, o1, o2, o3 );
|
||||||
input a;
|
input a;
|
||||||
input b;
|
input b;
|
||||||
|
input c;
|
||||||
output o0;
|
output o0;
|
||||||
output o1;
|
output o1;
|
||||||
|
output o2;
|
||||||
|
output o3;
|
||||||
|
|
||||||
AND2X1 andgate (.IN1 ( a ) , .IN2 ( b ) , .Q ( o0 ) ) ;
|
AND2_X1 andgate (.A1 ( a ) , .A2 ( b ) , .ZN ( o0 ) ) ;
|
||||||
NAND2X1 nandgate (.IN1 ( a ) , .IN2 ( b ) , .QN ( o1 ) ) ;
|
NAND2_X1 nandgate (.A1 ( a ) , .A2 ( b ) , .ZN ( o1 ) ) ;
|
||||||
|
OAI21_X1 oai21gate (.B1(a), .B2(b), .A(c), .ZN(o2) ) ;
|
||||||
|
MUX2_X1 mux2gate (.A(a), .B(b), .S(c), .Z(o3)) ;
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
+3
-3
@@ -2,7 +2,7 @@ import numpy as np
|
|||||||
|
|
||||||
from kyupy import sdf, verilog, bench
|
from kyupy import sdf, verilog, bench
|
||||||
from kyupy.wave_sim import WaveSim, TMAX, TMIN
|
from kyupy.wave_sim import WaveSim, TMAX, TMIN
|
||||||
from kyupy.techlib import SAED32, SAED90
|
from kyupy.techlib import SAED32, NANGATE45
|
||||||
|
|
||||||
def test_parse():
|
def test_parse():
|
||||||
test = '''
|
test = '''
|
||||||
@@ -80,9 +80,9 @@ def test_b15(mydir):
|
|||||||
|
|
||||||
|
|
||||||
def test_gates(mydir):
|
def test_gates(mydir):
|
||||||
c = verilog.load(mydir / 'gates.v', tlib=SAED90)
|
c = verilog.load(mydir / 'gates.v', tlib=NANGATE45)
|
||||||
df = sdf.load(mydir / 'gates.sdf')
|
df = sdf.load(mydir / 'gates.sdf')
|
||||||
lt = df.iopaths(c, tlib=SAED90)[1]
|
lt = df.iopaths(c, tlib=NANGATE45)[1]
|
||||||
nand_a = c.cells['nandgate'].ins[0]
|
nand_a = c.cells['nandgate'].ins[0]
|
||||||
nand_b = c.cells['nandgate'].ins[1]
|
nand_b = c.cells['nandgate'].ins[1]
|
||||||
and_a = c.cells['andgate'].ins[0]
|
and_a = c.cells['andgate'].ins[0]
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from kyupy import verilog
|
from kyupy import verilog
|
||||||
from kyupy.techlib import SAED90, SAED32
|
from kyupy.techlib import SAED90, SAED32, NANGATE45
|
||||||
|
|
||||||
def test_b01(mydir):
|
def test_b01(mydir):
|
||||||
with open(mydir / 'b01.v', 'r') as f:
|
with open(mydir / 'b01.v', 'r') as f:
|
||||||
@@ -26,12 +26,12 @@ def test_b15(mydir):
|
|||||||
|
|
||||||
|
|
||||||
def test_gates(mydir):
|
def test_gates(mydir):
|
||||||
c = verilog.load(mydir / 'gates.v', tlib=SAED90)
|
c = verilog.load(mydir / 'gates.v', tlib=NANGATE45)
|
||||||
assert len(c.nodes) == 10
|
assert len(c.nodes) == 18
|
||||||
assert len(c.lines) == 10
|
assert len(c.lines) == 21
|
||||||
stats = c.stats
|
stats = c.stats
|
||||||
assert stats['input'] == 2
|
assert stats['input'] == 3
|
||||||
assert stats['output'] == 2
|
assert stats['output'] == 4
|
||||||
assert stats['__seq__'] == 0
|
assert stats['__seq__'] == 0
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user