@jhlagado/azm 0.2.0 → 0.2.2

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.
Files changed (334) hide show
  1. package/README.md +110 -78
  2. package/dist/src/api-compile.d.ts +0 -2
  3. package/dist/src/api-compile.js +2 -9
  4. package/dist/src/assembly/address-planning.js +21 -1
  5. package/dist/src/assembly/program-emission.js +1 -0
  6. package/dist/src/cli/parse-args.d.ts +0 -1
  7. package/dist/src/cli/parse-args.js +0 -7
  8. package/dist/src/cli/write-artifacts.js +0 -11
  9. package/dist/src/core/compile.js +192 -9
  10. package/dist/src/expansion/op-expansion.js +2 -0
  11. package/dist/src/model/expression.d.ts +4 -0
  12. package/dist/src/model/source-item.d.ts +11 -0
  13. package/dist/src/outputs/index.js +0 -2
  14. package/dist/src/outputs/types.d.ts +3 -16
  15. package/dist/src/outputs/write-asm80.js +206 -5
  16. package/dist/src/register-care/analyze.js +36 -8
  17. package/dist/src/register-care/annotations.js +33 -146
  18. package/dist/src/register-care/fix.d.ts +2 -0
  19. package/dist/src/register-care/fix.js +52 -0
  20. package/dist/src/register-care/instruction-shape.d.ts +11 -0
  21. package/dist/src/register-care/instruction-shape.js +129 -0
  22. package/dist/src/register-care/liveness.js +15 -7
  23. package/dist/src/register-care/profiles.js +4 -0
  24. package/dist/src/register-care/programModel.js +79 -13
  25. package/dist/src/register-care/report.d.ts +2 -1
  26. package/dist/src/register-care/report.js +91 -34
  27. package/dist/src/register-care/routine-summaries.d.ts +6 -0
  28. package/dist/src/register-care/routine-summaries.js +89 -0
  29. package/dist/src/register-care/summaries.d.ts +3 -3
  30. package/dist/src/register-care/summaries.js +42 -75
  31. package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.js +33 -51
  32. package/dist/src/register-care/types.d.ts +6 -1
  33. package/dist/src/semantics/expression-evaluation.d.ts +7 -3
  34. package/dist/src/semantics/expression-evaluation.js +57 -0
  35. package/dist/src/source/strip-line-comment.d.ts +2 -0
  36. package/dist/src/source/strip-line-comment.js +26 -0
  37. package/dist/src/syntax/directive-aliases.js +9 -10
  38. package/dist/src/syntax/parse-diagnostics.d.ts +12 -0
  39. package/dist/src/syntax/parse-diagnostics.js +18 -0
  40. package/dist/src/syntax/parse-expression.js +34 -9
  41. package/dist/src/syntax/parse-line.js +150 -54
  42. package/dist/src/tooling/case-style.js +3 -0
  43. package/docs/reference/cli.md +6 -4
  44. package/docs/reference/tooling-api.md +13 -9
  45. package/package.json +4 -6
  46. package/dist/legacy-root-azm/src/analysis.d.ts +0 -11
  47. package/dist/legacy-root-azm/src/analysis.js +0 -41
  48. package/dist/legacy-root-azm/src/compile.d.ts +0 -10
  49. package/dist/legacy-root-azm/src/compile.js +0 -186
  50. package/dist/legacy-root-azm/src/compileShared.d.ts +0 -3
  51. package/dist/legacy-root-azm/src/compileShared.js +0 -7
  52. package/dist/legacy-root-azm/src/diagnosticTypes.d.ts +0 -77
  53. package/dist/legacy-root-azm/src/diagnosticTypes.js +0 -53
  54. package/dist/legacy-root-azm/src/formats/index.d.ts +0 -7
  55. package/dist/legacy-root-azm/src/formats/index.js +0 -17
  56. package/dist/legacy-root-azm/src/formats/range.d.ts +0 -17
  57. package/dist/legacy-root-azm/src/formats/range.js +0 -45
  58. package/dist/legacy-root-azm/src/formats/types.d.ts +0 -283
  59. package/dist/legacy-root-azm/src/formats/types.js +0 -1
  60. package/dist/legacy-root-azm/src/formats/writeAsm80.d.ts +0 -6
  61. package/dist/legacy-root-azm/src/formats/writeAsm80.js +0 -86
  62. package/dist/legacy-root-azm/src/formats/writeBin.d.ts +0 -7
  63. package/dist/legacy-root-azm/src/formats/writeBin.js +0 -23
  64. package/dist/legacy-root-azm/src/formats/writeD8m.d.ts +0 -9
  65. package/dist/legacy-root-azm/src/formats/writeD8m.js +0 -245
  66. package/dist/legacy-root-azm/src/formats/writeHex.d.ts +0 -8
  67. package/dist/legacy-root-azm/src/formats/writeHex.js +0 -38
  68. package/dist/legacy-root-azm/src/formats/writeListing.d.ts +0 -8
  69. package/dist/legacy-root-azm/src/formats/writeListing.js +0 -83
  70. package/dist/legacy-root-azm/src/frontend/asm80/asmLine.d.ts +0 -39
  71. package/dist/legacy-root-azm/src/frontend/asm80/asmLine.js +0 -89
  72. package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.d.ts +0 -4
  73. package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.js +0 -94
  74. package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.d.ts +0 -10
  75. package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.js +0 -25
  76. package/dist/legacy-root-azm/src/frontend/ast.d.ts +0 -376
  77. package/dist/legacy-root-azm/src/frontend/ast.js +0 -1
  78. package/dist/legacy-root-azm/src/frontend/directiveAliases.d.ts +0 -14
  79. package/dist/legacy-root-azm/src/frontend/directiveAliases.js +0 -189
  80. package/dist/legacy-root-azm/src/frontend/grammarData.d.ts +0 -14
  81. package/dist/legacy-root-azm/src/frontend/grammarData.js +0 -65
  82. package/dist/legacy-root-azm/src/frontend/immExprUtils.d.ts +0 -2
  83. package/dist/legacy-root-azm/src/frontend/immExprUtils.js +0 -12
  84. package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.d.ts +0 -17
  85. package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.js +0 -187
  86. package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.d.ts +0 -3
  87. package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.js +0 -73
  88. package/dist/legacy-root-azm/src/frontend/parseAsmStatements.d.ts +0 -6
  89. package/dist/legacy-root-azm/src/frontend/parseAsmStatements.js +0 -16
  90. package/dist/legacy-root-azm/src/frontend/parseAsmStream.d.ts +0 -10
  91. package/dist/legacy-root-azm/src/frontend/parseAsmStream.js +0 -33
  92. package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.d.ts +0 -18
  93. package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.js +0 -34
  94. package/dist/legacy-root-azm/src/frontend/parseDiagnostics.d.ts +0 -9
  95. package/dist/legacy-root-azm/src/frontend/parseDiagnostics.js +0 -16
  96. package/dist/legacy-root-azm/src/frontend/parseEnum.d.ts +0 -12
  97. package/dist/legacy-root-azm/src/frontend/parseEnum.js +0 -70
  98. package/dist/legacy-root-azm/src/frontend/parseImm.d.ts +0 -10
  99. package/dist/legacy-root-azm/src/frontend/parseImm.js +0 -397
  100. package/dist/legacy-root-azm/src/frontend/parseLogicalLines.d.ts +0 -11
  101. package/dist/legacy-root-azm/src/frontend/parseLogicalLines.js +0 -94
  102. package/dist/legacy-root-azm/src/frontend/parseOp.d.ts +0 -25
  103. package/dist/legacy-root-azm/src/frontend/parseOp.js +0 -120
  104. package/dist/legacy-root-azm/src/frontend/parseOpHeader.d.ts +0 -20
  105. package/dist/legacy-root-azm/src/frontend/parseOpHeader.js +0 -32
  106. package/dist/legacy-root-azm/src/frontend/parseOperands.d.ts +0 -4
  107. package/dist/legacy-root-azm/src/frontend/parseOperands.js +0 -290
  108. package/dist/legacy-root-azm/src/frontend/parseParams.d.ts +0 -6
  109. package/dist/legacy-root-azm/src/frontend/parseParams.js +0 -62
  110. package/dist/legacy-root-azm/src/frontend/parseParserRecovery.d.ts +0 -12
  111. package/dist/legacy-root-azm/src/frontend/parseParserRecovery.js +0 -17
  112. package/dist/legacy-root-azm/src/frontend/parseParserShared.d.ts +0 -2
  113. package/dist/legacy-root-azm/src/frontend/parseParserShared.js +0 -8
  114. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.d.ts +0 -1
  115. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.js +0 -3
  116. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.d.ts +0 -7
  117. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.js +0 -142
  118. package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.d.ts +0 -34
  119. package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.js +0 -177
  120. package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.d.ts +0 -46
  121. package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.js +0 -53
  122. package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.d.ts +0 -16
  123. package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.js +0 -68
  124. package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.d.ts +0 -11
  125. package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.js +0 -50
  126. package/dist/legacy-root-azm/src/frontend/parseTypes.d.ts +0 -24
  127. package/dist/legacy-root-azm/src/frontend/parseTypes.js +0 -77
  128. package/dist/legacy-root-azm/src/frontend/parser.d.ts +0 -11
  129. package/dist/legacy-root-azm/src/frontend/parser.js +0 -88
  130. package/dist/legacy-root-azm/src/frontend/source.d.ts +0 -28
  131. package/dist/legacy-root-azm/src/frontend/source.js +0 -58
  132. package/dist/legacy-root-azm/src/frontend/sourceExtensions.d.ts +0 -2
  133. package/dist/legacy-root-azm/src/frontend/sourceExtensions.js +0 -6
  134. package/dist/legacy-root-azm/src/lintCaseStyle.d.ts +0 -4
  135. package/dist/legacy-root-azm/src/lintCaseStyle.js +0 -129
  136. package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.d.ts +0 -4
  137. package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.js +0 -229
  138. package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.d.ts +0 -47
  139. package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.js +0 -52
  140. package/dist/legacy-root-azm/src/lowering/asmEquResolution.d.ts +0 -8
  141. package/dist/legacy-root-azm/src/lowering/asmEquResolution.js +0 -69
  142. package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.d.ts +0 -15
  143. package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.js +0 -102
  144. package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.d.ts +0 -5
  145. package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.js +0 -54
  146. package/dist/legacy-root-azm/src/lowering/asmInstructionStream.d.ts +0 -46
  147. package/dist/legacy-root-azm/src/lowering/asmInstructionStream.js +0 -51
  148. package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.d.ts +0 -43
  149. package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.js +0 -254
  150. package/dist/legacy-root-azm/src/lowering/asmLoweringHost.d.ts +0 -23
  151. package/dist/legacy-root-azm/src/lowering/asmLoweringHost.js +0 -1
  152. package/dist/legacy-root-azm/src/lowering/asmLoweringLd.d.ts +0 -28
  153. package/dist/legacy-root-azm/src/lowering/asmLoweringLd.js +0 -144
  154. package/dist/legacy-root-azm/src/lowering/asmRangeLowering.d.ts +0 -17
  155. package/dist/legacy-root-azm/src/lowering/asmRangeLowering.js +0 -39
  156. package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.d.ts +0 -16
  157. package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.js +0 -209
  158. package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.d.ts +0 -4
  159. package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.js +0 -9
  160. package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.d.ts +0 -4
  161. package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.js +0 -14
  162. package/dist/legacy-root-azm/src/lowering/asmUtils.d.ts +0 -13
  163. package/dist/legacy-root-azm/src/lowering/asmUtils.js +0 -105
  164. package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.d.ts +0 -54
  165. package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.js +0 -128
  166. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.d.ts +0 -151
  167. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.js +0 -16
  168. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.d.ts +0 -7
  169. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.js +0 -75
  170. package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.d.ts +0 -66
  171. package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.js +0 -166
  172. package/dist/legacy-root-azm/src/lowering/bytePlacement.d.ts +0 -7
  173. package/dist/legacy-root-azm/src/lowering/bytePlacement.js +0 -37
  174. package/dist/legacy-root-azm/src/lowering/capabilities.d.ts +0 -67
  175. package/dist/legacy-root-azm/src/lowering/capabilities.js +0 -1
  176. package/dist/legacy-root-azm/src/lowering/eaResolution.d.ts +0 -58
  177. package/dist/legacy-root-azm/src/lowering/eaResolution.js +0 -159
  178. package/dist/legacy-root-azm/src/lowering/emissionCore.d.ts +0 -17
  179. package/dist/legacy-root-azm/src/lowering/emissionCore.js +0 -21
  180. package/dist/legacy-root-azm/src/lowering/emit.d.ts +0 -17
  181. package/dist/legacy-root-azm/src/lowering/emit.js +0 -46
  182. package/dist/legacy-root-azm/src/lowering/emitContextBuilder.d.ts +0 -63
  183. package/dist/legacy-root-azm/src/lowering/emitContextBuilder.js +0 -41
  184. package/dist/legacy-root-azm/src/lowering/emitFinalization.d.ts +0 -61
  185. package/dist/legacy-root-azm/src/lowering/emitFinalization.js +0 -66
  186. package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.d.ts +0 -19
  187. package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.js +0 -26
  188. package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -7
  189. package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.js +0 -119
  190. package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.d.ts +0 -4
  191. package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.js +0 -12
  192. package/dist/legacy-root-azm/src/lowering/emitPhase1Types.d.ts +0 -21
  193. package/dist/legacy-root-azm/src/lowering/emitPhase1Types.js +0 -1
  194. package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.d.ts +0 -70
  195. package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.js +0 -203
  196. package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.d.ts +0 -82
  197. package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.js +0 -55
  198. package/dist/legacy-root-azm/src/lowering/emitPipeline.d.ts +0 -121
  199. package/dist/legacy-root-azm/src/lowering/emitPipeline.js +0 -57
  200. package/dist/legacy-root-azm/src/lowering/emitProgramContext.d.ts +0 -39
  201. package/dist/legacy-root-azm/src/lowering/emitProgramContext.js +0 -29
  202. package/dist/legacy-root-azm/src/lowering/emitState.d.ts +0 -90
  203. package/dist/legacy-root-azm/src/lowering/emitState.js +0 -124
  204. package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.d.ts +0 -7
  205. package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.js +0 -23
  206. package/dist/legacy-root-azm/src/lowering/fixupEmission.d.ts +0 -64
  207. package/dist/legacy-root-azm/src/lowering/fixupEmission.js +0 -199
  208. package/dist/legacy-root-azm/src/lowering/immMath.d.ts +0 -2
  209. package/dist/legacy-root-azm/src/lowering/immMath.js +0 -34
  210. package/dist/legacy-root-azm/src/lowering/inputAssets.d.ts +0 -7
  211. package/dist/legacy-root-azm/src/lowering/inputAssets.js +0 -106
  212. package/dist/legacy-root-azm/src/lowering/ldEncoding.d.ts +0 -15
  213. package/dist/legacy-root-azm/src/lowering/ldEncoding.js +0 -12
  214. package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.d.ts +0 -5
  215. package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.js +0 -124
  216. package/dist/legacy-root-azm/src/lowering/ldFormSelection.d.ts +0 -26
  217. package/dist/legacy-root-azm/src/lowering/ldFormSelection.js +0 -92
  218. package/dist/legacy-root-azm/src/lowering/ldLowering.d.ts +0 -7
  219. package/dist/legacy-root-azm/src/lowering/ldLowering.js +0 -13
  220. package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.d.ts +0 -23
  221. package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.js +0 -185
  222. package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.d.ts +0 -13
  223. package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.js +0 -86
  224. package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.d.ts +0 -27
  225. package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.js +0 -215
  226. package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.d.ts +0 -202
  227. package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.js +0 -1
  228. package/dist/legacy-root-azm/src/lowering/loweredFormat.d.ts +0 -3
  229. package/dist/legacy-root-azm/src/lowering/loweredFormat.js +0 -26
  230. package/dist/legacy-root-azm/src/lowering/loweredItemSize.d.ts +0 -4
  231. package/dist/legacy-root-azm/src/lowering/loweredItemSize.js +0 -17
  232. package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.d.ts +0 -9
  233. package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.js +0 -55
  234. package/dist/legacy-root-azm/src/lowering/loweringTypes.d.ts +0 -27
  235. package/dist/legacy-root-azm/src/lowering/loweringTypes.js +0 -1
  236. package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.d.ts +0 -9
  237. package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.js +0 -9
  238. package/dist/legacy-root-azm/src/lowering/opExpansionExecution.d.ts +0 -15
  239. package/dist/legacy-root-azm/src/lowering/opExpansionExecution.js +0 -45
  240. package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.d.ts +0 -15
  241. package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.js +0 -88
  242. package/dist/legacy-root-azm/src/lowering/opExpansionStream.d.ts +0 -12
  243. package/dist/legacy-root-azm/src/lowering/opExpansionStream.js +0 -176
  244. package/dist/legacy-root-azm/src/lowering/opMatching.d.ts +0 -52
  245. package/dist/legacy-root-azm/src/lowering/opMatching.js +0 -355
  246. package/dist/legacy-root-azm/src/lowering/opSubstitution.d.ts +0 -13
  247. package/dist/legacy-root-azm/src/lowering/opSubstitution.js +0 -175
  248. package/dist/legacy-root-azm/src/lowering/prescanTypes.d.ts +0 -7
  249. package/dist/legacy-root-azm/src/lowering/prescanTypes.js +0 -1
  250. package/dist/legacy-root-azm/src/lowering/programLowering.d.ts +0 -144
  251. package/dist/legacy-root-azm/src/lowering/programLowering.js +0 -2
  252. package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.d.ts +0 -5
  253. package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.js +0 -5
  254. package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.d.ts +0 -18
  255. package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.js +0 -115
  256. package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.d.ts +0 -2
  257. package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.js +0 -93
  258. package/dist/legacy-root-azm/src/lowering/programPrescan.d.ts +0 -3
  259. package/dist/legacy-root-azm/src/lowering/programPrescan.js +0 -37
  260. package/dist/legacy-root-azm/src/lowering/traceFormat.d.ts +0 -13
  261. package/dist/legacy-root-azm/src/lowering/traceFormat.js +0 -211
  262. package/dist/legacy-root-azm/src/packageInfo.d.ts +0 -1
  263. package/dist/legacy-root-azm/src/packageInfo.js +0 -15
  264. package/dist/legacy-root-azm/src/pathCompare.d.ts +0 -3
  265. package/dist/legacy-root-azm/src/pathCompare.js +0 -26
  266. package/dist/legacy-root-azm/src/pipeline.d.ts +0 -91
  267. package/dist/legacy-root-azm/src/pipeline.js +0 -1
  268. package/dist/legacy-root-azm/src/registerCare/analyze.d.ts +0 -24
  269. package/dist/legacy-root-azm/src/registerCare/analyze.js +0 -327
  270. package/dist/legacy-root-azm/src/registerCare/boundaryHints.d.ts +0 -2
  271. package/dist/legacy-root-azm/src/registerCare/boundaryHints.js +0 -10
  272. package/dist/legacy-root-azm/src/registerCare/carriers.d.ts +0 -4
  273. package/dist/legacy-root-azm/src/registerCare/carriers.js +0 -78
  274. package/dist/legacy-root-azm/src/registerCare/controlFlow.d.ts +0 -5
  275. package/dist/legacy-root-azm/src/registerCare/controlFlow.js +0 -35
  276. package/dist/legacy-root-azm/src/registerCare/fix.d.ts +0 -11
  277. package/dist/legacy-root-azm/src/registerCare/fix.js +0 -119
  278. package/dist/legacy-root-azm/src/registerCare/liveness.d.ts +0 -7
  279. package/dist/legacy-root-azm/src/registerCare/liveness.js +0 -227
  280. package/dist/legacy-root-azm/src/registerCare/profiles.d.ts +0 -11
  281. package/dist/legacy-root-azm/src/registerCare/profiles.js +0 -45
  282. package/dist/legacy-root-azm/src/registerCare/programModel.d.ts +0 -3
  283. package/dist/legacy-root-azm/src/registerCare/programModel.js +0 -181
  284. package/dist/legacy-root-azm/src/registerCare/report.d.ts +0 -5
  285. package/dist/legacy-root-azm/src/registerCare/report.js +0 -139
  286. package/dist/legacy-root-azm/src/registerCare/smartComments.d.ts +0 -5
  287. package/dist/legacy-root-azm/src/registerCare/smartComments.js +0 -247
  288. package/dist/legacy-root-azm/src/registerCare/types.d.ts +0 -154
  289. package/dist/legacy-root-azm/src/registerCare/types.js +0 -1
  290. package/dist/legacy-root-azm/src/semantics/declVisitor.d.ts +0 -5
  291. package/dist/legacy-root-azm/src/semantics/declVisitor.js +0 -11
  292. package/dist/legacy-root-azm/src/semantics/env.d.ts +0 -28
  293. package/dist/legacy-root-azm/src/semantics/env.js +0 -432
  294. package/dist/legacy-root-azm/src/semantics/layout.d.ts +0 -21
  295. package/dist/legacy-root-azm/src/semantics/layout.js +0 -226
  296. package/dist/legacy-root-azm/src/semantics/layoutCastFold.d.ts +0 -22
  297. package/dist/legacy-root-azm/src/semantics/layoutCastFold.js +0 -118
  298. package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.d.ts +0 -2
  299. package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.js +0 -4
  300. package/dist/legacy-root-azm/src/semantics/typeQueries.d.ts +0 -31
  301. package/dist/legacy-root-azm/src/semantics/typeQueries.js +0 -124
  302. package/dist/legacy-root-azm/src/sourceIncludeExpansion.d.ts +0 -17
  303. package/dist/legacy-root-azm/src/sourceIncludeExpansion.js +0 -124
  304. package/dist/legacy-root-azm/src/sourceIncludePaths.d.ts +0 -1
  305. package/dist/legacy-root-azm/src/sourceIncludePaths.js +0 -12
  306. package/dist/legacy-root-azm/src/sourceLoader.d.ts +0 -15
  307. package/dist/legacy-root-azm/src/sourceLoader.js +0 -118
  308. package/dist/legacy-root-azm/src/z80/effects.d.ts +0 -3
  309. package/dist/legacy-root-azm/src/z80/effects.js +0 -516
  310. package/dist/legacy-root-azm/src/z80/encode.d.ts +0 -10
  311. package/dist/legacy-root-azm/src/z80/encode.js +0 -412
  312. package/dist/legacy-root-azm/src/z80/encodeAlu.d.ts +0 -7
  313. package/dist/legacy-root-azm/src/z80/encodeAlu.js +0 -219
  314. package/dist/legacy-root-azm/src/z80/encodeBitOps.d.ts +0 -7
  315. package/dist/legacy-root-azm/src/z80/encodeBitOps.js +0 -123
  316. package/dist/legacy-root-azm/src/z80/encodeContext.d.ts +0 -29
  317. package/dist/legacy-root-azm/src/z80/encodeContext.js +0 -1
  318. package/dist/legacy-root-azm/src/z80/encodeControl.d.ts +0 -26
  319. package/dist/legacy-root-azm/src/z80/encodeControl.js +0 -180
  320. package/dist/legacy-root-azm/src/z80/encodeCoreOps.d.ts +0 -7
  321. package/dist/legacy-root-azm/src/z80/encodeCoreOps.js +0 -131
  322. package/dist/legacy-root-azm/src/z80/encodeIo.d.ts +0 -9
  323. package/dist/legacy-root-azm/src/z80/encodeIo.js +0 -128
  324. package/dist/legacy-root-azm/src/z80/encodeLd.d.ts +0 -13
  325. package/dist/legacy-root-azm/src/z80/encodeLd.js +0 -273
  326. package/dist/legacy-root-azm/src/z80/encoderRegistry.d.ts +0 -13
  327. package/dist/legacy-root-azm/src/z80/encoderRegistry.js +0 -169
  328. package/dist/src/outputs/write-listing.d.ts +0 -2
  329. package/dist/src/outputs/write-listing.js +0 -79
  330. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.d.ts +0 -0
  331. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.js +0 -0
  332. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.d.ts +0 -0
  333. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.js +0 -0
  334. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.d.ts +0 -0
