@ -10,7 +10,11 @@ Besides loading these benchmarks, this module is also useful for easily construc
@@ -10,7 +10,11 @@ Besides loading these benchmarks, this module is also useful for easily construc
from lark import Lark , Transformer
from . circuit import Circuit , Node , Line
from . import readtext
from . import readtext , batchrange
def treeify ( l , max_degree = 4 ) :
if len ( l ) < = max_degree : return l
return treeify ( [ l [ bo : bo + bs ] for bo , bs in batchrange ( len ( l ) , max_degree ) ] )
class BenchTransformer ( Transformer ) :
@ -25,9 +29,35 @@ class BenchTransformer(Transformer):
@@ -25,9 +29,35 @@ class BenchTransformer(Transformer):
def interface ( self , args ) : self . c . io_nodes . extend ( args [ 0 ] )
def _cell_tree_inner ( self , name , kind , inner_kind , drivers ) :
cell = Node ( self . c , name , f ' { kind } { len ( drivers ) } ' )
fork = self . c . get_or_add_fork ( name )
Line ( self . c , cell , fork )
for i , d in enumerate ( drivers ) :
while isinstance ( d , list ) and len ( d ) == 1 : d = d [ 0 ]
if isinstance ( d , list ) :
d = self . _cell_tree_inner ( f ' { name } ~ { i } ' , inner_kind , inner_kind , d )
Line ( self . c , d , cell )
return fork
def cell_tree ( self , name , kind , drivers ) :
root_kind = kind . upper ( )
inner_kind = root_kind
if root_kind == ' NAND ' : inner_kind = ' AND '
if root_kind == ' NOR ' : inner_kind = ' OR '
if root_kind == ' XNOR ' : inner_kind = ' XOR '
return self . _cell_tree_inner ( name , root_kind , inner_kind , treeify ( drivers ) )
def assignment ( self , args ) :
name , cell_type , drivers = args
cell = Node ( self . c , str ( name ) , str ( cell_type ) )
name , kind , drivers = args
if kind . upper ( ) in ( ' AND ' , ' NAND ' , ' OR ' , ' NOR ' , ' XOR ' , ' XNOR ' ) :
self . cell_tree ( name , kind , drivers )
return
if kind . upper ( ) . startswith ( ' BUF ' ) :
kind = ' BUF1 '
elif kind . upper ( ) . startswith ( ' INV ' ) or kind . upper ( ) . startswith ( ' NOT ' ) :
kind = ' INV1 '
cell = Node ( self . c , str ( name ) , str ( kind ) )
Line ( self . c , cell , self . c . get_or_add_fork ( str ( name ) ) )
for d in drivers : Line ( self . c , d , cell )