sonolus.py 0.1.3__py3-none-any.whl → 0.1.4__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.

Files changed (68) hide show
  1. sonolus/backend/allocate.py +125 -51
  2. sonolus/backend/blocks.py +756 -756
  3. sonolus/backend/coalesce.py +85 -0
  4. sonolus/backend/constant_evaluation.py +374 -0
  5. sonolus/backend/dead_code.py +80 -0
  6. sonolus/backend/dominance.py +111 -0
  7. sonolus/backend/excepthook.py +37 -37
  8. sonolus/backend/finalize.py +69 -69
  9. sonolus/backend/flow.py +121 -92
  10. sonolus/backend/inlining.py +150 -0
  11. sonolus/backend/ir.py +5 -3
  12. sonolus/backend/liveness.py +173 -0
  13. sonolus/backend/mode.py +24 -24
  14. sonolus/backend/node.py +40 -40
  15. sonolus/backend/ops.py +197 -197
  16. sonolus/backend/optimize.py +37 -9
  17. sonolus/backend/passes.py +52 -6
  18. sonolus/backend/simplify.py +47 -30
  19. sonolus/backend/ssa.py +187 -0
  20. sonolus/backend/utils.py +48 -48
  21. sonolus/backend/visitor.py +892 -882
  22. sonolus/build/cli.py +7 -1
  23. sonolus/build/compile.py +88 -90
  24. sonolus/build/level.py +24 -23
  25. sonolus/build/node.py +43 -43
  26. sonolus/script/archetype.py +23 -6
  27. sonolus/script/array.py +2 -2
  28. sonolus/script/bucket.py +191 -191
  29. sonolus/script/callbacks.py +127 -127
  30. sonolus/script/comptime.py +1 -1
  31. sonolus/script/containers.py +23 -0
  32. sonolus/script/debug.py +19 -3
  33. sonolus/script/easing.py +323 -0
  34. sonolus/script/effect.py +131 -131
  35. sonolus/script/globals.py +269 -269
  36. sonolus/script/graphics.py +200 -150
  37. sonolus/script/instruction.py +151 -151
  38. sonolus/script/internal/__init__.py +5 -5
  39. sonolus/script/internal/builtin_impls.py +144 -144
  40. sonolus/script/internal/context.py +12 -4
  41. sonolus/script/internal/descriptor.py +17 -17
  42. sonolus/script/internal/introspection.py +14 -14
  43. sonolus/script/internal/native.py +40 -38
  44. sonolus/script/internal/value.py +3 -3
  45. sonolus/script/interval.py +120 -112
  46. sonolus/script/iterator.py +214 -214
  47. sonolus/script/math.py +30 -1
  48. sonolus/script/num.py +1 -1
  49. sonolus/script/options.py +191 -191
  50. sonolus/script/particle.py +157 -157
  51. sonolus/script/pointer.py +30 -30
  52. sonolus/script/print.py +81 -81
  53. sonolus/script/random.py +14 -0
  54. sonolus/script/range.py +58 -58
  55. sonolus/script/record.py +3 -3
  56. sonolus/script/runtime.py +2 -0
  57. sonolus/script/sprite.py +333 -333
  58. sonolus/script/text.py +407 -407
  59. sonolus/script/timing.py +42 -42
  60. sonolus/script/transform.py +77 -23
  61. sonolus/script/ui.py +160 -160
  62. sonolus/script/vec.py +81 -78
  63. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.4.dist-info}/METADATA +1 -1
  64. sonolus_py-0.1.4.dist-info/RECORD +84 -0
  65. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.4.dist-info}/WHEEL +1 -1
  66. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.4.dist-info}/licenses/LICENSE +21 -21
  67. sonolus_py-0.1.3.dist-info/RECORD +0 -75
  68. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.4.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)