@@ -1,227 +0,0 @@
1
- import { DiagnosticIds } from '../diagnosticTypes.js';
2
- import { getZ80InstructionEffect } from '../z80/effects.js';
3
- import { precedingCServiceName } from './boundaryHints.js';
4
- import { instructionSuccessors, labelIndex } from './controlFlow.js';
5
- import { rstServiceTargetName, rstTargetName } from './profiles.js';
6
- function unique(units) {
7
- return [...new Set(units)];
8
- }
9
- function withImpliedFlagUnits(units) {
10
- return unique(units);
11
- }
12
- function boundaryTarget(routine, index, effect) {
13
- const item = routine.instructions[index];
14
- if (effect.control.kind === 'call' && effect.control.target) {
15
- return {
16
- targets: [effect.control.target],
17
- conditional: effect.control.conditional,
18
- subject: `CALL ${effect.control.target}`,
19
- };
20
- }
21
- if (effect.control.kind === 'jump' &&
22
- item?.head.toLowerCase() === 'jp' &&
23
- !effect.control.conditional &&
24
- effect.control.target &&
25
- !effect.control.target.startsWith('.')) {
26
- return {
27
- targets: [effect.control.target],
28
- conditional: false,
29
- subject: `JP ${effect.control.target}`,
30
- };
31
- }
32
- if (effect.control.kind === 'rst' && effect.control.vector !== undefined) {
33
- const target = rstTargetName(effect.control.vector);
34
- const service = precedingCServiceName(routine.instructions[index - 1]);
35
- const targets = service
36
- ? [rstServiceTargetName(effect.control.vector, service), target]
37
- : [target];
38
- return { targets, conditional: false, subject: target };
39
- }
40
- return undefined;
41
- }
42
- function summaryForBoundary(boundary, summaries) {
43
- for (const target of boundary.targets) {
44
- const summary = summaries.get(target);
45
- if (summary)
46
- return { target, summary };
47
- }
48
- return undefined;
49
- }
50
- function hintUnitsForLine(hints, file, callLine) {
51
- const prior = hints.find((hint) => hint.file === file && hint.line === callLine - 1 && hint.comment.kind === 'expectOut');
52
- return prior?.comment.kind === 'expectOut' ? withImpliedFlagUnits(prior.comment.carriers) : [];
53
- }
54
- function outputUnits(summary) {
55
- return withImpliedFlagUnits(summary.valueRelations.flatMap((relation) => relation.out));
56
- }
57
- function setEqual(left, right) {
58
- if (left.size !== right.size)
59
- return false;
60
- for (const item of left)
61
- if (!right.has(item))
62
- return false;
63
- return true;
64
- }
65
- function unionLive(sets) {
66
- const out = new Set();
67
- for (const set of sets) {
68
- for (const unit of set)
69
- out.add(unit);
70
- }
71
- return out;
72
- }
73
- function transferLiveBefore(item, effect, boundary, summary, liveAfter, hints) {
74
- const live = new Set(liveAfter);
75
- if (boundary && summary) {
76
- const accepted = new Set();
77
- for (const unit of hintUnitsForLine(hints, item.file, item.line))
78
- accepted.add(unit);
79
- for (const unit of outputUnits(summary))
80
- accepted.add(unit);
81
- if (!boundary.conditional) {
82
- for (const unit of summary.mayWrite)
83
- live.delete(unit);
84
- for (const unit of accepted)
85
- live.delete(unit);
86
- }
87
- for (const unit of summary.mayRead)
88
- live.add(unit);
89
- }
90
- const instructionWritesAreConditional = effect.control.kind === 'call' && effect.control.conditional;
91
- if (!instructionWritesAreConditional) {
92
- for (const unit of effect.writes)
93
- live.delete(unit);
94
- }
95
- for (const unit of effect.reads)
96
- live.add(unit);
97
- return live;
98
- }
99
- function liveSetsForRoutine(routine, summaries, hints = []) {
100
- const labels = labelIndex(routine);
101
- const effects = routine.instructions.map((item) => getZ80InstructionEffect(item.instruction));
102
- const boundaries = effects.map((effect, index) => boundaryTarget(routine, index, effect));
103
- const resolvedSummaries = boundaries.map((boundary) => boundary ? summaryForBoundary(boundary, summaries)?.summary : undefined);
104
- const successorIndexes = effects.map((effect, index) => instructionSuccessors(routine, index, effect, labels, { boundaryFallthrough: true }));
105
- const liveIn = routine.instructions.map(() => new Set());
106
- const liveOut = routine.instructions.map(() => new Set());
107
- let changed = true;
108
- let passes = 0;
109
- while (changed && passes < Math.max(8, routine.instructions.length * 4)) {
110
- changed = false;
111
- passes += 1;
112
- for (let index = routine.instructions.length - 1; index >= 0; index -= 1) {
113
- const nextOut = unionLive(successorIndexes[index].map((successor) => liveIn[successor]));
114
- const nextIn = transferLiveBefore(routine.instructions[index], effects[index], boundaries[index], resolvedSummaries[index], nextOut, hints);
115
- if (!setEqual(nextOut, liveOut[index])) {
116
- liveOut[index] = nextOut;
117
- changed = true;
118
- }
119
- if (!setEqual(nextIn, liveIn[index])) {
120
- liveIn[index] = nextIn;
121
- changed = true;
122
- }
123
- }
124
- }
125
- return { liveIn, liveOut };
126
- }
127
- function resolvedBoundariesForRoutine(routine, summaries) {
128
- const out = [];
129
- for (let index = 0; index < routine.instructions.length; index += 1) {
130
- const item = routine.instructions[index];
131
- const effect = getZ80InstructionEffect(item.instruction);
132
- const boundary = boundaryTarget(routine, index, effect);
133
- if (!boundary)
134
- continue;
135
- const resolved = summaryForBoundary(boundary, summaries);
136
- if (!resolved)
137
- continue;
138
- out.push({ item, index, boundary, target: resolved.target, summary: resolved.summary });
139
- }
140
- return out;
141
- }
142
- export function findRegisterCareConflicts(routine, summaries, hints) {
143
- const conflicts = [];
144
- const { liveOut } = liveSetsForRoutine(routine, summaries, hints);
145
- for (const { item, index, boundary, target, summary } of resolvedBoundariesForRoutine(routine, summaries)) {
146
- const accepted = new Set();
147
- for (const unit of hintUnitsForLine(hints, item.file, item.line))
148
- accepted.add(unit);
149
- for (const unit of outputUnits(summary))
150
- accepted.add(unit);
151
- const carriers = unique(summary.mayWrite.filter((unit) => liveOut[index].has(unit) && !accepted.has(unit)));
152
- if (carriers.length > 0) {
153
- conflicts.push({
154
- file: item.file,
155
- line: item.line,
156
- column: item.column,
157
- callTarget: target,
158
- carriers,
159
- message: `${boundary.subject} may modify ${carriers.join(',')}, but the pre-call value is used later.`,
160
- });
161
- }
162
- }
163
- return conflicts;
164
- }
165
- function appendMapUnits(out, target, units) {
166
- const existing = out.get(target) ?? [];
167
- for (const unit of units) {
168
- if (!existing.includes(unit))
169
- existing.push(unit);
170
- }
171
- out.set(target, existing);
172
- }
173
- function candidateMessage(boundary, units) {
174
- const carriers = units.join(',');
175
- const expectation = units.length === 1 ? units[0] : `{${carriers}}`;
176
- return `${boundary.subject} writes ${carriers} and caller reads it later; review the call site and add \`; expects out ${expectation}\` above the call if this is intentional.`;
177
- }
178
- export function findCallerOutputCandidateObservations(routines, summaries) {
179
- const out = [];
180
- for (const routine of routines) {
181
- const { liveOut } = liveSetsForRoutine(routine, summaries);
182
- for (const { item, index, boundary, target, summary } of resolvedBoundariesForRoutine(routine, summaries)) {
183
- const alreadyOutput = new Set(outputUnits(summary));
184
- const carriers = unique(summary.mayWrite.filter((unit) => liveOut[index].has(unit) && !alreadyOutput.has(unit)));
185
- if (carriers.length > 0) {
186
- out.push({
187
- file: item.file,
188
- line: item.line,
189
- column: item.column,
190
- routine: target,
191
- carriers,
192
- message: candidateMessage(boundary, carriers),
193
- });
194
- }
195
- }
196
- }
197
- return out;
198
- }
199
- export function findCallerOutputCandidates(routines, summaries) {
200
- const candidates = new Map();
201
- for (const item of findCallerOutputCandidateObservations(routines, summaries)) {
202
- appendMapUnits(candidates, item.routine, item.carriers);
203
- }
204
- return candidates;
205
- }
206
- export function findAcceptedOutputCandidatesFromHints(routines, summaries, hints) {
207
- const accepted = new Map();
208
- for (const routine of routines) {
209
- for (const { item, target } of resolvedBoundariesForRoutine(routine, summaries)) {
210
- const units = hintUnitsForLine(hints, item.file, item.line);
211
- if (units.length === 0)
212
- continue;
213
- appendMapUnits(accepted, target, units);
214
- }
215
- }
216
- return accepted;
217
- }
218
- export function diagnosticsForRegisterCareConflicts(conflicts, severity) {
219
- return conflicts.map((conflict) => ({
220
- id: DiagnosticIds.RegisterCareConflict,
221
- severity,
222
- message: conflict.message,
223
- file: conflict.file,
224
- line: conflict.line,
225
- column: conflict.column,
226
- }));
227
- }
@@ -1,11 +0,0 @@
1
- import type { RoutineSummary } from './types.js';
2
- export type RegisterCareProfileName = 'mon3';
3
- interface RegisterCareProfile {
4
- name: RegisterCareProfileName;
5
- rst: Map<number, RoutineSummary>;
6
- rstServices: Map<string, RoutineSummary>;
7
- }
8
- export declare function rstTargetName(vector: number): string;
9
- export declare function rstServiceTargetName(vector: number, service: string): string;
10
- export declare function getRegisterCareProfile(name: RegisterCareProfileName | undefined): RegisterCareProfile | undefined;
11
- export {};
@@ -1,45 +0,0 @@
1
- const FLAG_UNITS = ['carry', 'zero', 'sign', 'parity', 'halfCarry'];
2
- export function rstTargetName(vector) {
3
- return `RST_$${vector.toString(16).toUpperCase().padStart(2, '0')}`;
4
- }
5
- function normalizeServiceName(service) {
6
- return service.replace(/[^A-Za-z0-9]/gu, '').toUpperCase();
7
- }
8
- export function rstServiceTargetName(vector, service) {
9
- return `${rstTargetName(vector)}:${normalizeServiceName(service)}`;
10
- }
11
- export function getRegisterCareProfile(name) {
12
- if (name !== 'mon3')
13
- return undefined;
14
- return {
15
- name: 'mon3',
16
- rst: new Map([
17
- [
18
- 0x10,
19
- {
20
- name: rstTargetName(0x10),
21
- mayRead: [],
22
- mayWrite: ['A', ...FLAG_UNITS],
23
- preserved: ['B', 'C', 'D', 'E', 'H', 'L'],
24
- valueRelations: [],
25
- stackBalanced: true,
26
- hasUnknownStackEffect: false,
27
- },
28
- ],
29
- ]),
30
- rstServices: new Map([
31
- [
32
- rstServiceTargetName(0x10, 'API_SCANKEYS'),
33
- {
34
- name: rstServiceTargetName(0x10, 'API_SCANKEYS'),
35
- mayRead: ['C'],
36
- mayWrite: ['sign', 'parity', 'halfCarry'],
37
- preserved: ['B', 'C', 'D', 'E', 'H', 'L'],
38
- valueRelations: [{ out: ['A', 'carry', 'zero'], from: [] }],
39
- stackBalanced: true,
40
- hasUnknownStackEffect: false,
41
- },
42
- ],
43
- ]),
44
- };
45
- }
@@ -1,3 +0,0 @@
1
- import type { ProgramNode } from '../frontend/ast.js';
2
- import type { RegisterCareProgramModel } from './types.js';
3
- export declare function buildRegisterCareProgramModel(program: ProgramNode): RegisterCareProgramModel;
@@ -1,181 +0,0 @@
1
- import { createInlineOpInstructionStreamExpander } from '../lowering/opExpansionStream.js';
2
- function flattenItems(items, out, expandInstruction) {
3
- for (const item of items) {
4
- if (item.kind === 'AsmLabel') {
5
- out.push({ kind: 'label', label: item });
6
- continue;
7
- }
8
- if (item.kind === 'AsmInstruction') {
9
- out.push(...expandInstruction(item));
10
- }
11
- }
12
- }
13
- function directCallTarget(inst) {
14
- if (inst.head.toLowerCase() !== 'call')
15
- return undefined;
16
- if (inst.operands.length !== 1 && inst.operands.length !== 2)
17
- return undefined;
18
- const op = inst.operands[inst.operands.length - 1];
19
- if (op?.kind !== 'Imm' || op.expr.kind !== 'ImmName')
20
- return undefined;
21
- return op.expr.name;
22
- }
23
- function directTailJumpTarget(inst, entryNames) {
24
- if (inst.head.toLowerCase() !== 'jp')
25
- return undefined;
26
- if (inst.operands.length !== 1 && inst.operands.length !== 2)
27
- return undefined;
28
- if (inst.operands.length === 2 && entryNames === undefined)
29
- return undefined;
30
- const op = inst.operands[inst.operands.length - 1];
31
- if (op?.kind !== 'Imm' || op.expr.kind !== 'ImmName')
32
- return undefined;
33
- if (op.expr.name.startsWith('.'))
34
- return undefined;
35
- if (entryNames !== undefined && !entryNames.has(op.expr.name))
36
- return undefined;
37
- return op.expr.name;
38
- }
39
- function toInstruction(inst, labels = []) {
40
- return {
41
- instruction: inst,
42
- head: inst.head.toLowerCase(),
43
- file: inst.span.file,
44
- line: inst.span.start.line,
45
- column: inst.span.start.column,
46
- labels,
47
- };
48
- }
49
- function spanFrom(start, end) {
50
- if (start.file !== end.file)
51
- return start;
52
- return {
53
- file: start.file,
54
- start: start.start,
55
- end: end.end,
56
- };
57
- }
58
- function isLocalLabel(name) {
59
- return name.startsWith('.');
60
- }
61
- function isEntryLabel(label) {
62
- return label.isEntry === true;
63
- }
64
- function flatItemFile(item) {
65
- return item.kind === 'label' ? item.label.span.file : item.instruction.span.file;
66
- }
67
- function isTerminalReturn(inst) {
68
- const head = inst.head.toLowerCase();
69
- if (head === 'ret')
70
- return inst.operands.length === 0;
71
- return head === 'retn' || head === 'reti';
72
- }
73
- export function buildRegisterCareProgramModel(program) {
74
- const flat = [];
75
- const { expandInstruction } = createInlineOpInstructionStreamExpander(program);
76
- for (const file of program.files) {
77
- flattenItems(file.items, flat, expandInstruction);
78
- }
79
- const labelItems = flat.filter((item) => item.kind === 'label');
80
- const filesWithEntryLabels = new Set(labelItems.filter((item) => isEntryLabel(item.label)).map((item) => item.label.span.file));
81
- const entryLabelNames = new Set(labelItems
82
- .filter((item) => isEntryLabel(item.label) ||
83
- (!filesWithEntryLabels.has(item.label.span.file) && !isLocalLabel(item.label.name)))
84
- .map((item) => item.label.name));
85
- const directCalls = flat.flatMap((item) => {
86
- if (item.kind !== 'instruction')
87
- return [];
88
- const target = directCallTarget(item.instruction);
89
- if (target === undefined)
90
- return [];
91
- return [
92
- {
93
- target,
94
- subject: `CALL ${target}`,
95
- file: item.instruction.span.file,
96
- line: item.instruction.span.start.line,
97
- column: item.instruction.span.start.column,
98
- },
99
- ];
100
- });
101
- const directTailJumps = flat.flatMap((item) => {
102
- if (item.kind !== 'instruction')
103
- return [];
104
- const sourceFileUsesEntryLabels = filesWithEntryLabels.has(item.instruction.span.file);
105
- const target = directTailJumpTarget(item.instruction, sourceFileUsesEntryLabels ? entryLabelNames : undefined);
106
- if (target === undefined)
107
- return [];
108
- return [
109
- {
110
- target,
111
- subject: `JP ${target}`,
112
- file: item.instruction.span.file,
113
- line: item.instruction.span.start.line,
114
- column: item.instruction.span.start.column,
115
- },
116
- ];
117
- });
118
- const directBoundaries = [...directCalls, ...directTailJumps];
119
- const directCallTargets = Array.from(new Set(directCalls.map((call) => call.target))).sort();
120
- const routines = [];
121
- const coalescedGlobalLabelIndexes = new Set();
122
- for (let index = 0; index < flat.length; index += 1) {
123
- const item = flat[index];
124
- if (coalescedGlobalLabelIndexes.has(index))
125
- continue;
126
- if (item?.kind !== 'label' || isLocalLabel(item.label.name))
127
- continue;
128
- const routineFile = item.label.span.file;
129
- const fileUsesEntryLabels = filesWithEntryLabels.has(routineFile);
130
- if (fileUsesEntryLabels && !isEntryLabel(item.label))
131
- continue;
132
- const labels = [item.label.name];
133
- const entryLabels = isEntryLabel(item.label) ? [item.label.name] : undefined;
134
- const instructions = [];
135
- let pendingInstructionLabels = [item.label.name];
136
- let endSpan = item.label.span;
137
- for (let rangeIndex = index + 1; rangeIndex < flat.length; rangeIndex += 1) {
138
- const rangeItem = flat[rangeIndex];
139
- if (!rangeItem)
140
- break;
141
- if (flatItemFile(rangeItem) !== routineFile)
142
- break;
143
- if (rangeItem.kind === 'label') {
144
- if (fileUsesEntryLabels && isEntryLabel(rangeItem.label)) {
145
- if (instructions.length > 0)
146
- break;
147
- labels.push(rangeItem.label.name);
148
- entryLabels?.push(rangeItem.label.name);
149
- coalescedGlobalLabelIndexes.add(rangeIndex);
150
- endSpan = rangeItem.label.span;
151
- continue;
152
- }
153
- if (!fileUsesEntryLabels && !isLocalLabel(rangeItem.label.name)) {
154
- if (instructions.length > 0)
155
- break;
156
- labels.push(rangeItem.label.name);
157
- coalescedGlobalLabelIndexes.add(rangeIndex);
158
- endSpan = rangeItem.label.span;
159
- continue;
160
- }
161
- labels.push(rangeItem.label.name);
162
- pendingInstructionLabels.push(rangeItem.label.name);
163
- endSpan = rangeItem.label.span;
164
- continue;
165
- }
166
- instructions.push(toInstruction(rangeItem.instruction, pendingInstructionLabels));
167
- pendingInstructionLabels = [];
168
- endSpan = rangeItem.instruction.span;
169
- if (isTerminalReturn(rangeItem.instruction))
170
- break;
171
- }
172
- routines.push({
173
- name: item.label.name,
174
- span: spanFrom(item.label.span, endSpan),
175
- labels,
176
- ...(entryLabels ? { entryLabels } : {}),
177
- instructions,
178
- });
179
- }
180
- return { routines, directCallTargets, directCalls, directBoundaries };
181
- }
@@ -1,5 +0,0 @@
1
- import type { RegisterCareReportModel, RegisterCareUnit, RoutineSummary } from './types.js';
2
- export declare function contractCarrierList(units: RegisterCareUnit[]): string;
3
- export declare function renderRegisterCareReport(model: RegisterCareReportModel): string;
4
- export declare function renderRegisterCareInterface(summaries: RoutineSummary[]): string;
5
- export declare function renderRegisterCareSourceBlock(summary: RoutineSummary): string[];
@@ -1,139 +0,0 @@
1
- function list(units) {
2
- return units.length === 0 ? '-' : units.join(',');
3
- }
4
- const FLAG_UNITS = new Set(['carry', 'zero', 'sign', 'parity', 'halfCarry']);
5
- const CONTRACT_CARRIER_PAIRS = [
6
- { label: 'BC', hi: 'B', lo: 'C' },
7
- { label: 'DE', hi: 'D', lo: 'E' },
8
- { label: 'HL', hi: 'H', lo: 'L' },
9
- { label: 'IX', hi: 'IXH', lo: 'IXL' },
10
- { label: 'IY', hi: 'IYH', lo: 'IYL' },
11
- { label: 'SP', hi: 'SPH', lo: 'SPL' },
12
- ];
13
- export function contractCarrierList(units) {
14
- const unique = [...new Set(units)];
15
- const unitSet = new Set(unique);
16
- const emitted = new Set();
17
- const parts = [];
18
- for (const unit of unique) {
19
- if (emitted.has(unit))
20
- continue;
21
- const pair = CONTRACT_CARRIER_PAIRS.find((candidate) => (candidate.hi === unit || candidate.lo === unit) &&
22
- unitSet.has(candidate.hi) &&
23
- unitSet.has(candidate.lo));
24
- if (pair) {
25
- parts.push(pair.label);
26
- emitted.add(pair.hi);
27
- emitted.add(pair.lo);
28
- continue;
29
- }
30
- parts.push(unit);
31
- emitted.add(unit);
32
- }
33
- return parts.length === 0 ? '-' : parts.join(',');
34
- }
35
- function relationOutputUnits(relations) {
36
- return relations.flatMap((rel) => rel.out);
37
- }
38
- function contractEntries(summary) {
39
- const out = [];
40
- if (summary.mayRead.length > 0)
41
- out.push({ keyword: 'in', carriers: contractCarrierList(summary.mayRead) });
42
- const outputUnits = relationOutputUnits(summary.valueRelations);
43
- if (outputUnits.length > 0)
44
- out.push({ keyword: 'out', carriers: contractCarrierList(outputUnits) });
45
- const relationOut = relationOutUnits(summary);
46
- const clobbers = summary.mayWrite.filter((unit) => !relationOut.has(unit));
47
- if (clobbers.length > 0)
48
- out.push({ keyword: 'clobbers', carriers: contractCarrierList(clobbers) });
49
- return out;
50
- }
51
- function sourceContractEntries(summary) {
52
- const out = [];
53
- if (summary.mayRead.length > 0)
54
- out.push({ keyword: 'in', carriers: contractCarrierList(summary.mayRead) });
55
- const relationOut = relationOutUnits(summary);
56
- const candidates = (summary.outputCandidates ?? []).filter((unit) => !relationOut.has(unit));
57
- if (candidates.length > 0)
58
- out.push({ keyword: 'maybe-out', carriers: contractCarrierList(candidates) });
59
- const outputUnits = relationOutputUnits(summary.valueRelations);
60
- if (outputUnits.length > 0)
61
- out.push({ keyword: 'out', carriers: contractCarrierList(outputUnits) });
62
- const clobbers = summary.mayWrite.filter((unit) => !relationOut.has(unit) && !FLAG_UNITS.has(unit));
63
- if (clobbers.length > 0)
64
- out.push({ keyword: 'clobbers', carriers: contractCarrierList(clobbers) });
65
- return out;
66
- }
67
- function stackStatus(summary) {
68
- const balance = summary.stackBalanced ? 'balanced' : 'unbalanced';
69
- return summary.hasUnknownStackEffect ? `${balance}, unknown effect` : balance;
70
- }
71
- function relationOutUnits(summary) {
72
- return new Set(summary.valueRelations.flatMap((rel) => rel.out));
73
- }
74
- export function renderRegisterCareReport(model) {
75
- const lines = ['AZM Register-Care Report', `Entry: ${model.entryFile}`, `Mode: ${model.mode}`];
76
- if (model.profile)
77
- lines.push(`Profile: ${model.profile}`);
78
- lines.push('');
79
- if (model.summaries.length === 0) {
80
- lines.push('Routines: none', '');
81
- }
82
- else {
83
- for (const summary of model.summaries) {
84
- lines.push(`Routine: ${summary.name}`);
85
- lines.push(` reads: ${list(summary.mayRead)}`);
86
- lines.push(` writes: ${list(summary.mayWrite)}`);
87
- lines.push(` preserves: ${list(summary.preserved)}`);
88
- lines.push(` stack: ${stackStatus(summary)}`);
89
- for (const rel of summary.valueRelations) {
90
- lines.push(` relation: ${list(rel.out)} <= ${list(rel.from)}`);
91
- }
92
- lines.push('');
93
- }
94
- }
95
- lines.push('Conflicts:');
96
- if (model.conflicts.length === 0) {
97
- lines.push(' none');
98
- }
99
- else {
100
- for (const conflict of model.conflicts) {
101
- lines.push(` ${conflict.file}:${conflict.line}:${conflict.column}: ${conflict.callTarget}: ${list(conflict.carriers)}: ${conflict.message}`);
102
- }
103
- }
104
- lines.push('');
105
- lines.push('Output candidates:');
106
- if (!model.outputCandidates || model.outputCandidates.length === 0) {
107
- lines.push(' none');
108
- }
109
- else {
110
- for (const candidate of model.outputCandidates) {
111
- lines.push(` ${candidate.file}:${candidate.line}:${candidate.column}: ${candidate.routine}: ${list(candidate.carriers)}: ${candidate.message}`);
112
- }
113
- }
114
- lines.push('');
115
- lines.push('Unknown calls:');
116
- if (model.unknownCalls.length === 0) {
117
- lines.push(' none');
118
- }
119
- else {
120
- for (const call of model.unknownCalls)
121
- lines.push(` ${call}`);
122
- }
123
- lines.push('');
124
- return `${lines.join('\n')}\n`;
125
- }
126
- export function renderRegisterCareInterface(summaries) {
127
- const lines = [];
128
- for (const summary of summaries) {
129
- lines.push(`extern ${summary.name}`);
130
- for (const entry of contractEntries(summary)) {
131
- lines.push(`${entry.keyword} ${entry.carriers}`);
132
- }
133
- lines.push('end', '');
134
- }
135
- return `${lines.join('\n')}\n`;
136
- }
137
- export function renderRegisterCareSourceBlock(summary) {
138
- return sourceContractEntries(summary).map((entry) => `;! ${entry.keyword.padEnd(10)}${entry.carriers}`);
139
- }
@@ -1,5 +0,0 @@
1
- import type { LocatedSmartComment, RegisterCareRoutine, RoutineContract, SmartComment } from './types.js';
2
- export declare function parseSmartCommentLine(line: string): SmartComment | undefined;
3
- export declare function parseSmartComments(sourceLineComments: Map<string, Map<number, string>>): LocatedSmartComment[];
4
- export declare function buildRoutineContracts(comments: LocatedSmartComment[], routines?: RegisterCareRoutine[], sourceTexts?: Map<string, string>): Map<string, RoutineContract>;
5
- export declare function parseInterfaceContracts(text: string, file?: string): Map<string, RoutineContract>;