@@ -28,11 +28,42 @@ def _tmp_name(prefix='_tmp_thread'):
2828 return ret
2929
3030
31+ class CompileError (Exception ):
32+
33+ def __init__ (self , err , code , lineno , col_offset ,
34+ end_lineno = None , end_col_offset = None ):
35+ self .err = err
36+ self .code = code
37+ self .lineno = lineno
38+ self .col_offset = col_offset
39+ self .end_lineno = end_lineno
40+ self .end_col_offset = end_col_offset
41+
42+ def __str__ (self ):
43+ return '"{}" in "{}", line {}' .format (self .err , self .code , self .lineno )
44+
45+
3146class FunctionVisitor (ast .NodeVisitor ):
3247
3348 def __init__ (self ):
3449 self .functions = OrderedDict ()
3550
51+ def visit (self , node ):
52+ try :
53+ r = ast .NodeVisitor .visit (self , node )
54+ return r
55+
56+ except CompileError as e :
57+ raise
58+
59+ except Exception as e :
60+ if hasattr (ast , 'unparse' ):
61+ code = ast .unparse (node )
62+ else :
63+ code = ast .dump (node )
64+ raise CompileError (e , code , node .lineno , node .col_offset ,
65+ node .end_lineno , node .end_col_offset )
66+
3667 def getFunctions (self ):
3768 return self .functions
3869
@@ -68,6 +99,23 @@ def __init__(self, m, name, clk, rst, fsm,
6899 for func in functions .values ():
69100 self .scope .addFunction (func )
70101
102+ # -------------------------------------------------------------------------
103+ def visit (self , node ):
104+ try :
105+ r = ast .NodeVisitor .visit (self , node )
106+ return r
107+
108+ except CompileError as e :
109+ raise
110+
111+ except Exception as e :
112+ if hasattr (ast , 'unparse' ):
113+ code = ast .unparse (node )
114+ else :
115+ code = ast .dump (node )
116+ raise CompileError (e , code , node .lineno , node .col_offset ,
117+ node .end_lineno , node .end_col_offset )
118+
71119 # -------------------------------------------------------------------------
72120 def visit_Import (self , node ):
73121 raise TypeError ("{} is not supported." .format (type (node )))
0 commit comments