Skip to content

Commit 09c77f6

Browse files
committed
Move allocator to separate file
1 parent b7de73b commit 09c77f6

File tree

3 files changed

+53
-47
lines changed

3 files changed

+53
-47
lines changed

assembler.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -679,8 +679,9 @@ def handle_sync(self):
679679
self.block = callback
680680

681681
def finish(self):
682-
self.func.end()
683-
self.func.variables_finalized()
682+
if self.func is not None:
683+
self.func.end()
684+
self.func.variables_finalized()
684685
self.top.end()
685686
Optimizer().optimize(self.top)
686687

cmd_ir/allocator.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from .variables import (GlobalScoreVariable, LocalScoreVariable,
2+
LocalStackVariable)
3+
from .optimizers import Optimizer, TopVisitor, FuncVisitor
4+
from commands import Var
5+
6+
class Allocator(TopVisitor):
7+
8+
def visit(self, top):
9+
self.offset = 0
10+
return super().visit(top)
11+
12+
def visit_global(self, name, var):
13+
var.set_proxy(GlobalScoreVariable(var.type, Var('g%d_%s' % (
14+
self.offset, name))))
15+
self.offset += 1
16+
return name, var
17+
18+
def visit_function(self, name, func):
19+
FuncAllocator().visit(func)
20+
return name, func
21+
22+
class FuncAllocator(FuncVisitor):
23+
24+
def visit(self, func):
25+
self.offset = 0
26+
self.use_scores = True
27+
super().visit(func)
28+
func.variables_finalized()
29+
30+
def visit_local_var(self, name, var):
31+
if self.use_scores and var.type.isnumeric:
32+
var.set_proxy(LocalScoreVariable(var.type,
33+
Var('reg_%d' % self.offset)))
34+
if self.offset >= 4:
35+
self.use_scores = False
36+
self.offset = -1
37+
else:
38+
var.set_proxy(LocalStackVariable(var.type, self.offset))
39+
self.offset += 1
40+
return name, var
41+
42+
def default_allocation(top):
43+
optimizer = Optimizer()
44+
optimizer.optimize(top)
45+
Allocator().visit(top)
46+
optimizer.optimize(top)

ir_main.py

Lines changed: 4 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,19 @@
11
import argparse
2+
23
from cmd_ir.reader import Reader
3-
from cmd_ir.core import *
4-
from cmd_ir.variables import *
5-
from cmd_ir.optimizers import Optimizer, TopVisitor, FuncVisitor
6-
from commands import Var
4+
from cmd_ir.allocator import default_allocation
5+
76
from session import Session
87
from datapack import DummyWriter, DataPackWriter, DebugWriterWrapper
98
from placer import Rel
109
import os
1110

12-
class Allocator(TopVisitor):
13-
14-
def visit(self, top):
15-
self.offset = 0
16-
return super().visit(top)
17-
18-
def visit_global(self, name, var):
19-
var.set_proxy(GlobalScoreVariable(var.type, Var('g%d_%s' % (
20-
self.offset, name))))
21-
self.offset += 1
22-
return name, var
23-
24-
def visit_function(self, name, func):
25-
FuncAllocator().visit(func)
26-
return name, func
27-
28-
class FuncAllocator(FuncVisitor):
29-
30-
def visit(self, func):
31-
self.offset = 0
32-
self.use_scores = True
33-
super().visit(func)
34-
func.variables_finalized()
35-
36-
def visit_local_var(self, name, var):
37-
if self.use_scores and var.type.isnumeric:
38-
var.set_proxy(LocalScoreVariable(var.type,
39-
Var('reg_%d' % self.offset)))
40-
if self.offset >= 4:
41-
self.use_scores = False
42-
self.offset = -1
43-
else:
44-
var.set_proxy(LocalStackVariable(var.type, self.offset))
45-
self.offset += 1
46-
return name, var
47-
4811
def main(args):
4912
reader = Reader()
5013
with args.file as f:
5114
top = reader.read(f.read())
5215

53-
optimizer = Optimizer()
54-
optimizer.optimize(top)
55-
print("Allocate")
56-
Allocator().visit(top)
57-
optimizer.optimize(top)
16+
default_allocation(top)
5817

5918
if args.dump_ir:
6019
print(top.serialize())

0 commit comments

Comments
 (0)