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.

Files changed (90) hide show
  1. sonolus/backend/blocks.py +756 -756
  2. sonolus/backend/excepthook.py +37 -37
  3. sonolus/backend/finalize.py +77 -69
  4. sonolus/backend/interpret.py +7 -7
  5. sonolus/backend/ir.py +29 -3
  6. sonolus/backend/mode.py +24 -24
  7. sonolus/backend/node.py +40 -40
  8. sonolus/backend/ops.py +197 -197
  9. sonolus/backend/optimize/__init__.py +0 -0
  10. sonolus/backend/optimize/allocate.py +126 -0
  11. sonolus/backend/optimize/constant_evaluation.py +374 -0
  12. sonolus/backend/optimize/copy_coalesce.py +85 -0
  13. sonolus/backend/optimize/dead_code.py +185 -0
  14. sonolus/backend/optimize/dominance.py +96 -0
  15. sonolus/backend/{flow.py → optimize/flow.py} +122 -92
  16. sonolus/backend/optimize/inlining.py +137 -0
  17. sonolus/backend/optimize/liveness.py +177 -0
  18. sonolus/backend/optimize/optimize.py +44 -0
  19. sonolus/backend/optimize/passes.py +52 -0
  20. sonolus/backend/optimize/simplify.py +191 -0
  21. sonolus/backend/optimize/ssa.py +200 -0
  22. sonolus/backend/place.py +17 -25
  23. sonolus/backend/utils.py +58 -48
  24. sonolus/backend/visitor.py +1151 -882
  25. sonolus/build/cli.py +7 -1
  26. sonolus/build/compile.py +88 -90
  27. sonolus/build/engine.py +10 -5
  28. sonolus/build/level.py +24 -23
  29. sonolus/build/node.py +43 -43
  30. sonolus/script/archetype.py +438 -139
  31. sonolus/script/array.py +27 -10
  32. sonolus/script/array_like.py +297 -0
  33. sonolus/script/bucket.py +253 -191
  34. sonolus/script/containers.py +257 -51
  35. sonolus/script/debug.py +26 -10
  36. sonolus/script/easing.py +365 -0
  37. sonolus/script/effect.py +191 -131
  38. sonolus/script/engine.py +71 -4
  39. sonolus/script/globals.py +303 -269
  40. sonolus/script/instruction.py +205 -151
  41. sonolus/script/internal/__init__.py +5 -5
  42. sonolus/script/internal/builtin_impls.py +255 -144
  43. sonolus/script/{callbacks.py → internal/callbacks.py} +127 -127
  44. sonolus/script/internal/constant.py +139 -0
  45. sonolus/script/internal/context.py +26 -9
  46. sonolus/script/internal/descriptor.py +17 -17
  47. sonolus/script/internal/dict_impl.py +65 -0
  48. sonolus/script/internal/generic.py +6 -9
  49. sonolus/script/internal/impl.py +38 -13
  50. sonolus/script/internal/introspection.py +17 -14
  51. sonolus/script/internal/math_impls.py +121 -0
  52. sonolus/script/internal/native.py +40 -38
  53. sonolus/script/internal/random.py +67 -0
  54. sonolus/script/internal/range.py +81 -0
  55. sonolus/script/internal/transient.py +51 -0
  56. sonolus/script/internal/tuple_impl.py +113 -0
  57. sonolus/script/internal/value.py +3 -3
  58. sonolus/script/interval.py +338 -112
  59. sonolus/script/iterator.py +167 -214
  60. sonolus/script/level.py +24 -0
  61. sonolus/script/num.py +80 -48
  62. sonolus/script/options.py +257 -191
  63. sonolus/script/particle.py +190 -157
  64. sonolus/script/pointer.py +30 -30
  65. sonolus/script/print.py +102 -81
  66. sonolus/script/project.py +8 -0
  67. sonolus/script/quad.py +263 -0
  68. sonolus/script/record.py +47 -16
  69. sonolus/script/runtime.py +52 -1
  70. sonolus/script/sprite.py +418 -333
  71. sonolus/script/text.py +409 -407
  72. sonolus/script/timing.py +114 -42
  73. sonolus/script/transform.py +332 -48
  74. sonolus/script/ui.py +216 -160
  75. sonolus/script/values.py +6 -13
  76. sonolus/script/vec.py +196 -78
  77. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.5.dist-info}/METADATA +1 -1
  78. sonolus_py-0.1.5.dist-info/RECORD +89 -0
  79. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.5.dist-info}/WHEEL +1 -1
  80. {sonolus_py-0.1.3.dist-info → sonolus_py-0.1.5.dist-info}/licenses/LICENSE +21 -21
  81. sonolus/backend/allocate.py +0 -51
  82. sonolus/backend/optimize.py +0 -9
  83. sonolus/backend/passes.py +0 -6
  84. sonolus/backend/simplify.py +0 -30
  85. sonolus/script/comptime.py +0 -160
  86. sonolus/script/graphics.py +0 -150
  87. sonolus/script/math.py +0 -92
  88. sonolus/script/range.py +0 -58
  89. sonolus_py-0.1.3.dist-info/RECORD +0 -75
  90. {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