@@ -1,9 +1,37 @@
1
- from sonolus.backend.allocate import AllocateBasic
2
- from sonolus.backend.flow import BasicBlock
3
- from sonolus.backend.simplify import CoalesceFlow
4
-
5
-
6
- def optimize_and_allocate(cfg: BasicBlock):
7
- cfg = CoalesceFlow().run(cfg)
8
- cfg = AllocateBasic().run(cfg)
9
- return cfg
1
+ from sonolus.backend.allocate import Allocate, AllocateBasic
2
+ from sonolus.backend.coalesce import CopyCoalesce
3
+ from sonolus.backend.constant_evaluation import SparseConditionalConstantPropagation
4
+ from sonolus.backend.dead_code import DeadCodeElimination, UnreachableCodeElimination
5
+ from sonolus.backend.flow import BasicBlock
6
+ from sonolus.backend.inlining import InlineVars
7
+ from sonolus.backend.passes import run_passes
8
+ from sonolus.backend.simplify import CoalesceFlow
9
+ from sonolus.backend.ssa import FromSSA, ToSSA
10
+
11
+ MINIMAL_PASSES = [
12
+ CoalesceFlow(),
13
+ UnreachableCodeElimination(),
14
+ AllocateBasic(),
15
+ ]
16
+
17
+ STANDARD_PASSES = [
18
+ CoalesceFlow(),
19
+ UnreachableCodeElimination(),
20
+ DeadCodeElimination(),
21
+ ToSSA(),
22
+ SparseConditionalConstantPropagation(),
23
+ UnreachableCodeElimination(),
24
+ DeadCodeElimination(),
25
+ CoalesceFlow(),
26
+ InlineVars(),
27
+ FromSSA(),
28
+ CoalesceFlow(),
29
+ CopyCoalesce(),
30
+ DeadCodeElimination(),
31
+ CoalesceFlow(),
32
+ Allocate(),
33
+ ]
34
+
35
+
36
+ def optimize_and_allocate(cfg: BasicBlock):
37
+ return run_passes(cfg, STANDARD_PASSES)
sonolus/backend/passes.py CHANGED
@@ -1,6 +1,52 @@
1
- from sonolus.backend.flow import BasicBlock
2
-
3
-
4
- class CompilerPass:
5
- def run(self, entry: BasicBlock) -> BasicBlock:
6
- pass
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from collections import deque
5
+
6
+ from sonolus.backend.flow import BasicBlock
7
+
8
+
9
+ class CompilerPass(ABC):
10
+ def requires(self) -> set[CompilerPass]:
11
+ return set()
12
+
13
+ def preserves(self) -> set[CompilerPass] | None:
14
+ return None
15
+
16
+ def destroys(self) -> set[CompilerPass] | None:
17
+ return None
18
+
19
+ def applies(self) -> set[CompilerPass]:
20
+ return {self}
21
+
22
+ def exists_after(self, passes: set[CompilerPass]) -> set[CompilerPass]:
23
+ preserved = self.preserves()
24
+ destroyed = self.destroys()
25
+ if destroyed is None and preserved is None:
26
+ return self.applies()
27
+ if preserved is not None:
28
+ passes = {p for p in passes if p in preserved}
29
+ if destroyed is not None:
30
+ passes = {p for p in passes if p not in destroyed}
31
+ return passes | self.applies()
32
+
33
+ @abstractmethod
34
+ def run(self, entry: BasicBlock) -> BasicBlock:
35
+ pass
36
+
37
+
38
+ def run_passes(entry: BasicBlock, passes: list[CompilerPass]) -> BasicBlock:
39
+ active_passes = set()
40
+ queue = deque(passes)
41
+ while queue:
42
+ if len(queue) > 99:
43
+ raise RuntimeError("Likely unsatisfiable pass requirements")
44
+ current_pass = queue.popleft()
45
+ missing_requirements = current_pass.requires() - active_passes
46
+ if missing_requirements:
47
+ queue.appendleft(current_pass)
48
+ queue.extendleft(missing_requirements)
49
+ continue
50
+ entry = current_pass.run(entry)
51
+ active_passes = current_pass.exists_after(active_passes)
52
+ return entry
@@ -1,30 +1,47 @@
1
- from sonolus.backend.flow import BasicBlock
2
- from sonolus.backend.passes import CompilerPass
3
-
4
-
5
- class CoalesceFlow(CompilerPass):
6
- def run(self, entry: BasicBlock) -> BasicBlock:
7
- queue = [entry]
8
- processed = set()
9
- while queue:
10
- block = queue.pop()
11
- if block in processed:
12
- continue
13
- processed.add(block)
14
- if len(block.outgoing) != 1:
15
- queue.extend(edge.dst for edge in block.outgoing)
16
- continue
17
- next_block = next(iter(block.outgoing)).dst
18
- if len(next_block.incoming) != 1:
19
- queue.append(next_block)
20
- continue
21
- block.statements.extend(next_block.statements)
22
- block.test = next_block.test
23
- for edge in next_block.outgoing:
24
- edge.src = block
25
- block.outgoing = next_block.outgoing
26
- processed.add(next_block)
27
- queue.extend(edge.dst for edge in block.outgoing)
28
- processed.remove(block)
29
- queue.append(block)
30
- return entry
1
+ from sonolus.backend.flow import BasicBlock
2
+ from sonolus.backend.ir import IRGet, IRSet
3
+ from sonolus.backend.passes import CompilerPass
4
+
5
+
6
+ class CoalesceFlow(CompilerPass):
7
+ def run(self, entry: BasicBlock) -> BasicBlock:
8
+ queue = [entry]
9
+ processed = set()
10
+ while queue:
11
+ block = queue.pop()
12
+ if block in processed:
13
+ continue
14
+ processed.add(block)
15
+ if len(block.outgoing) != 1:
16
+ queue.extend(edge.dst for edge in block.outgoing)
17
+ continue
18
+ next_block = next(iter(block.outgoing)).dst
19
+ if len(next_block.incoming) != 1:
20
+ queue.append(next_block)
21
+ if not block.statements and not block.phis and not next_block.phis:
22
+ for edge in block.incoming:
23
+ edge.dst = next_block
24
+ next_block.incoming.add(edge)
25
+ for edge in block.outgoing: # There should be exactly one
26
+ next_block.incoming.remove(edge)
27
+ if block is entry:
28
+ entry = next_block
29
+ continue
30
+ for p, args in next_block.phis.items():
31
+ if block not in args:
32
+ continue
33
+ block.statements.append(IRSet(p, IRGet(args[block])))
34
+ block.statements.extend(next_block.statements)
35
+ block.test = next_block.test
36
+ block.outgoing = next_block.outgoing
37
+ for edge in block.outgoing:
38
+ edge.src = block
39
+ dst = edge.dst
40
+ for args in dst.phis.values():
41
+ if next_block in args:
42
+ args[block] = args.pop(next_block)
43
+ processed.add(next_block)
44
+ queue.extend(edge.dst for edge in block.outgoing)
45
+ processed.remove(block)
46
+ queue.append(block)
47
+ return entry