sonolus.py 0.1.3__py3-none-any.whl → 0.1.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sonolus.py might be problematic. Click here for more details.
- sonolus/backend/blocks.py +756 -756
- sonolus/backend/excepthook.py +37 -37
- sonolus/backend/finalize.py +77 -69
- sonolus/backend/interpret.py +7 -7
- sonolus/backend/ir.py +29 -3
- sonolus/backend/mode.py +24 -24
- sonolus/backend/node.py +40 -40
- sonolus/backend/ops.py +197 -197
- sonolus/backend/optimize/__init__.py +0 -0
- sonolus/backend/optimize/allocate.py +126 -0
- sonolus/backend/optimize/constant_evaluation.py +374 -0
- sonolus/backend/optimize/copy_coalesce.py +85 -0
- sonolus/backend/optimize/dead_code.py +185 -0
- sonolus/backend/optimize/dominance.py +96 -0
- sonolus/backend/{flow.py → optimize/flow.py} +122 -92
- sonolus/backend/optimize/inlining.py +137 -0
- sonolus/backend/optimize/liveness.py +177 -0
- sonolus/backend/optimize/optimize.py +44 -0
- sonolus/backend/optimize/passes.py +52 -0
- sonolus/backend/optimize/simplify.py +191 -0
- sonolus/backend/optimize/ssa.py +200 -0
- sonolus/backend/place.py +17 -25
- sonolus/backend/utils.py +58 -48
- sonolus/backend/visitor.py +1151 -882
- sonolus/build/cli.py +7 -1
- sonolus/build/compile.py +88 -90
- sonolus/build/engine.py +10 -5
- sonolus/build/level.py +24 -23
- sonolus/build/node.py +43 -43
- sonolus/script/archetype.py +438 -139
- sonolus/script/array.py +27 -10
- sonolus/script/array_like.py +297 -0
- sonolus/script/bucket.py +253 -191
- sonolus/script/containers.py +257 -51
- sonolus/script/debug.py +26 -10
- sonolus/script/easing.py +365 -0
- sonolus/script/effect.py +191 -131
- sonolus/script/engine.py +71 -4
- sonolus/script/globals.py +303 -269
- sonolus/script/instruction.py +205 -151
- sonolus/script/internal/__init__.py +5 -5
- sonolus/script/internal/builtin_impls.py +255 -144
- sonolus/script/{callbacks.py → internal/callbacks.py} +127 -127
- sonolus/script/internal/constant.py +139 -0
- sonolus/script/internal/context.py +26 -9
- sonolus/script/internal/descriptor.py +17 -17
- sonolus/script/internal/dict_impl.py +65 -0
- sonolus/script/internal/generic.py +6 -9
- sonolus/script/internal/impl.py +38 -13
- sonolus/script/internal/introspection.py +17 -14
- sonolus/script/internal/math_impls.py +121 -0
- sonolus/script/internal/native.py +40 -38
- sonolus/script/internal/random.py +67 -0
- sonolus/script/internal/range.py +81 -0
- sonolus/script/internal/transient.py +51 -0
- sonolus/script/internal/tuple_impl.py +113 -0
- sonolus/script/internal/value.py +3 -3
- sonolus/script/interval.py +338 -112
- sonolus/script/iterator.py +167 -214
- sonolus/script/level.py +24 -0
- sonolus/script/num.py +80 -48
- sonolus/script/options.py +257 -191
- sonolus/script/particle.py +190 -157
- sonolus/script/pointer.py +30 -30
- sonolus/script/print.py +102 -81
- sonolus/script/project.py +8 -0
- sonolus/script/quad.py +263 -0
- sonolus/script/record.py +47 -16
- sonolus/script/runtime.py +52 -1
- sonolus/script/sprite.py +418 -333
- sonolus/script/text.py +409 -407
- sonolus/script/timing.py +114 -42
- sonolus/script/transform.py +332 -48
- sonolus/script/ui.py +216 -160
- sonolus/script/values.py +6 -13
- sonolus/script/vec.py +196 -78
- {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.5.dist-info}/METADATA +1 -1
- sonolus_py-0.1.5.dist-info/RECORD +89 -0
- {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.5.dist-info}/WHEEL +1 -1
- {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.5.dist-info}/licenses/LICENSE +21 -21
- sonolus/backend/allocate.py +0 -51
- sonolus/backend/optimize.py +0 -9
- sonolus/backend/passes.py +0 -6
- sonolus/backend/simplify.py +0 -30
- sonolus/script/comptime.py +0 -160
- sonolus/script/graphics.py +0 -150
- sonolus/script/math.py +0 -92
- sonolus/script/range.py +0 -58
- sonolus_py-0.1.3.dist-info/RECORD +0 -75
- {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.5.dist-info}/entry_points.txt +0 -0
sonolus/backend/ops.py
CHANGED
|
@@ -1,197 +1,197 @@
|
|
|
1
|
-
from enum import StrEnum
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class Op(StrEnum):
|
|
5
|
-
def __new__(cls, name: str, side_effects: bool, pure: bool, control_flow: bool):
|
|
6
|
-
obj = str.__new__(cls, name)
|
|
7
|
-
obj._value_ = name
|
|
8
|
-
obj.side_effects = side_effects
|
|
9
|
-
obj.pure = pure
|
|
10
|
-
obj.control_flow = control_flow
|
|
11
|
-
return obj
|
|
12
|
-
|
|
13
|
-
Abs = ("Abs", False, True, False)
|
|
14
|
-
Add = ("Add", False, True, False)
|
|
15
|
-
And = ("And", False, True, True)
|
|
16
|
-
Arccos = ("Arccos", False, True, False)
|
|
17
|
-
Arcsin = ("Arcsin", False, True, False)
|
|
18
|
-
Arctan = ("Arctan", False, True, False)
|
|
19
|
-
Arctan2 = ("Arctan2", False, True, False)
|
|
20
|
-
BeatToBPM = ("BeatToBPM", False, True, False)
|
|
21
|
-
BeatToStartingBeat = ("BeatToStartingBeat", False, True, False)
|
|
22
|
-
BeatToStartingTime = ("BeatToStartingTime", False, True, False)
|
|
23
|
-
BeatToTime = ("BeatToTime", False, True, False)
|
|
24
|
-
Block = ("Block", False, True, True)
|
|
25
|
-
Break = ("Break", True, False, True)
|
|
26
|
-
Ceil = ("Ceil", False, True, False)
|
|
27
|
-
Clamp = ("Clamp", False, True, False)
|
|
28
|
-
Copy = ("Copy", True, False, False)
|
|
29
|
-
Cos = ("Cos", False, True, False)
|
|
30
|
-
Cosh = ("Cosh", False, True, False)
|
|
31
|
-
DebugLog = ("DebugLog", True, False, False)
|
|
32
|
-
DebugPause = ("DebugPause", True, False, False)
|
|
33
|
-
DecrementPost = ("DecrementPost", True, False, False)
|
|
34
|
-
DecrementPostPointed = ("DecrementPostPointed", True, False, False)
|
|
35
|
-
DecrementPostShifted = ("DecrementPostShifted", True, False, False)
|
|
36
|
-
DecrementPre = ("DecrementPre", True, False, False)
|
|
37
|
-
DecrementPrePointed = ("DecrementPrePointed", True, False, False)
|
|
38
|
-
DecrementPreShifted = ("DecrementPreShifted", True, False, False)
|
|
39
|
-
Degree = ("Degree", False, True, False)
|
|
40
|
-
DestroyParticleEffect = ("DestroyParticleEffect", True, False, False)
|
|
41
|
-
Divide = ("Divide", False, True, False)
|
|
42
|
-
DoWhile = ("DoWhile", False, True, True)
|
|
43
|
-
Draw = ("Draw", True, False, False)
|
|
44
|
-
DrawCurvedB = ("DrawCurvedB", True, False, False)
|
|
45
|
-
DrawCurvedBT = ("DrawCurvedBT", True, False, False)
|
|
46
|
-
DrawCurvedL = ("DrawCurvedL", True, False, False)
|
|
47
|
-
DrawCurvedLR = ("DrawCurvedLR", True, False, False)
|
|
48
|
-
DrawCurvedR = ("DrawCurvedR", True, False, False)
|
|
49
|
-
DrawCurvedT = ("DrawCurvedT", True, False, False)
|
|
50
|
-
EaseInBack = ("EaseInBack", False, True, False)
|
|
51
|
-
EaseInCirc = ("EaseInCirc", False, True, False)
|
|
52
|
-
EaseInCubic = ("EaseInCubic", False, True, False)
|
|
53
|
-
EaseInElastic = ("EaseInElastic", False, True, False)
|
|
54
|
-
EaseInExpo = ("EaseInExpo", False, True, False)
|
|
55
|
-
EaseInOutBack = ("EaseInOutBack", False, True, False)
|
|
56
|
-
EaseInOutCirc = ("EaseInOutCirc", False, True, False)
|
|
57
|
-
EaseInOutCubic = ("EaseInOutCubic", False, True, False)
|
|
58
|
-
EaseInOutElastic = ("EaseInOutElastic", False, True, False)
|
|
59
|
-
EaseInOutExpo = ("EaseInOutExpo", False, True, False)
|
|
60
|
-
EaseInOutQuad = ("EaseInOutQuad", False, True, False)
|
|
61
|
-
EaseInOutQuart = ("EaseInOutQuart", False, True, False)
|
|
62
|
-
EaseInOutQuint = ("EaseInOutQuint", False, True, False)
|
|
63
|
-
EaseInOutSine = ("EaseInOutSine", False, True, False)
|
|
64
|
-
EaseInQuad = ("EaseInQuad", False, True, False)
|
|
65
|
-
EaseInQuart = ("EaseInQuart", False, True, False)
|
|
66
|
-
EaseInQuint = ("EaseInQuint", False, True, False)
|
|
67
|
-
EaseInSine = ("EaseInSine", False, True, False)
|
|
68
|
-
EaseOutBack = ("EaseOutBack", False, True, False)
|
|
69
|
-
EaseOutCirc = ("EaseOutCirc", False, True, False)
|
|
70
|
-
EaseOutCubic = ("EaseOutCubic", False, True, False)
|
|
71
|
-
EaseOutElastic = ("EaseOutElastic", False, True, False)
|
|
72
|
-
EaseOutExpo = ("EaseOutExpo", False, True, False)
|
|
73
|
-
EaseOutInBack = ("EaseOutInBack", False, True, False)
|
|
74
|
-
EaseOutInCirc = ("EaseOutInCirc", False, True, False)
|
|
75
|
-
EaseOutInCubic = ("EaseOutInCubic", False, True, False)
|
|
76
|
-
EaseOutInElastic = ("EaseOutInElastic", False, True, False)
|
|
77
|
-
EaseOutInExpo = ("EaseOutInExpo", False, True, False)
|
|
78
|
-
EaseOutInQuad = ("EaseOutInQuad", False, True, False)
|
|
79
|
-
EaseOutInQuart = ("EaseOutInQuart", False, True, False)
|
|
80
|
-
EaseOutInQuint = ("EaseOutInQuint", False, True, False)
|
|
81
|
-
EaseOutInSine = ("EaseOutInSine", False, True, False)
|
|
82
|
-
EaseOutQuad = ("EaseOutQuad", False, True, False)
|
|
83
|
-
EaseOutQuart = ("EaseOutQuart", False, True, False)
|
|
84
|
-
EaseOutQuint = ("EaseOutQuint", False, True, False)
|
|
85
|
-
EaseOutSine = ("EaseOutSine", False, True, False)
|
|
86
|
-
Equal = ("Equal", False, True, False)
|
|
87
|
-
Execute = ("Execute", False, True, False)
|
|
88
|
-
Execute0 = ("Execute0", False, True, False)
|
|
89
|
-
ExportValue = ("ExportValue", True, False, False)
|
|
90
|
-
Floor = ("Floor", False, True, False)
|
|
91
|
-
Frac = ("Frac", False, True, False)
|
|
92
|
-
Get = ("Get", False, False, False)
|
|
93
|
-
GetPointed = ("GetPointed", False, False, False)
|
|
94
|
-
GetShifted = ("GetShifted", False, False, False)
|
|
95
|
-
Greater = ("Greater", False, True, False)
|
|
96
|
-
GreaterOr = ("GreaterOr", False, True, False)
|
|
97
|
-
HasEffectClip = ("HasEffectClip", False, True, False)
|
|
98
|
-
HasParticleEffect = ("HasParticleEffect", False, True, False)
|
|
99
|
-
HasSkinSprite = ("HasSkinSprite", False, True, False)
|
|
100
|
-
If = ("If", False, True, True)
|
|
101
|
-
IncrementPost = ("IncrementPost", True, False, False)
|
|
102
|
-
IncrementPostPointed = ("IncrementPostPointed", True, False, False)
|
|
103
|
-
IncrementPostShifted = ("IncrementPostShifted", True, False, False)
|
|
104
|
-
IncrementPre = ("IncrementPre", True, False, False)
|
|
105
|
-
IncrementPrePointed = ("IncrementPrePointed", True, False, False)
|
|
106
|
-
IncrementPreShifted = ("IncrementPreShifted", True, False, False)
|
|
107
|
-
Judge = ("Judge", False, True, False)
|
|
108
|
-
JudgeSimple = ("JudgeSimple", False, True, False)
|
|
109
|
-
JumpLoop = ("JumpLoop", False, True, True)
|
|
110
|
-
Lerp = ("Lerp", False, True, False)
|
|
111
|
-
LerpClamped = ("LerpClamped", False, True, False)
|
|
112
|
-
Less = ("Less", False, True, False)
|
|
113
|
-
LessOr = ("LessOr", False, True, False)
|
|
114
|
-
Log = ("Log", False, True, False)
|
|
115
|
-
Max = ("Max", False, True, False)
|
|
116
|
-
Min = ("Min", False, True, False)
|
|
117
|
-
Mod = ("Mod", False, True, False)
|
|
118
|
-
MoveParticleEffect = ("MoveParticleEffect", True, False, False)
|
|
119
|
-
Multiply = ("Multiply", False, True, False)
|
|
120
|
-
Negate = ("Negate", False, True, False)
|
|
121
|
-
Not = ("Not", False, True, False)
|
|
122
|
-
NotEqual = ("NotEqual", False, True, False)
|
|
123
|
-
Or = ("Or", False, True, True)
|
|
124
|
-
Paint = ("Paint", True, False, False)
|
|
125
|
-
Play = ("Play", True, False, False)
|
|
126
|
-
PlayLooped = ("PlayLooped", True, False, False)
|
|
127
|
-
PlayLoopedScheduled = ("PlayLoopedScheduled", True, False, False)
|
|
128
|
-
PlayScheduled = ("PlayScheduled", True, False, False)
|
|
129
|
-
Power = ("Power", False, True, False)
|
|
130
|
-
Print = ("Print", True, False, False)
|
|
131
|
-
Radian = ("Radian", False, True, False)
|
|
132
|
-
Random = ("Random", False, False, False)
|
|
133
|
-
RandomInteger = ("RandomInteger", False, False, False)
|
|
134
|
-
Rem = ("Rem", False, True, False)
|
|
135
|
-
Remap = ("Remap", False, True, False)
|
|
136
|
-
RemapClamped = ("RemapClamped", False, True, False)
|
|
137
|
-
Round = ("Round", False, True, False)
|
|
138
|
-
Set = ("Set", True, False, False)
|
|
139
|
-
SetAdd = ("SetAdd", True, False, False)
|
|
140
|
-
SetAddPointed = ("SetAddPointed", True, False, False)
|
|
141
|
-
SetAddShifted = ("SetAddShifted", True, False, False)
|
|
142
|
-
SetDivide = ("SetDivide", True, False, False)
|
|
143
|
-
SetDividePointed = ("SetDividePointed", True, False, False)
|
|
144
|
-
SetDivideShifted = ("SetDivideShifted", True, False, False)
|
|
145
|
-
SetMod = ("SetMod", True, False, False)
|
|
146
|
-
SetModPointed = ("SetModPointed", True, False, False)
|
|
147
|
-
SetModShifted = ("SetModShifted", True, False, False)
|
|
148
|
-
SetMultiply = ("SetMultiply", True, False, False)
|
|
149
|
-
SetMultiplyPointed = ("SetMultiplyPointed", True, False, False)
|
|
150
|
-
SetMultiplyShifted = ("SetMultiplyShifted", True, False, False)
|
|
151
|
-
SetPointed = ("SetPointed", True, False, False)
|
|
152
|
-
SetPower = ("SetPower", True, False, False)
|
|
153
|
-
SetPowerPointed = ("SetPowerPointed", True, False, False)
|
|
154
|
-
SetPowerShifted = ("SetPowerShifted", True, False, False)
|
|
155
|
-
SetRem = ("SetRem", True, False, False)
|
|
156
|
-
SetRemPointed = ("SetRemPointed", True, False, False)
|
|
157
|
-
SetRemShifted = ("SetRemShifted", True, False, False)
|
|
158
|
-
SetShifted = ("SetShifted", True, False, False)
|
|
159
|
-
SetSubtract = ("SetSubtract", True, False, False)
|
|
160
|
-
SetSubtractPointed = ("SetSubtractPointed", True, False, False)
|
|
161
|
-
SetSubtractShifted = ("SetSubtractShifted", True, False, False)
|
|
162
|
-
Sign = ("Sign", False, True, False)
|
|
163
|
-
Sin = ("Sin", False, True, False)
|
|
164
|
-
Sinh = ("Sinh", False, True, False)
|
|
165
|
-
Spawn = ("Spawn", True, False, False)
|
|
166
|
-
SpawnParticleEffect = ("SpawnParticleEffect", True, False, False)
|
|
167
|
-
StackEnter = ("StackEnter", True, False, False)
|
|
168
|
-
StackGet = ("StackGet", False, False, False)
|
|
169
|
-
StackGetFrame = ("StackGetFrame", False, False, False)
|
|
170
|
-
StackGetFramePointer = ("StackGetFramePointer", False, False, False)
|
|
171
|
-
StackGetPointer = ("StackGetPointer", False, False, False)
|
|
172
|
-
StackGrow = ("StackGrow", True, False, False)
|
|
173
|
-
StackInit = ("StackInit", True, False, False)
|
|
174
|
-
StackLeave = ("StackLeave", True, False, False)
|
|
175
|
-
StackPop = ("StackPop", True, False, False)
|
|
176
|
-
StackPush = ("StackPush", True, False, False)
|
|
177
|
-
StackSet = ("StackSet", True, False, False)
|
|
178
|
-
StackSetFrame = ("StackSetFrame", True, False, False)
|
|
179
|
-
StackSetFramePointer = ("StackSetFramePointer", True, False, False)
|
|
180
|
-
StackSetPointer = ("StackSetPointer", True, False, False)
|
|
181
|
-
StopLooped = ("StopLooped", True, False, False)
|
|
182
|
-
StopLoopedScheduled = ("StopLoopedScheduled", True, False, False)
|
|
183
|
-
Subtract = ("Subtract", False, True, False)
|
|
184
|
-
Switch = ("Switch", False, True, True)
|
|
185
|
-
SwitchInteger = ("SwitchInteger", False, True, True)
|
|
186
|
-
SwitchIntegerWithDefault = ("SwitchIntegerWithDefault", False, True, True)
|
|
187
|
-
SwitchWithDefault = ("SwitchWithDefault", False, True, True)
|
|
188
|
-
Tan = ("Tan", False, True, False)
|
|
189
|
-
Tanh = ("Tanh", False, True, False)
|
|
190
|
-
TimeToScaledTime = ("TimeToScaledTime", False, True, False)
|
|
191
|
-
TimeToStartingScaledTime = ("TimeToStartingScaledTime", False, True, False)
|
|
192
|
-
TimeToStartingTime = ("TimeToStartingTime", False, True, False)
|
|
193
|
-
TimeToTimeScale = ("TimeToTimeScale", False, True, False)
|
|
194
|
-
Trunc = ("Trunc", False, True, False)
|
|
195
|
-
Unlerp = ("Unlerp", False, True, False)
|
|
196
|
-
UnlerpClamped = ("UnlerpClamped", False, True, False)
|
|
197
|
-
While = ("While", False, True, True)
|
|
1
|
+
from enum import StrEnum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Op(StrEnum):
|
|
5
|
+
def __new__(cls, name: str, side_effects: bool, pure: bool, control_flow: bool):
|
|
6
|
+
obj = str.__new__(cls, name)
|
|
7
|
+
obj._value_ = name
|
|
8
|
+
obj.side_effects = side_effects
|
|
9
|
+
obj.pure = pure
|
|
10
|
+
obj.control_flow = control_flow
|
|
11
|
+
return obj
|
|
12
|
+
|
|
13
|
+
Abs = ("Abs", False, True, False)
|
|
14
|
+
Add = ("Add", False, True, False)
|
|
15
|
+
And = ("And", False, True, True)
|
|
16
|
+
Arccos = ("Arccos", False, True, False)
|
|
17
|
+
Arcsin = ("Arcsin", False, True, False)
|
|
18
|
+
Arctan = ("Arctan", False, True, False)
|
|
19
|
+
Arctan2 = ("Arctan2", False, True, False)
|
|
20
|
+
BeatToBPM = ("BeatToBPM", False, True, False)
|
|
21
|
+
BeatToStartingBeat = ("BeatToStartingBeat", False, True, False)
|
|
22
|
+
BeatToStartingTime = ("BeatToStartingTime", False, True, False)
|
|
23
|
+
BeatToTime = ("BeatToTime", False, True, False)
|
|
24
|
+
Block = ("Block", False, True, True)
|
|
25
|
+
Break = ("Break", True, False, True)
|
|
26
|
+
Ceil = ("Ceil", False, True, False)
|
|
27
|
+
Clamp = ("Clamp", False, True, False)
|
|
28
|
+
Copy = ("Copy", True, False, False)
|
|
29
|
+
Cos = ("Cos", False, True, False)
|
|
30
|
+
Cosh = ("Cosh", False, True, False)
|
|
31
|
+
DebugLog = ("DebugLog", True, False, False)
|
|
32
|
+
DebugPause = ("DebugPause", True, False, False)
|
|
33
|
+
DecrementPost = ("DecrementPost", True, False, False)
|
|
34
|
+
DecrementPostPointed = ("DecrementPostPointed", True, False, False)
|
|
35
|
+
DecrementPostShifted = ("DecrementPostShifted", True, False, False)
|
|
36
|
+
DecrementPre = ("DecrementPre", True, False, False)
|
|
37
|
+
DecrementPrePointed = ("DecrementPrePointed", True, False, False)
|
|
38
|
+
DecrementPreShifted = ("DecrementPreShifted", True, False, False)
|
|
39
|
+
Degree = ("Degree", False, True, False)
|
|
40
|
+
DestroyParticleEffect = ("DestroyParticleEffect", True, False, False)
|
|
41
|
+
Divide = ("Divide", False, True, False)
|
|
42
|
+
DoWhile = ("DoWhile", False, True, True)
|
|
43
|
+
Draw = ("Draw", True, False, False)
|
|
44
|
+
DrawCurvedB = ("DrawCurvedB", True, False, False)
|
|
45
|
+
DrawCurvedBT = ("DrawCurvedBT", True, False, False)
|
|
46
|
+
DrawCurvedL = ("DrawCurvedL", True, False, False)
|
|
47
|
+
DrawCurvedLR = ("DrawCurvedLR", True, False, False)
|
|
48
|
+
DrawCurvedR = ("DrawCurvedR", True, False, False)
|
|
49
|
+
DrawCurvedT = ("DrawCurvedT", True, False, False)
|
|
50
|
+
EaseInBack = ("EaseInBack", False, True, False)
|
|
51
|
+
EaseInCirc = ("EaseInCirc", False, True, False)
|
|
52
|
+
EaseInCubic = ("EaseInCubic", False, True, False)
|
|
53
|
+
EaseInElastic = ("EaseInElastic", False, True, False)
|
|
54
|
+
EaseInExpo = ("EaseInExpo", False, True, False)
|
|
55
|
+
EaseInOutBack = ("EaseInOutBack", False, True, False)
|
|
56
|
+
EaseInOutCirc = ("EaseInOutCirc", False, True, False)
|
|
57
|
+
EaseInOutCubic = ("EaseInOutCubic", False, True, False)
|
|
58
|
+
EaseInOutElastic = ("EaseInOutElastic", False, True, False)
|
|
59
|
+
EaseInOutExpo = ("EaseInOutExpo", False, True, False)
|
|
60
|
+
EaseInOutQuad = ("EaseInOutQuad", False, True, False)
|
|
61
|
+
EaseInOutQuart = ("EaseInOutQuart", False, True, False)
|
|
62
|
+
EaseInOutQuint = ("EaseInOutQuint", False, True, False)
|
|
63
|
+
EaseInOutSine = ("EaseInOutSine", False, True, False)
|
|
64
|
+
EaseInQuad = ("EaseInQuad", False, True, False)
|
|
65
|
+
EaseInQuart = ("EaseInQuart", False, True, False)
|
|
66
|
+
EaseInQuint = ("EaseInQuint", False, True, False)
|
|
67
|
+
EaseInSine = ("EaseInSine", False, True, False)
|
|
68
|
+
EaseOutBack = ("EaseOutBack", False, True, False)
|
|
69
|
+
EaseOutCirc = ("EaseOutCirc", False, True, False)
|
|
70
|
+
EaseOutCubic = ("EaseOutCubic", False, True, False)
|
|
71
|
+
EaseOutElastic = ("EaseOutElastic", False, True, False)
|
|
72
|
+
EaseOutExpo = ("EaseOutExpo", False, True, False)
|
|
73
|
+
EaseOutInBack = ("EaseOutInBack", False, True, False)
|
|
74
|
+
EaseOutInCirc = ("EaseOutInCirc", False, True, False)
|
|
75
|
+
EaseOutInCubic = ("EaseOutInCubic", False, True, False)
|
|
76
|
+
EaseOutInElastic = ("EaseOutInElastic", False, True, False)
|
|
77
|
+
EaseOutInExpo = ("EaseOutInExpo", False, True, False)
|
|
78
|
+
EaseOutInQuad = ("EaseOutInQuad", False, True, False)
|
|
79
|
+
EaseOutInQuart = ("EaseOutInQuart", False, True, False)
|
|
80
|
+
EaseOutInQuint = ("EaseOutInQuint", False, True, False)
|
|
81
|
+
EaseOutInSine = ("EaseOutInSine", False, True, False)
|
|
82
|
+
EaseOutQuad = ("EaseOutQuad", False, True, False)
|
|
83
|
+
EaseOutQuart = ("EaseOutQuart", False, True, False)
|
|
84
|
+
EaseOutQuint = ("EaseOutQuint", False, True, False)
|
|
85
|
+
EaseOutSine = ("EaseOutSine", False, True, False)
|
|
86
|
+
Equal = ("Equal", False, True, False)
|
|
87
|
+
Execute = ("Execute", False, True, False)
|
|
88
|
+
Execute0 = ("Execute0", False, True, False)
|
|
89
|
+
ExportValue = ("ExportValue", True, False, False)
|
|
90
|
+
Floor = ("Floor", False, True, False)
|
|
91
|
+
Frac = ("Frac", False, True, False)
|
|
92
|
+
Get = ("Get", False, False, False)
|
|
93
|
+
GetPointed = ("GetPointed", False, False, False)
|
|
94
|
+
GetShifted = ("GetShifted", False, False, False)
|
|
95
|
+
Greater = ("Greater", False, True, False)
|
|
96
|
+
GreaterOr = ("GreaterOr", False, True, False)
|
|
97
|
+
HasEffectClip = ("HasEffectClip", False, True, False)
|
|
98
|
+
HasParticleEffect = ("HasParticleEffect", False, True, False)
|
|
99
|
+
HasSkinSprite = ("HasSkinSprite", False, True, False)
|
|
100
|
+
If = ("If", False, True, True)
|
|
101
|
+
IncrementPost = ("IncrementPost", True, False, False)
|
|
102
|
+
IncrementPostPointed = ("IncrementPostPointed", True, False, False)
|
|
103
|
+
IncrementPostShifted = ("IncrementPostShifted", True, False, False)
|
|
104
|
+
IncrementPre = ("IncrementPre", True, False, False)
|
|
105
|
+
IncrementPrePointed = ("IncrementPrePointed", True, False, False)
|
|
106
|
+
IncrementPreShifted = ("IncrementPreShifted", True, False, False)
|
|
107
|
+
Judge = ("Judge", False, True, False)
|
|
108
|
+
JudgeSimple = ("JudgeSimple", False, True, False)
|
|
109
|
+
JumpLoop = ("JumpLoop", False, True, True)
|
|
110
|
+
Lerp = ("Lerp", False, True, False)
|
|
111
|
+
LerpClamped = ("LerpClamped", False, True, False)
|
|
112
|
+
Less = ("Less", False, True, False)
|
|
113
|
+
LessOr = ("LessOr", False, True, False)
|
|
114
|
+
Log = ("Log", False, True, False)
|
|
115
|
+
Max = ("Max", False, True, False)
|
|
116
|
+
Min = ("Min", False, True, False)
|
|
117
|
+
Mod = ("Mod", False, True, False)
|
|
118
|
+
MoveParticleEffect = ("MoveParticleEffect", True, False, False)
|
|
119
|
+
Multiply = ("Multiply", False, True, False)
|
|
120
|
+
Negate = ("Negate", False, True, False)
|
|
121
|
+
Not = ("Not", False, True, False)
|
|
122
|
+
NotEqual = ("NotEqual", False, True, False)
|
|
123
|
+
Or = ("Or", False, True, True)
|
|
124
|
+
Paint = ("Paint", True, False, False)
|
|
125
|
+
Play = ("Play", True, False, False)
|
|
126
|
+
PlayLooped = ("PlayLooped", True, False, False)
|
|
127
|
+
PlayLoopedScheduled = ("PlayLoopedScheduled", True, False, False)
|
|
128
|
+
PlayScheduled = ("PlayScheduled", True, False, False)
|
|
129
|
+
Power = ("Power", False, True, False)
|
|
130
|
+
Print = ("Print", True, False, False)
|
|
131
|
+
Radian = ("Radian", False, True, False)
|
|
132
|
+
Random = ("Random", False, False, False)
|
|
133
|
+
RandomInteger = ("RandomInteger", False, False, False)
|
|
134
|
+
Rem = ("Rem", False, True, False)
|
|
135
|
+
Remap = ("Remap", False, True, False)
|
|
136
|
+
RemapClamped = ("RemapClamped", False, True, False)
|
|
137
|
+
Round = ("Round", False, True, False)
|
|
138
|
+
Set = ("Set", True, False, False)
|
|
139
|
+
SetAdd = ("SetAdd", True, False, False)
|
|
140
|
+
SetAddPointed = ("SetAddPointed", True, False, False)
|
|
141
|
+
SetAddShifted = ("SetAddShifted", True, False, False)
|
|
142
|
+
SetDivide = ("SetDivide", True, False, False)
|
|
143
|
+
SetDividePointed = ("SetDividePointed", True, False, False)
|
|
144
|
+
SetDivideShifted = ("SetDivideShifted", True, False, False)
|
|
145
|
+
SetMod = ("SetMod", True, False, False)
|
|
146
|
+
SetModPointed = ("SetModPointed", True, False, False)
|
|
147
|
+
SetModShifted = ("SetModShifted", True, False, False)
|
|
148
|
+
SetMultiply = ("SetMultiply", True, False, False)
|
|
149
|
+
SetMultiplyPointed = ("SetMultiplyPointed", True, False, False)
|
|
150
|
+
SetMultiplyShifted = ("SetMultiplyShifted", True, False, False)
|
|
151
|
+
SetPointed = ("SetPointed", True, False, False)
|
|
152
|
+
SetPower = ("SetPower", True, False, False)
|
|
153
|
+
SetPowerPointed = ("SetPowerPointed", True, False, False)
|
|
154
|
+
SetPowerShifted = ("SetPowerShifted", True, False, False)
|
|
155
|
+
SetRem = ("SetRem", True, False, False)
|
|
156
|
+
SetRemPointed = ("SetRemPointed", True, False, False)
|
|
157
|
+
SetRemShifted = ("SetRemShifted", True, False, False)
|
|
158
|
+
SetShifted = ("SetShifted", True, False, False)
|
|
159
|
+
SetSubtract = ("SetSubtract", True, False, False)
|
|
160
|
+
SetSubtractPointed = ("SetSubtractPointed", True, False, False)
|
|
161
|
+
SetSubtractShifted = ("SetSubtractShifted", True, False, False)
|
|
162
|
+
Sign = ("Sign", False, True, False)
|
|
163
|
+
Sin = ("Sin", False, True, False)
|
|
164
|
+
Sinh = ("Sinh", False, True, False)
|
|
165
|
+
Spawn = ("Spawn", True, False, False)
|
|
166
|
+
SpawnParticleEffect = ("SpawnParticleEffect", True, False, False)
|
|
167
|
+
StackEnter = ("StackEnter", True, False, False)
|
|
168
|
+
StackGet = ("StackGet", False, False, False)
|
|
169
|
+
StackGetFrame = ("StackGetFrame", False, False, False)
|
|
170
|
+
StackGetFramePointer = ("StackGetFramePointer", False, False, False)
|
|
171
|
+
StackGetPointer = ("StackGetPointer", False, False, False)
|
|
172
|
+
StackGrow = ("StackGrow", True, False, False)
|
|
173
|
+
StackInit = ("StackInit", True, False, False)
|
|
174
|
+
StackLeave = ("StackLeave", True, False, False)
|
|
175
|
+
StackPop = ("StackPop", True, False, False)
|
|
176
|
+
StackPush = ("StackPush", True, False, False)
|
|
177
|
+
StackSet = ("StackSet", True, False, False)
|
|
178
|
+
StackSetFrame = ("StackSetFrame", True, False, False)
|
|
179
|
+
StackSetFramePointer = ("StackSetFramePointer", True, False, False)
|
|
180
|
+
StackSetPointer = ("StackSetPointer", True, False, False)
|
|
181
|
+
StopLooped = ("StopLooped", True, False, False)
|
|
182
|
+
StopLoopedScheduled = ("StopLoopedScheduled", True, False, False)
|
|
183
|
+
Subtract = ("Subtract", False, True, False)
|
|
184
|
+
Switch = ("Switch", False, True, True)
|
|
185
|
+
SwitchInteger = ("SwitchInteger", False, True, True)
|
|
186
|
+
SwitchIntegerWithDefault = ("SwitchIntegerWithDefault", False, True, True)
|
|
187
|
+
SwitchWithDefault = ("SwitchWithDefault", False, True, True)
|
|
188
|
+
Tan = ("Tan", False, True, False)
|
|
189
|
+
Tanh = ("Tanh", False, True, False)
|
|
190
|
+
TimeToScaledTime = ("TimeToScaledTime", False, True, False)
|
|
191
|
+
TimeToStartingScaledTime = ("TimeToStartingScaledTime", False, True, False)
|
|
192
|
+
TimeToStartingTime = ("TimeToStartingTime", False, True, False)
|
|
193
|
+
TimeToTimeScale = ("TimeToTimeScale", False, True, False)
|
|
194
|
+
Trunc = ("Trunc", False, True, False)
|
|
195
|
+
Unlerp = ("Unlerp", False, True, False)
|
|
196
|
+
UnlerpClamped = ("UnlerpClamped", False, True, False)
|
|
197
|
+
While = ("While", False, True, True)
|
|
File without changes
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
from sonolus.backend.ir import IRConst, IRGet, IRInstr, IRPureInstr, IRSet
|
|
2
|
+
from sonolus.backend.optimize.flow import BasicBlock, traverse_cfg_preorder
|
|
3
|
+
from sonolus.backend.optimize.liveness import LivenessAnalysis, get_live
|
|
4
|
+
from sonolus.backend.optimize.passes import CompilerPass
|
|
5
|
+
from sonolus.backend.place import BlockPlace, TempBlock
|
|
6
|
+
|
|
7
|
+
TEMP_SIZE = 4096
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AllocateBasic(CompilerPass):
|
|
11
|
+
"""Allocate temporary memory for temporary variables without considering lifetimes."""
|
|
12
|
+
|
|
13
|
+
def run(self, entry: BasicBlock):
|
|
14
|
+
offsets = {}
|
|
15
|
+
index = 0
|
|
16
|
+
|
|
17
|
+
def process(stmt):
|
|
18
|
+
nonlocal index
|
|
19
|
+
match stmt:
|
|
20
|
+
case int():
|
|
21
|
+
return stmt
|
|
22
|
+
case IRConst():
|
|
23
|
+
return stmt
|
|
24
|
+
case IRPureInstr(op=op, args=args):
|
|
25
|
+
return IRPureInstr(
|
|
26
|
+
op=op,
|
|
27
|
+
args=[process(arg) for arg in args],
|
|
28
|
+
)
|
|
29
|
+
case IRInstr(op=op, args=args):
|
|
30
|
+
return IRInstr(
|
|
31
|
+
op=op,
|
|
32
|
+
args=[process(arg) for arg in args],
|
|
33
|
+
)
|
|
34
|
+
case IRGet(place=place):
|
|
35
|
+
return IRGet(place=process(place))
|
|
36
|
+
case IRSet(place=place, value=value):
|
|
37
|
+
return IRSet(place=process(place), value=process(value))
|
|
38
|
+
case BlockPlace() as place:
|
|
39
|
+
if isinstance(place.block, TempBlock):
|
|
40
|
+
if place.block not in offsets:
|
|
41
|
+
offsets[place.block] = index
|
|
42
|
+
index += place.block.size
|
|
43
|
+
if index >= TEMP_SIZE:
|
|
44
|
+
raise ValueError("Temporary memory limit exceeded")
|
|
45
|
+
return BlockPlace(10000, process(place.index), place.offset + offsets[place.block])
|
|
46
|
+
return BlockPlace(
|
|
47
|
+
process(place.block) if isinstance(place.block, BlockPlace) else place.block,
|
|
48
|
+
process(place.index),
|
|
49
|
+
process(place.offset),
|
|
50
|
+
)
|
|
51
|
+
case _:
|
|
52
|
+
raise TypeError(f"Unsupported statement: {stmt}")
|
|
53
|
+
|
|
54
|
+
for block in traverse_cfg_preorder(entry):
|
|
55
|
+
block.statements = [process(statement) for statement in block.statements]
|
|
56
|
+
block.test = process(block.test)
|
|
57
|
+
|
|
58
|
+
return entry
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class Allocate(CompilerPass):
|
|
62
|
+
def requires(self) -> set[CompilerPass]:
|
|
63
|
+
return {LivenessAnalysis()}
|
|
64
|
+
|
|
65
|
+
def run(self, entry: BasicBlock):
|
|
66
|
+
mapping = self.get_mapping(entry)
|
|
67
|
+
for block in traverse_cfg_preorder(entry):
|
|
68
|
+
block.statements = [self.update_stmt(statement, mapping) for statement in block.statements]
|
|
69
|
+
block.test = self.update_stmt(block.test, mapping)
|
|
70
|
+
return entry
|
|
71
|
+
|
|
72
|
+
def update_stmt(self, stmt, mapping: dict[TempBlock, int]):
|
|
73
|
+
match stmt:
|
|
74
|
+
case int() | float() | IRConst():
|
|
75
|
+
return stmt
|
|
76
|
+
case IRInstr(op=op, args=args):
|
|
77
|
+
return IRInstr(op=op, args=[self.update_stmt(arg, mapping) for arg in args])
|
|
78
|
+
case IRPureInstr(op=op, args=args):
|
|
79
|
+
return IRPureInstr(op=op, args=[self.update_stmt(arg, mapping) for arg in args])
|
|
80
|
+
case IRGet(place=place):
|
|
81
|
+
return IRGet(place=self.update_stmt(place, mapping))
|
|
82
|
+
case IRSet(place=place, value=value):
|
|
83
|
+
return IRSet(place=self.update_stmt(place, mapping), value=self.update_stmt(value, mapping))
|
|
84
|
+
case BlockPlace(block=block, index=index, offset=offset):
|
|
85
|
+
if isinstance(block, TempBlock):
|
|
86
|
+
if block.size == 0:
|
|
87
|
+
offset = -1
|
|
88
|
+
else:
|
|
89
|
+
assert block in mapping, f"Missing mapping for {block}, dead variable not removed?"
|
|
90
|
+
offset = mapping[block] + offset
|
|
91
|
+
return BlockPlace(block=10000, index=self.update_stmt(index, mapping), offset=offset)
|
|
92
|
+
return BlockPlace(
|
|
93
|
+
block=self.update_stmt(block, mapping),
|
|
94
|
+
index=self.update_stmt(index, mapping),
|
|
95
|
+
offset=self.update_stmt(offset, mapping),
|
|
96
|
+
)
|
|
97
|
+
case _:
|
|
98
|
+
raise TypeError(f"Unsupported statement: {stmt}")
|
|
99
|
+
|
|
100
|
+
def get_mapping(self, entry: BasicBlock) -> dict[TempBlock, int]:
|
|
101
|
+
interference = self.get_interference(entry)
|
|
102
|
+
offsets: dict[TempBlock, int] = {}
|
|
103
|
+
|
|
104
|
+
for block, others in sorted(interference.items(), key=lambda x: -x[0].size):
|
|
105
|
+
size = block.size
|
|
106
|
+
offset = 0
|
|
107
|
+
for other in sorted(others, key=lambda x: offsets.get(x, 0) + x.size):
|
|
108
|
+
if other not in offsets:
|
|
109
|
+
continue
|
|
110
|
+
other_offset = offsets[other]
|
|
111
|
+
if offset + size > other_offset or other_offset + other.size > offset:
|
|
112
|
+
offset = other_offset + other.size
|
|
113
|
+
if offset + size > TEMP_SIZE:
|
|
114
|
+
raise ValueError("Temporary memory limit exceeded")
|
|
115
|
+
offsets[block] = offset
|
|
116
|
+
|
|
117
|
+
return offsets
|
|
118
|
+
|
|
119
|
+
def get_interference(self, entry: BasicBlock) -> dict[TempBlock, set[TempBlock]]:
|
|
120
|
+
result = {}
|
|
121
|
+
for block in traverse_cfg_preorder(entry):
|
|
122
|
+
for stmt in [*block.statements, block.test]:
|
|
123
|
+
live = {p for p in get_live(stmt) if isinstance(p, TempBlock) and p.size > 0}
|
|
124
|
+
for place in live:
|
|
125
|
+
result.setdefault(place, set()).update(live - {place})
|
|
126
|
+
return result
|