Skip to content

Commit 3f7a907

Browse files
author
Hiroaki Kataoka
authored
Merge pull request #5 from ktok07b6/devel
version 0.3.2
2 parents 60c619f + 604aa96 commit 3f7a907

116 files changed

Lines changed: 3538 additions & 1161 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

polyphony/__init__.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -114,30 +114,37 @@ def my_worker(arg1, arg2):
114114
115115
*Notes:*
116116
This function is provided to stop the worker function in the simulation with Python interpreter.
117-
In the course of compiling to HDL, this function is always replaced with True.
117+
While compiling to HDL, this function is always replaced with True.
118118
'''
119119
return _is_worker_running
120120

121121

122-
def _module_start(self):
122+
def _module_start(self, reentrance=False):
123123
global _is_worker_running
124-
if _is_worker_running:
125-
return
126-
_is_worker_running = True
127-
io._enable()
124+
if not reentrance:
125+
if _is_worker_running:
126+
return
127+
_is_worker_running = True
128+
io._enable()
128129
for w in self._workers:
129130
w.start()
131+
for sub in self._submodules:
132+
sub._start(True)
130133
time.sleep(0.001)
131134

132135

133-
def _module_stop(self):
136+
def _module_stop(self, reentrance=False):
134137
global _is_worker_running
135-
if not _is_worker_running:
136-
return
137-
_is_worker_running = False
138+
if not reentrance:
139+
if not _is_worker_running:
140+
return
141+
_is_worker_running = False
138142
for w in self._workers:
139143
w.prejoin()
140-
io._disable()
144+
for sub in self._submodules:
145+
sub._stop()
146+
if not reentrance:
147+
io._disable()
141148
for w in self._workers:
142149
w.join()
143150

@@ -169,9 +176,13 @@ def _module_decorator(*args, **kwargs):
169176
instance._module_decorator = self
170177
io._enable()
171178
setattr(instance, '_workers', [])
179+
setattr(instance, '_submodules', [])
172180
instance.__init__(*args, **kwargs)
173181
io._disable()
174182
self.module_instances[cls.__name__].append(instance)
183+
for name, obj in instance.__dict__.items():
184+
if obj in self.module_instances[obj.__class__.__name__]:
185+
instance._submodules.append(obj)
175186
return instance
176187
_module_decorator.__dict__ = cls.__dict__.copy()
177188
_module_decorator.cls = cls

polyphony/_internal/_io.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66

77
class Port:
8-
def __init__(self, dtype:generic, direction:str='any', init=None, protocol:str='none') -> object:
8+
def __init__(self, dtype:generic, direction:str, init=None, protocol:str='none') -> object:
99
pass
1010

1111
def rd(self) -> generic:

polyphony/_internal/_polyphony.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = '0.3.1' # type: str
1+
__version__ = '0.3.2' # type: str
22
__all__ = [
33
'testbench',
44
'pure',

polyphony/compiler/__main__.py

Lines changed: 89 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,36 @@
33
import sys
44
from .ahdlusedef import AHDLUseDefDetector
55
from .bitwidth import BitwidthReducer
6-
from .block import BlockReducer, PathExpTracer
76
from .builtin import builtin_symbols
87
from .callgraph import CallGraphBuilder
8+
from .cfgopt import BlockReducer, PathExpTracer
9+
from .cfgopt import HyperBlockBuilder
910
from .common import read_source
1011
from .constopt import ConstantOpt, GlobalConstantOpt
1112
from .constopt import ConstantOptPreDetectROM, EarlyConstantOptNonSSA
1213
from .copyopt import CopyOpt
1314
from .dataflow import DFGBuilder
15+
from .deadcode import DeadCodeEliminator
1416
from .driver import Driver
1517
from .env import env
1618
from .errors import CompileError, InterpretError
1719
from .hdlgen import HDLModuleBuilder
1820
from .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
2024
from .instantiator import ModuleInstantiator, WorkerInstantiator
21-
from .instantiator import EarlyModuleInstantiator
25+
from .instantiator import EarlyModuleInstantiator, EarlyWorkerInstantiator
2226
from .iotransformer import IOTransformer
2327
from .irtranslator import IRTranslator
2428
from .loopdetector import LoopDetector
2529
from .memorytransform import MemoryRenamer, RomDetector
2630
from .memref import MemRefGraphBuilder, MemInstanceGraphBuilder
27-
from .phiresolve import PHICondResolver, StmOrdering
31+
from .phiresolve import PHICondResolver
2832
from .portconverter import PortConverter, FlattenPortList
2933
from .pure import interpret, PureCtorBuilder, PureFuncExecutor
30-
from .quadruplet import QuadrupleMaker
34+
from .quadruplet import EarlyQuadrupleMaker
35+
from .quadruplet import LateQuadrupleMaker
3136
from .regreducer import RegReducer
3237
from .regreducer import AliasVarDetector
3338
from .scheduler import Scheduler
@@ -77,7 +82,7 @@ def preprocess_global(driver):
7782
def 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

121138
def 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-
133146
def 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

194224
def 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+
237273
def 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+
267309
def 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+
327375
def 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+
357411
def 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

Comments
 (0)