33import sys
44from .ahdlusedef import AHDLUseDefDetector
55from .bitwidth import BitwidthReducer
6- from .block import BlockReducer , PathExpTracer
76from .builtin import builtin_symbols
87from .callgraph import CallGraphBuilder
8+ from .cfgopt import BlockReducer , PathExpTracer
9+ from .cfgopt import HyperBlockBuilder
910from .common import read_source
1011from .constopt import ConstantOpt , GlobalConstantOpt
1112from .constopt import ConstantOptPreDetectROM , EarlyConstantOptNonSSA
1213from .copyopt import CopyOpt
1314from .dataflow import DFGBuilder
15+ from .deadcode import DeadCodeEliminator
1416from .driver import Driver
1517from .env import env
1618from .errors import CompileError , InterpretError
1719from .hdlgen import HDLModuleBuilder
1820from .iftransform import IfTransformer
19- from .inlineopt import InlineOpt , FlattenFieldAccess , AliasReplacer , ObjectHierarchyCopier
21+ from .inlineopt import InlineOpt
22+ from .inlineopt import FlattenFieldAccess , FlattenObjectArgs , FlattenModule
23+ from .inlineopt import AliasReplacer , ObjectHierarchyCopier
2024from .instantiator import ModuleInstantiator , WorkerInstantiator
21- from .instantiator import EarlyModuleInstantiator
25+ from .instantiator import EarlyModuleInstantiator , EarlyWorkerInstantiator
2226from .iotransformer import IOTransformer
2327from .irtranslator import IRTranslator
2428from .loopdetector import LoopDetector
2529from .memorytransform import MemoryRenamer , RomDetector
2630from .memref import MemRefGraphBuilder , MemInstanceGraphBuilder
27- from .phiresolve import PHICondResolver , StmOrdering
31+ from .phiresolve import PHICondResolver
2832from .portconverter import PortConverter , FlattenPortList
2933from .pure import interpret , PureCtorBuilder , PureFuncExecutor
30- from .quadruplet import QuadrupleMaker
34+ from .quadruplet import EarlyQuadrupleMaker
35+ from .quadruplet import LateQuadrupleMaker
3136from .regreducer import RegReducer
3237from .regreducer import AliasVarDetector
3338from .scheduler import Scheduler
@@ -77,7 +82,7 @@ def preprocess_global(driver):
7782def callgraph (driver ):
7883 unused_scopes = CallGraphBuilder ().process_all ()
7984 for s in unused_scopes :
80- if Scope .is_unremovable (s ):
85+ if env . compile_phase < env . PHASE_3 and Scope .is_unremovable (s ):
8186 continue
8287 driver .remove_scope (s )
8388 Scope .destroy (s )
@@ -95,7 +100,15 @@ def pathexp(driver, scope):
95100 PathExpTracer ().process (scope )
96101
97102
98- def buildpurector (driver , scope ):
103+ def hyperblock (driver , scope ):
104+ if not env .enable_hyperblock :
105+ return
106+ if scope .is_testbench ():
107+ return
108+ HyperBlockBuilder ().process (scope )
109+
110+
111+ def buildpurector (driver ):
99112 new_ctors = PureCtorBuilder ().process_all ()
100113 for ctor in new_ctors :
101114 assert ctor .name in env .scopes
@@ -114,8 +127,12 @@ def convport(driver):
114127 PortConverter ().process_all ()
115128
116129
117- def quadruple (driver , scope ):
118- QuadrupleMaker ().process (scope )
130+ def earlyquadruple (driver , scope ):
131+ EarlyQuadrupleMaker ().process (scope )
132+
133+
134+ def latequadruple (driver , scope ):
135+ LateQuadrupleMaker ().process (scope )
119136
120137
121138def usedef (driver , scope ):
@@ -126,10 +143,6 @@ def scalarssa(driver, scope):
126143 ScalarSSATransformer ().process (scope )
127144
128145
129- def stmordering (driver , scope ):
130- StmOrdering ().process (scope )
131-
132-
133146def phi (driver , scope ):
134147 PHICondResolver ().process (scope )
135148
@@ -190,6 +203,23 @@ def earlyinstantiate(driver):
190203 driver .insert_scope (module )
191204 assert module .is_module ()
192205
206+ new_workers , orig_workers = EarlyWorkerInstantiator ().process_all ()
207+ for worker in new_workers :
208+ assert worker .name in env .scopes
209+ driver .insert_scope (worker )
210+ assert worker .is_worker ()
211+ for orig_worker in orig_workers :
212+ driver .remove_scope (orig_worker )
213+ Scope .destroy (orig_worker )
214+ modules = [scope for scope in env .scopes .values () if scope .is_module ()]
215+ for m in modules :
216+ if m .find_ctor ().is_pure () and not m .is_instantiated ():
217+ for child in m .children :
218+ driver .remove_scope (child )
219+ Scope .destroy (child )
220+ driver .remove_scope (m )
221+ Scope .destroy (m )
222+
193223
194224def instantiate (driver ):
195225 new_modules = ModuleInstantiator ().process_all ()
@@ -204,6 +234,7 @@ def instantiate(driver):
204234 continue
205235 if not (child .is_ctor () or child .is_worker ()):
206236 continue
237+ usedef (driver , child )
207238 execpure (driver , child )
208239 constopt (driver , child )
209240
@@ -216,6 +247,7 @@ def instantiate(driver):
216247 driver .insert_scope (worker )
217248
218249 assert worker .is_worker ()
250+ usedef (driver , worker )
219251 execpure (driver , worker )
220252 constopt (driver , worker )
221253 callgraph (driver )
@@ -234,13 +266,19 @@ def inlineopt(driver):
234266 callgraph (driver )
235267
236268
269+ def flattenmodule (driver , scope ):
270+ FlattenModule (driver ).process (scope )
271+
272+
237273def scalarize (driver , scope ):
238274 TupleSSATransformer ().process (scope )
239275 ObjectHierarchyCopier ().process (scope )
240276 usedef (driver , scope )
241277 ObjectSSATransformer ().process (scope )
242278 usedef (driver , scope )
243279 AliasReplacer ().process (scope )
280+
281+ FlattenObjectArgs ().process (scope )
244282 FlattenFieldAccess ().process (scope )
245283
246284
@@ -264,6 +302,10 @@ def loop(driver, scope):
264302 LoopDetector ().process (scope )
265303
266304
305+ def deadcode (driver , scope ):
306+ DeadCodeEliminator ().process (scope )
307+
308+
267309def dfg (driver , scope ):
268310 DFGBuilder ().process (scope )
269311
@@ -324,6 +366,12 @@ def dumpscope(driver, scope):
324366 driver .logger .debug (str (scope ))
325367
326368
369+ def dumpcfgimg (driver , scope ):
370+ from .scope import write_dot
371+ if scope .is_function_module () or scope .is_method () or scope .is_module ():
372+ write_dot (scope , driver .stage )
373+
374+
327375def dumpmrg (driver , scope ):
328376 driver .logger .debug (str (env .memref_graph ))
329377
@@ -354,6 +402,12 @@ def dumphdl(driver, scope):
354402 logger .debug (driver .result (scope ))
355403
356404
405+ def printresouces (driver , scope ):
406+ if (scope .is_function_module () or scope .is_module ()):
407+ resources = scope .module_info .resources ()
408+ print (resources )
409+
410+
357411def compile_plan ():
358412 def dbg (proc ):
359413 return proc if env .dev_debug_mode else None
@@ -369,11 +423,13 @@ def ahdlopt(proc):
369423 iftrans ,
370424 reduceblk ,
371425 dbg (dumpscope ),
372- quadruple ,
426+ earlyquadruple ,
427+ dbg (dumpscope ),
373428 earlytypeprop ,
374429 dbg (dumpscope ),
375430 typeprop ,
376431 dbg (dumpscope ),
432+ latequadruple ,
377433 callgraph ,
378434 typecheck ,
379435 flattenport ,
@@ -383,18 +439,23 @@ def ahdlopt(proc):
383439 earlyconstopt_nonssa ,
384440 dbg (dumpscope ),
385441 inlineopt ,
442+ dbg (dumpscope ),
386443 reduceblk ,
387444 pathexp ,
388445 dbg (dumpscope ),
389446 phase (env .PHASE_2 ),
390- stmordering ,
391447 usedef ,
448+ flattenmodule ,
392449 scalarize ,
393450 dbg (dumpscope ),
394451 usedef ,
395452 scalarssa ,
396453 dbg (dumpscope ),
397454 usedef ,
455+ hyperblock ,
456+ dbg (dumpscope ),
457+ reduceblk ,
458+ dbg (dumpscope ),
398459 typeprop ,
399460 dbg (dumpscope ),
400461 usedef ,
@@ -415,22 +476,28 @@ def ahdlopt(proc):
415476 constopt ,
416477 dbg (dumpscope ),
417478 execpure ,
479+ phase (env .PHASE_3 ),
418480 instantiate ,
419481 modulecheck ,
420482 dbg (dumpscope ),
421483 convport ,
484+ usedef ,
485+ copyopt ,
486+ usedef ,
487+ deadcode ,
422488 dbg (dumpscope ),
489+ reduceblk ,
423490 usedef ,
491+ dbg (dumpscope ),
424492 phi ,
425493 usedef ,
426494 dbg (dumpscope ),
427- reduceblk ,
428495 pathexp ,
429496 dbg (dumpscope ),
430- phase (env .PHASE_3 ),
497+ phase (env .PHASE_4 ),
431498 usedef ,
432499 loop ,
433- phase (env .PHASE_4 ),
500+ phase (env .PHASE_5 ),
434501 usedef ,
435502 aliasvar ,
436503 dbg (dumpscope ),
@@ -455,6 +522,7 @@ def ahdlopt(proc):
455522 dbg (dumpmodule ),
456523 genhdl ,
457524 dbg (dumphdl ),
525+ dbg (printresouces ),
458526 ]
459527 plan = [p for p in plan if p is not None ]
460528 return plan
@@ -486,7 +554,8 @@ def setup(src_file, options):
486554 env .set_current_filename (package_file )
487555 translator .translate (read_source (package_file ), package_name )
488556 env .set_current_filename (src_file )
489- g = Scope .create (None , env .global_scope_name , {'global' , 'namespace' }, lineno = 1 )
557+ g = Scope .create_namespace (None , env .global_scope_name , {'global' })
558+ env .push_outermost_scope (g )
490559 for sym in builtin_symbols .values ():
491560 g .import_sym (sym )
492561
@@ -516,7 +585,7 @@ def output_individual(compile_results, output_name, output_dir):
516585
517586 scopes = Scope .get_scopes (with_class = True )
518587 scopes = [scope for scope in scopes
519- if (scope .is_testbench () or scope .is_module () or scope .is_function_module ())]
588+ if (scope .is_testbench () or ( scope .is_module () and scope . is_instantiated () ) or scope .is_function_module ())]
520589 if output_name .endswith ('.v' ):
521590 output_name = output_name [:- 2 ]
522591 with open (d + output_name + '.v' , 'w' ) as f :
0 commit comments