@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,327 +0,0 @@
1
- import { DiagnosticIds } from '../diagnosticTypes.js';
2
- import { annotateRegisterCareContracts } from './annotate.js';
3
- import { expandCarrierList } from './carriers.js';
4
- import { diagnosticsForRegisterCareConflicts, findAcceptedOutputCandidatesFromHints, findCallerOutputCandidates, findCallerOutputCandidateObservations, findRegisterCareConflicts, } from './liveness.js';
5
- import { applyExpectOutFixesToSource, findExpectOutFixes } from './fix.js';
6
- import { getRegisterCareProfile } from './profiles.js';
7
- import { buildRegisterCareProgramModel } from './programModel.js';
8
- import { renderRegisterCareInterface, renderRegisterCareReport } from './report.js';
9
- import { buildRoutineContracts, parseSmartComments } from './smartComments.js';
10
- import { applyRoutineContract, inferRoutineSummary } from './summary.js';
11
- function emptyRoutineSummary(name) {
12
- return {
13
- name,
14
- mayRead: [],
15
- mayWrite: [],
16
- preserved: [],
17
- valueRelations: [],
18
- stackBalanced: true,
19
- hasUnknownStackEffect: false,
20
- };
21
- }
22
- function unknownBoundaryForCall(call) {
23
- return {
24
- ...call,
25
- message: `Register-care cannot prove ${call.subject}; add a routine body or .asmi extern contract.`,
26
- };
27
- }
28
- function uniqueSortedTargets(boundaries) {
29
- return Array.from(new Set(boundaries.map((boundary) => boundary.target))).sort();
30
- }
31
- function diagnosticsForUnknownBoundaries(boundaries) {
32
- return boundaries.map((boundary) => ({
33
- id: DiagnosticIds.RegisterCareUnknownBoundary,
34
- severity: 'warning',
35
- message: boundary.message,
36
- file: boundary.file,
37
- line: boundary.line,
38
- column: boundary.column,
39
- }));
40
- }
41
- function isLocalLabel(name) {
42
- return name.startsWith('.');
43
- }
44
- function nonLocalLabels(labels) {
45
- return labels.filter((label) => !isLocalLabel(label));
46
- }
47
- function boundaryLabels(routine) {
48
- return routine.entryLabels ?? nonLocalLabels(routine.labels);
49
- }
50
- function contractForRoutine(routine, contracts) {
51
- return boundaryLabels(routine)
52
- .map((label) => contracts.get(label))
53
- .find((contract) => contract !== undefined);
54
- }
55
- function summariesWithExternalContracts(summaries, contracts, routineNames) {
56
- const out = [...summaries];
57
- for (const contract of contracts.values()) {
58
- if (!routineNames.has(contract.name)) {
59
- out.push(applyRoutineContract(emptyRoutineSummary(contract.name), contract));
60
- }
61
- }
62
- return out;
63
- }
64
- function externalContractsOnly(contracts, routineNames) {
65
- return new Map([...contracts].filter(([name]) => !routineNames.has(name)));
66
- }
67
- function buildBoundarySummaryMap(summaries, routineSummaries, profileSummaries) {
68
- const boundarySummaryMap = new Map(profileSummaries.map((summary) => [summary.name, summary]));
69
- for (const summary of summaries) {
70
- boundarySummaryMap.set(summary.name, summary);
71
- }
72
- for (const { routine, summary } of routineSummaries) {
73
- for (const label of boundaryLabels(routine)) {
74
- boundarySummaryMap.set(label, summary);
75
- }
76
- }
77
- return boundarySummaryMap;
78
- }
79
- function summarizeRoutines(routines, contracts, boundarySummaryMap = new Map()) {
80
- return routines.map((routine) => {
81
- const inferred = inferRoutineSummary(routine, boundarySummaryMap);
82
- const contract = contractForRoutine(routine, contracts);
83
- return { routine, summary: contract ? applyRoutineContract(inferred, contract) : inferred };
84
- });
85
- }
86
- function sortedUnique(values) {
87
- return Array.from(new Set(values)).sort();
88
- }
89
- function appendUniqueUnits(target, units) {
90
- for (const unit of units) {
91
- if (!target.includes(unit))
92
- target.push(unit);
93
- }
94
- }
95
- function summaryFingerprint(summary) {
96
- const relations = summary.valueRelations
97
- .map((relation) => `${relation.out.join(',')}<-${relation.from.join(',')}`)
98
- .sort();
99
- return JSON.stringify({
100
- name: summary.name,
101
- mayRead: sortedUnique(summary.mayRead),
102
- mayWrite: sortedUnique(summary.mayWrite),
103
- preserved: sortedUnique(summary.preserved),
104
- relations,
105
- stackBalanced: summary.stackBalanced,
106
- hasUnknownStackEffect: summary.hasUnknownStackEffect,
107
- });
108
- }
109
- function routineSummariesFingerprint(routineSummaries) {
110
- return routineSummaries.map((item) => summaryFingerprint(item.summary)).join('\n');
111
- }
112
- function inferRoutineSummariesToFixedPoint(routines, contracts, routineNames, profileSummaries) {
113
- let routineSummaries = summarizeRoutines(routines, contracts);
114
- const maxPasses = Math.max(2, routines.length + 2);
115
- for (let pass = 0; pass < maxPasses; pass += 1) {
116
- const summaries = summariesWithExternalContracts(routineSummaries.map((item) => item.summary), contracts, routineNames);
117
- const boundarySummaryMap = buildBoundarySummaryMap(summaries, routineSummaries, profileSummaries);
118
- const nextRoutineSummaries = summarizeRoutines(routines, contracts, boundarySummaryMap);
119
- if (routineSummariesFingerprint(nextRoutineSummaries) ===
120
- routineSummariesFingerprint(routineSummaries)) {
121
- return nextRoutineSummaries;
122
- }
123
- routineSummaries = nextRoutineSummaries;
124
- }
125
- return routineSummaries;
126
- }
127
- function withCallerOutputCandidates(routineSummaries, boundarySummaryMap, acceptOutputCandidates = new Map()) {
128
- const candidates = findCallerOutputCandidates(routineSummaries.map((item) => item.routine), new Map(boundarySummaryMap));
129
- return routineSummaries.map((item) => {
130
- const outputCandidates = candidates.get(item.summary.name);
131
- const written = new Set(item.summary.mayWrite);
132
- const accepted = (acceptOutputCandidates.get(item.summary.name) ?? []).filter((unit) => written.has(unit));
133
- const acceptedSet = new Set(accepted);
134
- const valueRelations = [...item.summary.valueRelations];
135
- for (const unit of accepted) {
136
- if (!valueRelations.some((relation) => relation.out.includes(unit))) {
137
- valueRelations.push({ out: [unit], from: [] });
138
- }
139
- }
140
- const remainingCandidates = outputCandidates?.filter((unit) => !acceptedSet.has(unit));
141
- return outputCandidates && outputCandidates.length > 0
142
- ? {
143
- ...item,
144
- summary: {
145
- ...item.summary,
146
- valueRelations,
147
- ...(remainingCandidates && remainingCandidates.length > 0
148
- ? { outputCandidates: remainingCandidates }
149
- : {}),
150
- },
151
- }
152
- : item;
153
- });
154
- }
155
- function autoAcceptedOutputCandidates(fixes) {
156
- const out = new Map();
157
- for (const fix of fixes) {
158
- const existing = out.get(fix.routine) ?? [];
159
- appendUniqueUnits(existing, fix.carriers);
160
- out.set(fix.routine, existing);
161
- }
162
- return out;
163
- }
164
- function parseAcceptedOutputCandidates(items = []) {
165
- const out = new Map();
166
- for (const item of items) {
167
- const sep = item.indexOf(':');
168
- if (sep <= 0 || sep === item.length - 1) {
169
- throw new Error(`Invalid --accept-out value "${item}" (expected ROUTINE:carriers)`);
170
- }
171
- const name = item.slice(0, sep).trim();
172
- if (!name)
173
- throw new Error(`Invalid --accept-out value "${item}" (missing routine name)`);
174
- const carrierParts = item.slice(sep + 1).split(',');
175
- const rawCarriers = carrierParts.map((part) => part.trim());
176
- if (rawCarriers.length === 0 || rawCarriers.some((part) => part.length === 0)) {
177
- throw new Error(`Invalid --accept-out value "${item}" (missing carriers)`);
178
- }
179
- const carriers = expandCarrierList(rawCarriers);
180
- if (!carriers) {
181
- throw new Error(`Invalid --accept-out value "${item}" (unknown carrier)`);
182
- }
183
- const existing = out.get(name) ?? [];
184
- appendUniqueUnits(existing, carriers);
185
- out.set(name, existing);
186
- }
187
- return out;
188
- }
189
- function mergeAcceptedOutputCandidates(...maps) {
190
- const out = new Map();
191
- for (const map of maps) {
192
- for (const [name, units] of map) {
193
- const existing = out.get(name) ?? [];
194
- appendUniqueUnits(existing, units);
195
- out.set(name, existing);
196
- }
197
- }
198
- return out;
199
- }
200
- function fixedSourceTexts(referenceSourceTexts, workingSourceTexts, fixes) {
201
- const byFile = new Map();
202
- for (const fix of fixes) {
203
- const items = byFile.get(fix.file) ?? [];
204
- items.push(fix);
205
- byFile.set(fix.file, items);
206
- }
207
- const out = new Map(workingSourceTexts);
208
- for (const [file, items] of byFile) {
209
- const source = workingSourceTexts.get(file);
210
- const referenceSource = referenceSourceTexts.get(file);
211
- if (source === undefined)
212
- continue;
213
- out.set(file, applyExpectOutFixesToSource(source, items, referenceSource));
214
- }
215
- return out;
216
- }
217
- function annotateAndFixRegisterCareContracts(sourceTexts, routines, fixes) {
218
- const annotated = annotateRegisterCareContracts(sourceTexts, routines);
219
- if (fixes.length === 0)
220
- return annotated;
221
- const workingTexts = new Map(sourceTexts);
222
- for (const file of annotated) {
223
- workingTexts.set(file.path, file.text);
224
- }
225
- const fixedTexts = fixedSourceTexts(sourceTexts, workingTexts, fixes);
226
- const out = [];
227
- for (const [path, text] of fixedTexts) {
228
- if (text !== sourceTexts.get(path))
229
- out.push({ path, text });
230
- }
231
- return out.sort((a, b) => a.path.localeCompare(b.path));
232
- }
233
- function candidateKey(item) {
234
- return `${item.file}:${item.line}:${item.column}:${item.routine}`;
235
- }
236
- function candidateExpectation(units) {
237
- const carriers = units.join(',');
238
- return units.length === 1 ? units[0] : `{${carriers}}`;
239
- }
240
- function candidateMessageWithFixability(candidate, autoFixable) {
241
- const carriers = candidate.carriers.join(',');
242
- const expectation = candidateExpectation(candidate.carriers);
243
- const base = `CALL ${candidate.routine} writes ${carriers} and caller reads it later`;
244
- return autoFixable
245
- ? `${base}; generated contracts promote this to \`out ${expectation}\` automatically.`
246
- : `${base}; manual review required before adding \`; expects out ${expectation}\` because the later read is not a simple direct continuation.`;
247
- }
248
- function withCandidateFixability(candidates, fixes) {
249
- const fixable = new Map(fixes.map((fix) => [candidateKey(fix), new Set(fix.carriers)]));
250
- return candidates.map((candidate) => {
251
- const fixableCarriers = fixable.get(candidateKey(candidate));
252
- const autoFixable = fixableCarriers !== undefined &&
253
- candidate.carriers.every((carrier) => fixableCarriers.has(carrier));
254
- return {
255
- ...candidate,
256
- autoFixable,
257
- message: candidateMessageWithFixability(candidate, autoFixable),
258
- };
259
- });
260
- }
261
- function inferenceOnlyOutputFixes(programRoutines, routineSummaries, profileSummaries) {
262
- const summaries = routineSummaries.map((item) => item.summary);
263
- const boundarySummaryMap = buildBoundarySummaryMap(summaries, routineSummaries, profileSummaries);
264
- const candidates = findCallerOutputCandidateObservations(programRoutines, boundarySummaryMap);
265
- return findExpectOutFixes(programRoutines, candidates);
266
- }
267
- export function analyzeRegisterCare(loaded, options) {
268
- const profile = getRegisterCareProfile(options.profile);
269
- const programModel = buildRegisterCareProgramModel(loaded.program);
270
- const smartComments = parseSmartComments(loaded.sourceLineComments);
271
- const contracts = buildRoutineContracts(smartComments, programModel.routines, loaded.sourceTexts);
272
- const cliAcceptedOutputCandidates = parseAcceptedOutputCandidates(options.acceptOutputCandidates);
273
- for (const contract of options.interfaceContracts ?? []) {
274
- contracts.set(contract.name, contract);
275
- }
276
- const routineNames = new Set(programModel.routines.flatMap((routine) => boundaryLabels(routine)));
277
- const profileSummaries = profile
278
- ? [...Array.from(profile.rst.values()), ...Array.from(profile.rstServices.values())]
279
- : [];
280
- const routineSummaries = inferRoutineSummariesToFixedPoint(programModel.routines, contracts, routineNames, profileSummaries);
281
- const summaries = routineSummaries.map((item) => item.summary);
282
- summaries.push(...summariesWithExternalContracts([], contracts, routineNames));
283
- const boundarySummaryMap = buildBoundarySummaryMap(summaries, routineSummaries, profileSummaries);
284
- const unknownBoundaries = programModel.directBoundaries
285
- .filter((boundary) => !boundarySummaryMap.has(boundary.target))
286
- .map(unknownBoundaryForCall);
287
- const conflicts = programModel.routines.flatMap((routine) => findRegisterCareConflicts(routine, boundarySummaryMap, smartComments));
288
- const rawOutputCandidates = findCallerOutputCandidateObservations(programModel.routines, boundarySummaryMap);
289
- const possibleExpectOutFixes = findExpectOutFixes(programModel.routines, rawOutputCandidates);
290
- const outputCandidates = withCandidateFixability(rawOutputCandidates, possibleExpectOutFixes);
291
- const conflictDiagnostics = options.mode === 'warn' || options.mode === 'strict'
292
- ? diagnosticsForRegisterCareConflicts(conflicts, 'warning')
293
- : options.mode === 'error'
294
- ? diagnosticsForRegisterCareConflicts(conflicts, 'error')
295
- : [];
296
- const diagnostics = options.mode === 'strict'
297
- ? [...conflictDiagnostics, ...diagnosticsForUnknownBoundaries(unknownBoundaries)]
298
- : conflictDiagnostics;
299
- const reportModel = {
300
- entryFile: loaded.program.entryFile,
301
- mode: options.mode,
302
- ...(profile ? { profile: profile.name } : {}),
303
- summaries,
304
- conflicts,
305
- outputCandidates,
306
- unknownCalls: uniqueSortedTargets(unknownBoundaries),
307
- };
308
- return {
309
- diagnostics,
310
- outputCandidates,
311
- ...(options.emitReport ? { reportText: renderRegisterCareReport(reportModel) } : {}),
312
- ...(options.emitInterface ? { interfaceText: renderRegisterCareInterface(summaries) } : {}),
313
- ...(options.emitAnnotations
314
- ? (() => {
315
- const annotationRoutineSummaries = inferRoutineSummariesToFixedPoint(programModel.routines, externalContractsOnly(contracts, routineNames), routineNames, profileSummaries);
316
- const annotationSummaries = annotationRoutineSummaries.map((item) => item.summary);
317
- const annotationBoundarySummaryMap = buildBoundarySummaryMap(annotationSummaries, annotationRoutineSummaries, profileSummaries);
318
- const expectOutFixes = options.fixRegisterContracts === true
319
- ? inferenceOnlyOutputFixes(programModel.routines, annotationRoutineSummaries, profileSummaries)
320
- : [];
321
- return {
322
- annotatedFiles: annotateAndFixRegisterCareContracts(loaded.sourceTexts, withCallerOutputCandidates(annotationRoutineSummaries, annotationBoundarySummaryMap, mergeAcceptedOutputCandidates(cliAcceptedOutputCandidates, findAcceptedOutputCandidatesFromHints(programModel.routines, annotationBoundarySummaryMap, smartComments), autoAcceptedOutputCandidates(expectOutFixes))), []),
323
- };
324
- })()
325
- : {}),
326
- };
327
- }
@@ -1,2 +0,0 @@
1
- import type { RegisterCareInstruction } from './types.js';
2
- export declare function precedingCServiceName(item: RegisterCareInstruction | undefined): string | undefined;
@@ -1,10 +0,0 @@
1
- export function precedingCServiceName(item) {
2
- const inst = item?.instruction;
3
- if (!inst || inst.head.toLowerCase() !== 'ld' || inst.operands.length !== 2)
4
- return undefined;
5
- const dst = inst.operands[0];
6
- const src = inst.operands[1];
7
- if (dst?.kind !== 'Reg' || dst.name.toUpperCase() !== 'C')
8
- return undefined;
9
- return src?.kind === 'Imm' && src.expr.kind === 'ImmName' ? src.expr.name : undefined;
10
- }
@@ -1,4 +0,0 @@
1
- import type { RegisterCareUnit } from './types.js';
2
- export declare function normalizeCarrierName(raw: string): RegisterCareUnit | undefined;
3
- export declare function expandCarrier(raw: string): RegisterCareUnit[] | undefined;
4
- export declare function expandCarrierList(raw: string[]): RegisterCareUnit[] | undefined;
@@ -1,78 +0,0 @@
1
- const FLAG_UNITS = ['carry', 'zero', 'sign', 'parity', 'halfCarry'];
2
- const SINGLE_UNITS = new Set([
3
- 'A',
4
- 'B',
5
- 'C',
6
- 'D',
7
- 'E',
8
- 'H',
9
- 'L',
10
- 'IXH',
11
- 'IXL',
12
- 'IYH',
13
- 'IYL',
14
- 'SPH',
15
- 'SPL',
16
- 'carry',
17
- 'zero',
18
- 'sign',
19
- 'parity',
20
- 'halfCarry',
21
- ]);
22
- const PAIRS = {
23
- AF: ['A', ...FLAG_UNITS],
24
- BC: ['B', 'C'],
25
- DE: ['D', 'E'],
26
- HL: ['H', 'L'],
27
- IX: ['IXH', 'IXL'],
28
- IY: ['IYH', 'IYL'],
29
- SP: ['SPH', 'SPL'],
30
- };
31
- const FLAG_ALIASES = {
32
- CARRY: 'carry',
33
- ZERO: 'zero',
34
- Z: 'zero',
35
- SIGN: 'sign',
36
- S: 'sign',
37
- PARITY: 'parity',
38
- PV: 'parity',
39
- 'P/V': 'parity',
40
- HALFCARRY: 'halfCarry',
41
- HFLAG: 'halfCarry',
42
- };
43
- export function normalizeCarrierName(raw) {
44
- const trimmed = raw.trim();
45
- const upper = trimmed.toUpperCase();
46
- const flag = FLAG_ALIASES[upper];
47
- if (flag)
48
- return flag;
49
- if (SINGLE_UNITS.has(upper))
50
- return upper;
51
- return undefined;
52
- }
53
- export function expandCarrier(raw) {
54
- const upper = raw.trim().toUpperCase();
55
- if (upper === 'F')
56
- return FLAG_UNITS;
57
- const pair = PAIRS[upper];
58
- if (pair)
59
- return pair;
60
- const single = normalizeCarrierName(raw);
61
- return single ? [single] : undefined;
62
- }
63
- export function expandCarrierList(raw) {
64
- const out = [];
65
- const seen = new Set();
66
- for (const item of raw) {
67
- const expanded = expandCarrier(item);
68
- if (!expanded)
69
- return undefined;
70
- for (const unit of expanded) {
71
- if (seen.has(unit))
72
- continue;
73
- seen.add(unit);
74
- out.push(unit);
75
- }
76
- }
77
- return out;
78
- }
@@ -1,5 +0,0 @@
1
- import type { InstructionEffect, RegisterCareRoutine } from './types.js';
2
- export declare function labelIndex(routine: RegisterCareRoutine): Map<string, number>;
3
- export declare function instructionSuccessors(routine: RegisterCareRoutine, index: number, effect: InstructionEffect, labels: ReadonlyMap<string, number>, options?: {
4
- boundaryFallthrough?: boolean;
5
- }): number[];
@@ -1,35 +0,0 @@
1
- function unique(items) {
2
- return [...new Set(items)];
3
- }
4
- export function labelIndex(routine) {
5
- const out = new Map();
6
- routine.instructions.forEach((item, index) => {
7
- for (const label of item.labels)
8
- out.set(label, index);
9
- });
10
- return out;
11
- }
12
- function localTargetIndex(labels, target) {
13
- if (!target)
14
- return undefined;
15
- return labels.get(target);
16
- }
17
- export function instructionSuccessors(routine, index, effect, labels, options = {}) {
18
- const next = index + 1 < routine.instructions.length ? index + 1 : undefined;
19
- if (effect.control.kind === 'fallthrough' ||
20
- (options.boundaryFallthrough &&
21
- (effect.control.kind === 'call' || effect.control.kind === 'rst'))) {
22
- return next === undefined ? [] : [next];
23
- }
24
- if (effect.control.kind === 'jump') {
25
- const target = localTargetIndex(labels, effect.control.target);
26
- if (effect.control.conditional) {
27
- return unique([
28
- ...(target === undefined ? [] : [target]),
29
- ...(next === undefined ? [] : [next]),
30
- ]);
31
- }
32
- return target === undefined ? [] : [target];
33
- }
34
- return [];
35
- }
@@ -1,11 +0,0 @@
1
- import type { RegisterCareOutputCandidate, RegisterCareRoutine, RegisterCareUnit } from './types.js';
2
- interface RegisterCareExpectOutFix {
3
- file: string;
4
- line: number;
5
- column: number;
6
- routine: string;
7
- carriers: RegisterCareUnit[];
8
- }
9
- export declare function findExpectOutFixes(routines: RegisterCareRoutine[], candidates: RegisterCareOutputCandidate[]): RegisterCareExpectOutFix[];
10
- export declare function applyExpectOutFixesToSource(source: string, fixes: RegisterCareExpectOutFix[], referenceSource?: string): string;
11
- export {};
@@ -1,119 +0,0 @@
1
- import { getZ80InstructionEffect } from '../z80/effects.js';
2
- import { instructionSuccessors, labelIndex } from './controlFlow.js';
3
- import { contractCarrierList } from './report.js';
4
- import { joinSourceLines, splitSourceLines } from './sourceText.js';
5
- function sameLocation(a, b) {
6
- return a.file === b.file && a.line === b.line && a.column === b.column;
7
- }
8
- function isUnconditionalDirectCall(item) {
9
- const effect = getZ80InstructionEffect(item.instruction);
10
- return (effect.control.kind === 'call' &&
11
- effect.control.target !== undefined &&
12
- !effect.control.conditional);
13
- }
14
- function continuationReads(routine, callIndex, carriers) {
15
- const labels = labelIndex(routine);
16
- const confirmed = new Set();
17
- const work = callIndex + 1 < routine.instructions.length
18
- ? [{ index: callIndex + 1, pending: [...new Set(carriers)] }]
19
- : [];
20
- const seen = new Set();
21
- let steps = 0;
22
- while (work.length > 0 && steps < 512) {
23
- steps += 1;
24
- const state = work.pop();
25
- const pending = state.pending.filter((unit) => !confirmed.has(unit));
26
- if (pending.length === 0)
27
- continue;
28
- const key = `${state.index}:${pending.join(',')}`;
29
- if (seen.has(key))
30
- continue;
31
- seen.add(key);
32
- const item = routine.instructions[state.index];
33
- if (!item)
34
- continue;
35
- const effect = getZ80InstructionEffect(item.instruction);
36
- const reads = new Set(effect.reads);
37
- const writes = new Set(effect.writes);
38
- const remaining = [];
39
- for (const unit of pending) {
40
- if (reads.has(unit)) {
41
- confirmed.add(unit);
42
- continue;
43
- }
44
- if (!writes.has(unit))
45
- remaining.push(unit);
46
- }
47
- if (remaining.length === 0)
48
- continue;
49
- for (const next of instructionSuccessors(routine, state.index, effect, labels)) {
50
- work.push({ index: next, pending: remaining });
51
- }
52
- }
53
- return carriers.filter((unit) => confirmed.has(unit));
54
- }
55
- export function findExpectOutFixes(routines, candidates) {
56
- const out = [];
57
- for (const routine of routines) {
58
- for (let index = 0; index < routine.instructions.length; index += 1) {
59
- const item = routine.instructions[index];
60
- if (!isUnconditionalDirectCall(item))
61
- continue;
62
- const candidate = candidates.find((entry) => sameLocation(item, entry));
63
- if (!candidate)
64
- continue;
65
- const carriers = continuationReads(routine, index, candidate.carriers);
66
- if (carriers.length === 0)
67
- continue;
68
- out.push({ ...candidate, carriers });
69
- }
70
- }
71
- return out;
72
- }
73
- function isExpectOutLine(line) {
74
- return /^\s*;\s*expects\s+out\b/i.test(line);
75
- }
76
- function expectedCallLine(originalLines, fix) {
77
- return originalLines[fix.line - 1]?.trim();
78
- }
79
- function findCallLineIndex(lines, originalLines, fix) {
80
- const expected = expectedCallLine(originalLines, fix);
81
- if (!expected)
82
- return undefined;
83
- const preferred = fix.line - 1;
84
- if (lines[preferred]?.trim() === expected)
85
- return preferred;
86
- let best;
87
- let bestDistance = Number.POSITIVE_INFINITY;
88
- for (let index = 0; index < lines.length; index += 1) {
89
- if (lines[index]?.trim() !== expected)
90
- continue;
91
- const distance = Math.abs(index - preferred);
92
- if (distance < bestDistance) {
93
- best = index;
94
- bestDistance = distance;
95
- }
96
- }
97
- return best;
98
- }
99
- function indentation(line) {
100
- return line.match(/^\s*/)?.[0] ?? '';
101
- }
102
- export function applyExpectOutFixesToSource(source, fixes, referenceSource = source) {
103
- if (fixes.length === 0)
104
- return source;
105
- const originalLines = referenceSource.split(/\r?\n/);
106
- const sourceLines = splitSourceLines(source);
107
- const { lines } = sourceLines;
108
- const sorted = [...fixes].sort((a, b) => b.line - a.line || b.column - a.column);
109
- for (const fix of sorted) {
110
- const index = findCallLineIndex(lines, originalLines, fix);
111
- if (index === undefined)
112
- continue;
113
- if (index > 0 && isExpectOutLine(lines[index - 1] ?? ''))
114
- continue;
115
- const prefix = indentation(lines[index] ?? '');
116
- lines.splice(index, 0, `${prefix}; expects out ${contractCarrierList(fix.carriers)}`);
117
- }
118
- return joinSourceLines(sourceLines);
119
- }
@@ -1,7 +0,0 @@
1
- import { type Diagnostic } from '../diagnosticTypes.js';
2
- import type { LocatedSmartComment, RegisterCareConflict, RegisterCareOutputCandidate, RegisterCareRoutine, RegisterCareUnit, RoutineSummary } from './types.js';
3
- export declare function findRegisterCareConflicts(routine: RegisterCareRoutine, summaries: Map<string, RoutineSummary>, hints: LocatedSmartComment[]): RegisterCareConflict[];
4
- export declare function findCallerOutputCandidateObservations(routines: RegisterCareRoutine[], summaries: Map<string, RoutineSummary>): RegisterCareOutputCandidate[];
5
- export declare function findCallerOutputCandidates(routines: RegisterCareRoutine[], summaries: Map<string, RoutineSummary>): Map<string, RegisterCareUnit[]>;
6
- export declare function findAcceptedOutputCandidatesFromHints(routines: RegisterCareRoutine[], summaries: Map<string, RoutineSummary>, hints: LocatedSmartComment[]): Map<string, RegisterCareUnit[]>;
7
- export declare function diagnosticsForRegisterCareConflicts(conflicts: RegisterCareConflict[], severity: 'warning' | 'error'): Diagnostic[];