@tsplc/compiler 0.2.10 → 0.2.11
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.
- package/backends/codesys/emit.ts +24 -41
- package/backends/codesys/global-names.ts +49 -0
- package/backends/codesys/plan.ts +4 -89
- package/backends/codesys/task-access.ts +125 -0
- package/dist/cli.js +14 -3
- package/dist/cli.js.map +3 -3
- package/dist/codesys.js +360 -307
- package/dist/codesys.js.map +9 -8
- package/dist/index.js +23 -7
- package/dist/index.js.map +4 -4
- package/dist/ir.js +52 -2
- package/dist/ir.js.map +4 -4
- package/ir/declarations.ts +12 -5
- package/ir/model.ts +40 -1
- package/package.json +6 -6
- package/project/plant.ts +15 -2
- package/src/frontend/async.ts +9 -4
- package/src/frontend/typescript.ts +21 -7
- package/types/globals.d.ts +6 -0
- package/types/index.d.ts +37 -1
package/dist/codesys.js.map
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../backends/codesys/config.ts", "../backends/codesys/engineering.ts", "../backends/codesys/names.ts", "../backends/codesys/emit.ts", "../backends/codesys/
|
|
3
|
+
"sources": ["../backends/codesys/config.ts", "../backends/codesys/engineering.ts", "../backends/codesys/names.ts", "../backends/codesys/emit.ts", "../backends/codesys/global-names.ts", "../backends/codesys/storage.ts", "../backends/codesys/types.ts", "../backends/codesys/numeric.ts", "../backends/codesys/plan.ts", "../backends/codesys/io-paths.ts", "../backends/codesys/http.ts", "../backends/codesys/task-access.ts", "../backends/codesys/publication.ts", "../backends/codesys/vendor.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import {\n httpOptionsSchema,\n buildTargetSchema,\n publicationSchema,\n type TargetDescriptor,\n} from \"@tsplc/config\";\nimport { z } from \"zod\";\nimport { engineeringSchema } from \"./engineering.ts\";\nimport { isIecIdentifier } from \"./names.ts\";\n\nconst addressSchema = z\n .object({\n kind: z.literal(\"direct\"),\n address: z.string().regex(/^%(?:[IQ]X[0-9]+\\.[0-7]|[IQ][BWD][0-9]+)$/),\n type: z.string().optional(),\n // A generated device tree maps this bit or byte channel to its target\n // variable, so the scan needs no AT wire or copy.\n mapped: z.boolean().optional(),\n inverted: z.boolean().optional(),\n shared: z.boolean().optional(),\n })\n .strict();\n// Explicit IEC object names keep their exact spelling, so they must already be valid.\nconst iecNames = z\n .record(\n z.string().min(1),\n z.string().refine(isIecIdentifier, \"Use a valid, non-reserved IEC identifier.\"),\n )\n .optional();\nexport const optionsSchema = z\n .object({\n engineering: engineeringSchema,\n http: httpOptionsSchema,\n io: z.record(z.string().min(1), addressSchema),\n publish: publicationSchema.default({ production: [], development: [] }),\n buildTarget: buildTargetSchema.default(\"production\"),\n programNames: iecNames,\n })\n .strict();\nexport type CodesysOptions = z.infer<typeof optionsSchema>;\nexport function codesys(\n options: z.input<typeof optionsSchema>,\n): TargetDescriptor<z.input<typeof optionsSchema>> {\n return { kind: \"codesys\", options };\n}\nexport function direct(\n address:\n | `%IX${number}.${number}`\n | `%QX${number}.${number}`\n | `%I${\"B\" | \"W\" | \"D\"}${number}`\n | `%Q${\"B\" | \"W\" | \"D\"}${number}`,\n): z.infer<typeof addressSchema> {\n return { kind: \"direct\", address };\n}\n",
|
|
6
6
|
"import { resolve } from \"node:path\";\nimport type { EmitResult } from \"@tsplc/compiler/ir\";\nimport { buildProject, configSchema, type InstalledLibrary, resolveConfig } from \"@tsplc/build\";\nimport type { Controller, DeviceTree } from \"@tsplc/config\";\nimport { z } from \"zod\";\nimport type { CodesysPlan } from \"./plan.ts\";\n\nexport const engineeringBuildSchema = configSchema.omit({\n sourceDir: true,\n entry: true,\n outDir: true,\n task: true,\n tasks: true,\n});\nexport const engineeringSchema = z.strictObject({\n kind: z.literal(\"v3.5\"),\n build: engineeringBuildSchema.optional(),\n});\nexport type CodesysEngineeringBuild = z.input<typeof engineeringBuildSchema>;\n\nexport function codesysBuildConfig(\n plan: CodesysPlan,\n bundle: Pick<EmitResult, \"objects\">,\n paths: {\n configFile: string;\n sourceDir: string;\n outDir: string;\n libraries?: InstalledLibrary[];\n deviceTree?: DeviceTree;\n controller?: Controller;\n },\n) {\n const settings = plan.options.engineering.build;\n if (!settings)\n throw new Error(\n \"CODESYS build requires engineering.build settings (codesys installation and template). Configure them or use --emit-only.\",\n );\n const programs = new Map(\n plan.core.programs.map((program) => {\n const matches = bundle.objects.filter(\n (object) => object.id === program.id && object.kind === \"program\",\n );\n const generated = matches[0];\n if (matches.length !== 1 || !generated)\n throw new Error(`Generated bundle must contain one PROGRAM object for ${program.name}.`);\n return [program.name, generated] as const;\n }),\n );\n const tasks = plan.deployment.tasks.map((task) => ({\n ...task,\n programs: task.programs.map((name) => {\n const program = programs.get(name);\n if (!program)\n throw new Error(`Task ${task.name} references a missing generated PROGRAM ${name}.`);\n return program.name;\n }),\n }));\n const first = plan.core.programs[0],\n entry = first && programs.get(first.name);\n if (!entry) throw new Error(\"CODESYS build requires a generated PROGRAM entry.\");\n const sourceDir = resolve(paths.sourceDir);\n return resolveConfig(\n {\n ...settings,\n libraryReferences: [\n ...(settings.libraryReferences ?? []),\n ...(Object.values(plan.http).some((endpoint) => endpoint.transport !== \"opcua\")\n ? [\"Net Base Services, 4.0.0.0 (CODESYS)\"]\n : []),\n ...(Object.values(plan.http).some((endpoint) => endpoint.tls)\n ? [\"CmpX509Cert Implementation, 3.5.22.0 (System)\"]\n : []),\n ],\n ...(paths.libraries ? { libraries: paths.libraries } : {}),\n ...(paths.deviceTree ? { deviceTree: paths.deviceTree } : {}),\n ...(paths.controller ? { controller: paths.controller } : {}),\n sourceDir,\n entry: resolve(sourceDir, entry.sourcePath ?? `${entry.name}/declaration.st`),\n outDir: resolve(paths.outDir),\n tasks,\n },\n paths.configFile,\n );\n}\n\nexport async function buildCodesys(...arguments_: Parameters<typeof codesysBuildConfig>) {\n return buildProject(codesysBuildConfig(...arguments_));\n}\n",
|
|
7
7
|
"// CODESYS declaration, statement, operator and elementary-type keywords.\n// https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_keywords.html\nconst keywords = new Set(\n `\nACTION END_ACTION PROGRAM END_PROGRAM FUNCTION END_FUNCTION FUNCTION_BLOCK END_FUNCTION_BLOCK\nINTERFACE END_INTERFACE METHOD END_METHOD PROPERTY END_PROPERTY\nTYPE END_TYPE STRUCT END_STRUCT UNION END_UNION ARRAY POINTER REFERENCE\nVAR END_VAR VAR_INPUT VAR_OUTPUT VAR_IN_OUT VAR_TEMP VAR_GLOBAL VAR_EXTERNAL\nVAR_ACCESS VAR_CONFIG VAR_STAT VAR_INST VAR_GENERIC\nCONSTANT RETAIN NON_RETAIN PERSISTENT AT READ_ONLY READ_WRITE PARAMS\nCONFIGURATION END_CONFIGURATION RESOURCE END_RESOURCE TASK WITH SINGLE INTERVAL PRIORITY\nPRIVATE PUBLIC PROTECTED INTERNAL ABSTRACT FINAL OVERRIDE EXTENDS IMPLEMENTS THIS SUPER\nIF THEN ELSIF ELSE END_IF CASE OF END_CASE FOR TO BY DO END_FOR\nWHILE END_WHILE REPEAT UNTIL END_REPEAT RETURN EXIT CONTINUE JMP\nTRUE FALSE BOOL BYTE WORD DWORD LWORD SINT USINT INT UINT DINT UDINT LINT ULINT\nREAL LREAL TIME LTIME DATE LDATE DATE_AND_TIME LDATE_AND_TIME TIME_OF_DAY LTIME_OF_DAY\nDT LDT TOD LTOD STRING WSTRING CHAR WCHAR\nANY ANY_BIT ANY_DATE ANY_DERIVED ANY_ELEMENTARY ANY_INT ANY_MAGNITUDE ANY_NUM\nANY_REAL ANY_STRING ANY_UNSIGNED\nAND AND_THEN OR OR_ELSE XOR NOT MOD ADD SUB MUL DIV MOVE SEL MIN MAX LIMIT\nABS ACOS ASIN ATAN COS SIN TAN EXP EXPT LN LOG SQRT TRUNC SHL SHR ROL ROR\nADR SIZEOF CONCAT DELETE FIND INSERT LEFT LEN MID REPLACE RIGHT\n`\n .trim()\n .split(/\\s+/),\n);\nconst types =\n \"(?:BOOL|BYTE|WORD|DWORD|LWORD|SINT|USINT|INT|UINT|DINT|UDINT|LINT|ULINT|REAL|LREAL|TIME|LTIME|DATE|LDATE|DATE_AND_TIME|LDATE_AND_TIME|TIME_OF_DAY|LTIME_OF_DAY|DT|LDT|TOD|LTOD|STRING|WSTRING|CHAR|WCHAR)\";\nconst conversion = new RegExp(`^(?:${types}_TO_${types}|TO_${types}|TRUNC_${types})$`);\nexport function isIecIdentifier(name: string): boolean {\n const upper = name.toUpperCase();\n return (\n /^[A-Za-z][A-Za-z0-9_]*$/.test(name) &&\n !name.includes(\"__\") &&\n !keywords.has(upper) &&\n !conversion.test(upper)\n );\n}\n\nconst identifierBody = (label: string): string =>\n label\n .replace(/[^A-Za-z0-9_]/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\") || \"name\";\n\n/** Capitals inside a word are kept, so `PlantIO` stays as written while `plant-io` is `PlantIo`. */\nexport const pascalCase = (label: string): string =>\n label\n .split(/[^A-Za-z0-9]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n\nexport class Names {\n private readonly used = new Set<string>();\n allocateObject(prefix: \"FB\" | \"F\" | \"PRG\" | \"ST\" | \"E\" | \"GVL\", label: string): string {\n const source = prefix === \"F\" ? label.replace(/^PRG_/, \"\") : label;\n const kind = prefix === \"F\" && source.startsWith(\"FUN_\") ? \"FUN\" : prefix;\n const body = source.startsWith(`${kind}_`) ? source.slice(kind.length + 1) : source;\n return this.allocate(`${kind}_${identifierBody(body)}`);\n }\n\n reserve(name: string): void {\n this.used.add(name.toUpperCase());\n // Qualified native types must keep their library prefix resolvable in the\n // declaration scope, not merely reserve the complete dotted spelling.\n const prefix = name.split(\".\")[0];\n if (prefix) this.used.add(prefix.toUpperCase());\n }\n allocate(label: string, preserve = true): string {\n const base = preserve && isIecIdentifier(label) ? label : `plc_${identifierBody(label)}`;\n let name = base;\n for (let suffix = 2; this.used.has(name.toUpperCase()); suffix++) name = `${base}_${suffix}`;\n this.reserve(name);\n return name;\n }\n}\n",
|
|
8
|
-
"import type {\n Constant,\n CoreExpression,\n CoreFunction,\n CoreFunctionBlock,\n CorePath,\n CoreStatement,\n EmitResult,\n GeneratedObject,\n SourceSpan,\n Variable,\n} from \"@tsplc/compiler/ir\";\nimport { defaultValue, instancedBlock, standardBlocks } from \"@tsplc/compiler/ir\";\nimport { Names, pascalCase } from \"./names.ts\";\nimport { NumericLowering } from \"./numeric.ts\";\nimport { type CodesysPlan, diagnostic, isCodesysPlan } from \"./plan.ts\";\nimport { storageLayout } from \"./storage.ts\";\nimport { accessedStorage } from \"./task-access.ts\";\nimport { emitHttp, httpMethods, httpCertificateVerifier, opcuaServiceCapacity } from \"./http.ts\";\nimport { CodesysTypes } from \"./types.ts\";\nimport type { Publication } from \"@tsplc/config\";\n\nexport interface SourceMapping {\n path: string;\n line: number;\n span: SourceSpan;\n}\n\n// All symbol relationships were checked by normalization and planning. Failure\n// here is an emitter invariant violation, rather than a recoverable source error.\nfunction required<T>(value: T | undefined): T {\n if (value === undefined) throw new Error(\"Missing verified CODESYS symbol.\");\n return value;\n}\n\ntype CodesysBundle = EmitResult & {\n /** Variables a generated device tree maps to their bit or byte channels. */\n ioMappings: readonly { key: string; address: string; variable: string }[];\n mappings: readonly SourceMapping[];\n ioSymbols: Readonly<Record<string, string>>;\n publication: Publication;\n};\n\nexport function emitCodesys(plan: CodesysPlan): CodesysBundle {\n if (!isCodesysPlan(plan)) {\n return {\n artifacts: [],\n objects: [],\n mappings: [],\n ioSymbols: {},\n publication: { production: [], development: [] },\n ioMappings: [],\n diagnostics: [diagnostic(\"Emission requires a validated CODESYS plan.\")],\n };\n }\n return new CodesysEmitter(plan).emit();\n}\n\n// A bundle owns target names and source mappings. Per-routine declarations and\n// implementation lines stay local to emitRoutine, so they cannot leak between POUs.\nclass CodesysEmitter {\n private readonly names = new Names();\n private networkName: string | undefined;\n private readonly rpcChannels: {\n path: string;\n request: string;\n requestId: string;\n reply: string;\n replyId: string;\n epoch: string;\n }[] = [];\n private readonly references = new Map<string, string>();\n /** Each `io` binding: an AT wire copied to or from its logical target around the scan. */\n private readonly channels: {\n key: string;\n root: string;\n input: boolean;\n target: string;\n wire: string;\n inverted?: boolean;\n }[] = [];\n private readonly ioMappings: { key: string; address: string; variable: string }[] = [];\n private readonly objects: GeneratedObject[] = [];\n private readonly mappings: SourceMapping[] = [];\n private readonly mailboxLocks = new Map<string, string>();\n private readonly blockFields = new Map<string, Map<string, string>>();\n private readonly typeMap;\n private readonly blocks;\n private readonly blockNames;\n private readonly functionNames = new Map<string, string>();\n private readonly programRoutines = new Set<string>();\n private readonly programResults = new Map<string, string>();\n private readonly routineScopes = new Map<\n string,\n { names: Names; references: Map<string, string> }\n >();\n private readonly targetTypes: CodesysTypes;\n private readonly numeric: NumericLowering;\n private readonly layout;\n\n constructor(private readonly plan: CodesysPlan) {\n const { core, options } = plan;\n const persistent = new Set(\n core.variables.filter((item) => item.storage !== \"constant\").map((item) => item.id),\n );\n for (const fn of core.functions) {\n if (!fn.owner && [...accessedStorage(fn, core)].some((id) => persistent.has(id)))\n this.programRoutines.add(fn.id);\n }\n for (const name of Object.values(options.programNames ?? {})) this.names.reserve(name);\n\n this.typeMap = new Map(core.types.map((type) => [type.id, type]));\n this.blocks = new Map(core.blocks.map((block) => [block.id, block]));\n this.blockNames = new Map(\n core.blocks.map((block) => [\n block.id,\n block.standard\n ? standardBlocks[block.standard].native\n : this.names.allocateObject(\"FB\", block.name),\n ]),\n );\n for (const name of this.blockNames.values()) this.names.reserve(name);\n this.targetTypes = new CodesysTypes(this.typeMap, this.names, this.blockNames);\n this.numeric = new NumericLowering(this.typeMap, (label) => this.names.allocate(label));\n this.layout = storageLayout(core);\n this.objects.push(...this.targetTypes.objects);\n }\n\n emit(): CodesysBundle {\n this.emitGlobals();\n this.emitIo();\n if (Object.values(this.plan.http).some((endpoint) => endpoint.transport !== \"opcua\")) {\n this.networkName = this.names.allocateObject(\"GVL\", \"TsplcNetwork\");\n this.objects.push({\n id: \"runtime:httpNetwork\",\n kind: \"globalList\",\n name: this.networkName,\n // Blocks in other global lists take this in their initializers, so it must initialize first.\n declaration: `{attribute 'qualified_only'}\n{attribute 'global_init_slot' := '40000'}\nVAR_GLOBAL\nnetwork:NBS.AsyncProperty := (usiTaskPrio:=15,udiTaskInterval:=1000,tnTaskName:='tsPLC HTTP');\nEND_VAR\n`,\n });\n }\n\n // Helpers must be discovered before allocating local names: an ST local must\n // never shadow a helper, function, FB, or DUT that the implementation calls.\n const { core } = this.plan;\n const entries = new Set(core.programs.map((program) => program.entry));\n for (const fn of core.functions.filter((fn) => !fn.owner)) {\n const program = this.programRoutines.has(fn.id);\n const label = program && entries.has(fn.id) ? `${fn.name}_body` : fn.name;\n this.functionNames.set(fn.id, this.names.allocateObject(program ? \"PRG\" : \"F\", label));\n }\n for (const fn of core.functions) this.prepareStatements(fn.body);\n for (const block of core.blocks) this.prepareStatements(block.body);\n this.objects.push(...this.numeric.objects);\n this.allocateBlockFields();\n\n const routines = [...core.functions, ...core.blocks.filter((block) => !block.standard)];\n for (const fn of routines) this.allocateRoutineScope(fn);\n for (const fn of routines) this.emitRoutine(fn);\n for (const program of core.programs) this.emitProgram(program);\n\n const { objects, mappings } = this;\n const paths = new Map<string, string>();\n for (const object of objects) {\n const path = this.objectPath(object);\n paths.set(object.id, path);\n object.sourcePath =\n object.implementation === undefined ? `${path}.st` : `${path}/declaration.st`;\n }\n const artifacts = objects.flatMap((object) => {\n const path = paths.get(object.id)!;\n return object.implementation === undefined\n ? [{ path: `${path}.st`, content: object.declaration }]\n : [\n { path: `${path}/declaration.st`, content: object.declaration },\n { path: `${path}/implementation.st`, content: object.implementation },\n ];\n });\n for (const mapping of mappings) {\n const object = objects.find((object) => {\n const key = object.kind === \"method\" ? object.id : object.name;\n return mapping.path === `${key}.st` || mapping.path.startsWith(`${key}/`);\n });\n if (object) {\n const key = object.kind === \"method\" ? object.id : object.name;\n mapping.path = paths.get(object.id)! + mapping.path.slice(key.length);\n }\n }\n const ioSymbols = Object.fromEntries([\n ...this.channels.map((channel) => [channel.key, channel.target]),\n ...this.ioMappings.map((mapping) => [mapping.key, mapping.variable]),\n ]);\n const { ioMappings } = this;\n const logicalIo = this.plan.core.variables\n .filter((variable) => variable.storage === \"input\" || variable.storage === \"output\")\n .map((variable) => variable.id);\n const rpcSymbols = [\n ...new Set(\n this.rpcChannels.flatMap((channel) =>\n [channel.request, channel.requestId, channel.reply, channel.replyId, channel.epoch].map(\n (path) => path.replace(/\\[\\d+\\]$/, \"\"),\n ),\n ),\n ),\n ];\n const published = (ids: readonly string[]) =>\n [...ids, ...logicalIo].map((id) => required(this.references.get(id))).concat(rpcSymbols);\n const publication = {\n production: published(this.plan.publication.production),\n development: published(this.plan.publication.development),\n };\n const exposures = Object.fromEntries(\n core.variables\n .filter((variable) => variable.exposure)\n .map((variable) => {\n const record = this.typeMap.get(variable.type);\n if (record?.kind !== \"record\") throw new Error(\"Invalid exposure record.\");\n const root = required(this.references.get(variable.id));\n const fields = Object.fromEntries(\n record.fields\n .filter((field) => field.name !== \"contractVersion\")\n .map((field) => {\n const type = this.typeMap.get(field.type);\n const kind =\n type?.kind === \"bool\" ? \"boolean\" : type?.kind === \"string\" ? \"string\" : \"number\";\n return [\n field.name,\n { path: `${root}.${this.targetTypes.field(record.id, field.name)}`, kind },\n ];\n }),\n );\n return [\n variable.exposure!.name,\n {\n version: variable.exposure!.version,\n versionPath: `${root}.${this.targetTypes.field(record.id, \"contractVersion\")}`,\n telemetry: fields,\n },\n ];\n }),\n );\n artifacts.push(\n { path: \"exposures.json\", content: JSON.stringify(exposures, null, 2) + \"\\n\" },\n {\n path: \"machines.ts\",\n content: `// Generated explicit read-only machine interfaces. Do not edit.\\nexport const machines=${JSON.stringify(exposures, null, 2)} as const;\\nexport const serviceChannels=${JSON.stringify(this.rpcChannels, null, 2)} as const;\\n`,\n },\n );\n return { artifacts, objects, mappings, ioSymbols, ioMappings, publication, diagnostics: [] };\n }\n\n private objectPath(object: GeneratedObject): string {\n const { core } = this.plan;\n if (object.kind === \"method\" && object.parent) {\n const parent = required(this.objects.find((candidate) => candidate.id === object.parent));\n return `${this.objectPath(parent)}/methods/${object.name}`;\n }\n if (object.kind === \"method\") {\n const method = required(core.functions.find((fn) => fn.id === object.id));\n const owner = required(this.objects.find((item) => item.id === method.owner?.block));\n return `${this.objectPath(owner)}/methods/${object.name}`;\n }\n let source = object.id.split(\":\")[0] ?? \"\";\n const program = core.programs.find((item) => item.id === object.id);\n if (program) source = program.entry.split(\":\")[0] ?? \"\";\n const group = this.layout.globalLists.find((item) => item.id === object.id);\n if (group) {\n // Variable IDs are relative to tsconfig, unlike their diagnostic spans.\n source = group.variables[0]?.id.split(\":\")[0] ?? \"\";\n }\n if (\n /^[\\w./ -]+\\.tsx?$/.test(source) &&\n !source.split(/[\\\\/]/).includes(\"..\") &&\n !source.startsWith(\"/\")\n ) {\n const segments = source.replaceAll(\"\\\\\", \"/\").split(\"/\").slice(0, -1);\n if (segments[0] === \"src\") segments.shift();\n // A DUT directory can also contain sibling input/output layouts. Keep\n // that directory for every DUT, or its primary type would block the folder.\n if (object.kind !== \"dataType\" && segments.at(-1) === object.name) segments.pop();\n return [...segments, object.name].join(\"/\");\n }\n return `${object.kind === \"dataType\" ? \"Types\" : object.id === \"io\" ? \"IO\" : \"_Generated\"}/${object.name}`;\n }\n\n private emitGlobals(): void {\n const { options } = this.plan;\n const { layout, names, references, mappings, targetTypes, typeMap, objects } = this;\n const hasExports = (group: (typeof layout.globalLists)[number]) =>\n group.variables.some((variable) => variable.exported && !variable.exposure);\n for (const group of layout.globalLists) {\n const splitByStorage = layout.globalLists.some(\n (other) =>\n other.module === group.module && other.storage !== group.storage && hasExports(other),\n );\n // Exported lists are the program's public interface; private storage stays generated.\n const name = hasExports(group)\n ? names.allocate(\n pascalCase(splitByStorage ? `${group.module}-${group.storage}` : group.module),\n )\n : names.allocateObject(\"GVL\", `${group.module}_${group.storage}`);\n const published = new Set(this.plan.publication[options.buildTarget]);\n const publish = group.variables.some((variable) => published.has(variable.id));\n const fields = new Names();\n for (const name of this.blockNames.values()) fields.reserve(name);\n const lines = [\n ...(publish ? [\"{attribute 'linkalways'}\"] : []),\n \"{attribute 'qualified_only'}\",\n group.storage === \"constants\"\n ? \"VAR_GLOBAL CONSTANT\"\n : group.storage === \"retained\"\n ? \"VAR_GLOBAL RETAIN\"\n : \"VAR_GLOBAL\",\n ];\n for (const item of group.variables) {\n const field = fields.allocate(item.name);\n references.set(item.id, `${name}.${field}`);\n if (published.has(item.id))\n lines.push(` {attribute 'symbol' := '${item.exposure ? \"read\" : \"readwrite\"}'}`);\n mappings.push({ path: `${name}.st`, line: lines.length + 1, span: item.span });\n let initial = \"\";\n if (!instancedBlock(item.type, typeMap)) {\n const value = item.initial ?? defaultValue(item.type, typeMap);\n // CONSTANT declarations always keep their initializer. Mutable zero\n // aggregates use the same implicit initialization as the original ST.\n initial =\n group.storage === \"constants\"\n ? ` := ${targetTypes.literal(value, item.type)}`\n : targetTypes.declarationInitializer(value, item.type);\n }\n lines.push(` ${field} : ${targetTypes.name(item.type)}${initial};`);\n }\n lines.push(\"END_VAR\");\n objects.push({\n id: group.id,\n kind: \"globalList\",\n name,\n declaration: `${lines.join(\"\\n\")}\\n`,\n });\n }\n }\n\n private emitIo(): void {\n const { core, options } = this.plan;\n const { names, references, channels, ioMappings, mappings, targetTypes, typeMap, objects } =\n this;\n const ioName = names.allocate(\"GVL_IO\");\n const ioFields = new Names();\n for (const name of this.blockNames.values()) ioFields.reserve(name);\n const ioLines = [\"{attribute 'linkalways'}\", \"{attribute 'qualified_only'}\", \"VAR_GLOBAL\"];\n for (const item of core.variables.filter(\n (item) => item.storage === \"input\" || item.storage === \"output\",\n )) {\n const field = ioFields.allocate(item.name);\n const initial = item.initial ?? defaultValue(item.type, typeMap);\n const binding = required(options.io[item.name]);\n references.set(item.id, `${ioName}.${field}`);\n if (binding.mapped) {\n ioMappings.push({\n key: item.name,\n address: binding.address,\n variable: `${ioName}.${field}`,\n });\n mappings.push({ path: `${ioName}.st`, line: ioLines.length + 2, span: item.span });\n ioLines.push(\n \" {attribute 'symbol' := 'read'}\",\n ` ${field} : ${targetTypes.name(item.type)} := ${targetTypes.literal(initial, item.type)};`,\n );\n continue;\n }\n const wire = ioFields.allocate(`${item.name}_physical`);\n channels.push({\n key: item.name,\n root: item.id,\n input: item.storage === \"input\",\n target: `${ioName}.${field}`,\n wire: `${ioName}.${wire}`,\n inverted: binding.inverted,\n });\n mappings.push(\n { path: `${ioName}.st`, line: ioLines.length + 1, span: item.span },\n { path: `${ioName}.st`, line: ioLines.length + 3, span: item.span },\n );\n ioLines.push(\n ` ${wire} AT ${binding.address} : ${targetTypes.name(item.type)};`,\n // Publish the scan's logical value for monitoring. Physical wires stay\n // private; external writes cannot alter the controller's IO snapshot.\n \" {attribute 'symbol' := 'read'}\",\n ` ${field} : ${targetTypes.name(item.type)} := ${targetTypes.literal(initial, item.type)};`,\n );\n }\n for (const { key, root, segments, type } of this.plan.storageBindings) {\n const { address, mapped, inverted } = required(options.io[key]);\n const target = segments.reduce(\n (path, segment) =>\n segment.kind === \"field\"\n ? `${path}.${targetTypes.field(segment.record, segment.name)}`\n : `${path}[${segment.value}]`,\n required(references.get(root.id)),\n );\n if (mapped) {\n ioMappings.push({ key, address, variable: target });\n continue;\n }\n const wire = ioFields.allocate(`${key.replace(/\\W+/g, \"_\").replace(/_+$/, \"\")}_physical`);\n // The wire takes the target's own type, so equal-width EDS types need no conversion.\n ioLines.push(` ${wire} AT ${address} : ${targetTypes.name(type.id)};`);\n channels.push({\n key,\n root: root.id,\n input: address[1] === \"I\",\n target,\n wire: `${ioName}.${wire}`,\n inverted,\n });\n }\n ioLines.push(\"END_VAR\");\n // Mapped storage bindings need no IO list; mapped logical IO is declared here.\n if (ioLines.length > 4)\n objects.push({\n id: \"io\",\n kind: \"globalList\",\n name: ioName,\n declaration: `${ioLines.join(\"\\n\")}\\n`,\n });\n }\n\n private prepareStatements(items: readonly CoreStatement[]): void {\n const { numeric } = this;\n for (const item of items) {\n if (item.kind === \"assign\") {\n numeric.prepare(item.value);\n item.path?.forEach((segment) => {\n if (segment.kind === \"index\") numeric.prepare(segment.value);\n });\n }\n if (item.kind === \"if\") {\n numeric.prepare(item.condition);\n this.prepareStatements(item.then);\n this.prepareStatements(item.else);\n }\n if (item.kind === \"switch\") {\n numeric.prepare(item.value);\n for (const branch of item.cases) this.prepareStatements(branch.body);\n this.prepareStatements(item.fallback);\n }\n if (item.kind === \"for\") {\n if (item.dynamic) {\n numeric.prepare(item.dynamic.start);\n numeric.prepare(item.dynamic.limit);\n }\n this.prepareStatements(item.body);\n }\n if (item.kind === \"return\" && item.value) numeric.prepare(item.value);\n if (item.kind === \"invoke\") {\n if (item.index) numeric.prepare(item.index);\n for (const value of item.arguments) numeric.prepare(value);\n }\n if (item.kind === \"blockUpdate\") {\n if (item.index) numeric.prepare(item.index);\n for (const value of Object.values(item.inputs)) numeric.prepare(value);\n }\n }\n }\n\n private allocateBlockFields(): void {\n const { core } = this.plan;\n const { objects, functionNames, blockNames, blockFields } = this;\n for (const block of core.blocks) {\n const fields = new Names(),\n mapped = new Map<string, string>();\n for (const object of objects) fields.reserve(object.name);\n for (const objectName of [\n ...core.functions.filter((fn) => !fn.owner).map((fn) => required(functionNames.get(fn.id))),\n ...blockNames.values(),\n ])\n fields.reserve(objectName);\n for (const method of core.functions.filter((fn) => fn.owner?.block === block.id))\n functionNames.set(method.id, fields.allocate(method.name));\n const native = block.standard && standardBlocks[block.standard];\n for (const item of [...block.inputs, ...block.outputs, ...block.state])\n mapped.set(\n item.id,\n native\n ? required(\n [...native.inputs, ...native.outputs].find(([name]) => name === item.name),\n )[1]\n : fields.allocate(item.name, true),\n );\n if (block.runtime?.kind === \"mailbox\")\n this.mailboxLocks.set(block.id, fields.allocate(\"plc_mailbox_lock\"));\n blockFields.set(block.id, mapped);\n }\n }\n\n private allocateRoutineScope(fn: CoreFunction | CoreFunctionBlock): void {\n const block = \"inputs\" in fn ? fn : undefined;\n const owner =\n block ?? (\"owner\" in fn && fn.owner ? this.blocks.get(fn.owner.block) : undefined);\n const names = new Names(),\n references = new Map<string, string>();\n for (const object of this.objects) names.reserve(object.name);\n for (const name of [...this.functionNames.values(), ...this.blockNames.values()])\n names.reserve(name);\n if (this.programRoutines.has(fn.id) && \"parameters\" in fn && fn.result)\n this.programResults.set(fn.id, names.allocate(\"plc_result\"));\n if (owner) {\n for (const item of [...owner.outputs, ...owner.state]) {\n const name = required(required(this.blockFields.get(owner.id)).get(item.id));\n names.reserve(name);\n references.set(item.id, name);\n }\n }\n for (const item of \"parameters\" in fn ? fn.parameters : fn.inputs) {\n const name = block\n ? required(required(this.blockFields.get(block.id)).get(item.id))\n : names.allocate(item.name);\n names.reserve(name);\n references.set(item.id, name);\n }\n for (const item of fn.locals) references.set(item.id, names.allocate(item.name));\n this.routineScopes.set(fn.id, { names, references });\n }\n\n private routineHeader(\n fn: CoreFunction | CoreFunctionBlock,\n name: string,\n ): { kind: GeneratedObject[\"kind\"]; declaration: string } {\n if (\"inputs\" in fn) return { kind: \"functionBlock\", declaration: `FUNCTION_BLOCK ${name}` };\n if (fn.owner)\n return {\n kind: \"method\",\n declaration: `METHOD ${fn.owner.access.toUpperCase()} ${name}${fn.result ? ` : ${this.targetTypes.name(fn.result)}` : \"\"}`,\n };\n if (this.programRoutines.has(fn.id)) return { kind: \"program\", declaration: `PROGRAM ${name}` };\n return {\n kind: \"function\",\n declaration: `FUNCTION ${name} : ${fn.result ? this.targetTypes.name(fn.result) : \"BOOL\"}`,\n };\n }\n\n private emitRoutine(fn: CoreFunction | CoreFunctionBlock): void {\n const { core } = this.plan;\n if (\"inputs\" in fn && (fn.runtime?.kind === \"http\" || fn.runtime?.kind === \"rpc\")) {\n const endpoint = required(this.plan.http[fn.id]);\n const rpcGlobal =\n endpoint.transport === \"opcua\"\n ? this.names.allocateObject(\"GVL\", \"TsplcRpc_\" + required(this.blockNames.get(fn.id)))\n : undefined;\n if (rpcGlobal) {\n this.objects.push({\n id: fn.id + \":rpc\",\n kind: \"globalList\",\n name: rpcGlobal,\n declaration: `{attribute 'qualified_only'}\nVAR_GLOBAL\n {attribute 'symbol' := 'read'} requests:ARRAY[1..${opcuaServiceCapacity}] OF STRING(2048);\n {attribute 'symbol' := 'read'} requestIds:ARRAY[1..${opcuaServiceCapacity}] OF STRING(64);\n {attribute 'symbol' := 'readwrite'} replyIds:ARRAY[1..${opcuaServiceCapacity}] OF STRING(64);\n {attribute 'symbol' := 'readwrite'} replies:ARRAY[1..${opcuaServiceCapacity}] OF STRING(2048);\n {attribute 'symbol' := 'readwrite'} epochs:ARRAY[1..${opcuaServiceCapacity}] OF STRING(32);\n inUse:ARRAY[1..${opcuaServiceCapacity}] OF __XWORD;\n sequence:ARRAY[1..${opcuaServiceCapacity}] OF UDINT;\nEND_VAR`,\n });\n for (let slot = 1; slot <= opcuaServiceCapacity; slot++)\n this.rpcChannels.push({\n path: endpoint.path,\n request: `${rpcGlobal}.requests[${slot}]`,\n reply: `${rpcGlobal}.replies[${slot}]`,\n requestId: `${rpcGlobal}.requestIds[${slot}]`,\n replyId: `${rpcGlobal}.replyIds[${slot}]`,\n epoch: `${rpcGlobal}.epochs[${slot}]`,\n });\n }\n const generated = emitHttp(\n fn,\n required(this.blockNames.get(fn.id)),\n required(this.blockFields.get(fn.id)),\n this.typeMap,\n this.targetTypes,\n endpoint,\n this.networkName ? `${this.networkName}.network` : \"\",\n rpcGlobal,\n );\n this.objects.push(\n generated,\n ...httpMethods(generated.id, endpoint.transport),\n ...httpCertificateVerifier(generated.id, generated.name, required(this.plan.http[fn.id])),\n );\n return;\n }\n const {\n blockNames,\n functionNames,\n references,\n objects,\n mappings,\n targetTypes,\n typeMap,\n blocks,\n blockFields,\n numeric,\n layout,\n } = this;\n const block = \"inputs\" in fn ? fn : undefined;\n const method = \"owner\" in fn ? fn.owner : undefined;\n const program = this.programRoutines.has(fn.id);\n const owner = method ? required(blocks.get(method.block)) : block;\n const name = block ? required(blockNames.get(block.id)) : required(functionNames.get(fn.id));\n const inputs = \"parameters\" in fn ? fn.parameters : fn.inputs;\n const state = owner ? [...owner.outputs, ...owner.state] : [];\n const mappingName = method ? fn.id : name;\n const routineScope = required(this.routineScopes.get(fn.id));\n const scope = new Map([...references, ...routineScope.references]),\n locals = routineScope.names;\n const declarations = fn.locals.map(\n (item) => ` ${required(scope.get(item.id))} : ${targetTypes.name(item.type)};`,\n );\n const declarationSpans = fn.locals.map((item) => item.span);\n const mutex =\n method && owner?.runtime?.kind === \"mailbox\"\n ? required(this.mailboxLocks.get(owner.id))\n : undefined;\n const acquired = mutex ? locals.allocate(\"plc_acquired\") : undefined;\n const unavailable = mutex && fn.result ? locals.allocate(\"plc_unavailable\") : undefined;\n if (acquired) {\n declarations.push(` ${acquired} : BOOL;`);\n declarationSpans.push(fn.span);\n }\n if (unavailable && fn.result) {\n declarations.push(\n ` ${unavailable} : ${targetTypes.name(fn.result)} := ${targetTypes.literal(defaultValue(fn.result, typeMap), fn.result)};`,\n );\n declarationSpans.push(fn.span);\n }\n // Count target lines as they are appended; diagnostics use these exact offsets.\n const lines: string[] = [];\n const write = (line: string, depth: number, source?: SourceSpan): void => {\n lines.push(\" \".repeat(depth) + line);\n if (source)\n mappings.push({\n path: `${mappingName}/implementation.st`,\n line: lines.length,\n span: source,\n });\n };\n\n // Only the holder releases, so a failed swap is spurious (see the acquire above); retry it.\n const release = (lock: string, depth: number, source?: SourceSpan) => {\n write(`WHILE NOT __COMPARE_AND_SWAP(ADR(${lock}), 1, 0) DO`, depth, source);\n write(\";\", depth + 1);\n write(\"END_WHILE;\", depth);\n };\n\n const load = (id: string): string => {\n const value = scope.get(id);\n if (!value) throw new Error(`Missing verified storage ${id}.`);\n return value;\n };\n const scopeTypes = new Map(\n [...core.variables, ...inputs, ...state, ...fn.locals].map((variable) => [\n variable.id,\n variable.type,\n ]),\n );\n\n // Block output records are a source abstraction; target FB fields are direct.\n const place = (id: string, path: CorePath = []): string => {\n let text = load(id),\n typeId = required(scopeTypes.get(id));\n let outputBlock: string | undefined;\n for (const segment of path) {\n const type = required(typeMap.get(typeId));\n if (segment.kind === \"field\" && type.kind === \"block\" && segment.name === \"out\") {\n outputBlock = type.block;\n typeId = required(type.output);\n continue;\n }\n if (segment.kind === \"field\" && outputBlock) {\n const output = required(\n required(blocks.get(outputBlock)).outputs.find((field) => field.name === segment.name),\n );\n text += `.${required(required(blockFields.get(outputBlock)).get(output.id))}`;\n typeId = output.type;\n outputBlock = undefined;\n } else if (segment.kind === \"field\" && type.kind === \"record\") {\n text += `.${targetTypes.field(typeId, segment.name)}`;\n typeId = required(type.fields.find((field) => field.name === segment.name)).type;\n } else if (segment.kind === \"index\" && type.kind === \"array\") {\n // A strict enum converts explicitly to its DINT base, as HTTP JSON encoding does.\n text +=\n typeMap.get(segment.value.type)?.kind === \"enum\"\n ? `[TO_DINT(${expression(segment.value)})]`\n : `[${expression(segment.value)}]`;\n typeId = type.element;\n } else throw new Error(\"Invalid verified place\");\n }\n return text;\n };\n\n const expression = (value: CoreExpression): string => {\n if (value.kind === \"constant\") return targetTypes.literal(value.value, value.type);\n if (value.kind === \"load\") return place(value.root, value.path);\n if (value.kind === \"borrow\") return place(value.place.root, value.place.path);\n if (value.kind === \"convert\" && typeMap.get(value.type)?.kind === \"string\")\n return expression(value.operand);\n if (value.kind === \"unary\" || value.kind === \"convert\")\n return numeric.render(value, [expression(value.operand)]);\n return numeric.render(value, [expression(value.left), expression(value.right)]);\n };\n\n // Aggregate constants are expanded into legal leaf assignments for ST.\n const assignConstant = (\n destination: string,\n value: Constant,\n id: string,\n depth: number,\n span: SourceSpan,\n ): void => {\n const type = required(typeMap.get(id));\n if (type.kind === \"record\" && value.kind === \"record\")\n type.fields.forEach((field) => {\n assignConstant(\n `${destination}.${targetTypes.field(id, field.name)}`,\n required(value.fields[field.name]),\n field.type,\n depth,\n span,\n );\n });\n else if (type.kind === \"array\" && value.kind === \"array\")\n value.items.forEach((item, index) => {\n assignConstant(\n `${destination}[${type.lowerBound + index}]`,\n item,\n type.element,\n depth,\n span,\n );\n });\n else write(`${destination} := ${targetTypes.literal(value, id)};`, depth, span);\n };\n\n const body = (items: readonly CoreStatement[], depth: number): void => {\n for (const item of items) {\n switch (item.kind) {\n case \"assign\":\n if (item.value.kind === \"constant\")\n assignConstant(\n place(item.root, item.path),\n item.value.value,\n item.value.type,\n depth,\n item.span,\n );\n else\n write(\n `${place(item.root, item.path)} := ${expression(item.value)};`,\n depth,\n item.span,\n );\n break;\n case \"blockUpdate\": {\n const instance = instancedBlock(required(scopeTypes.get(item.instance)), typeMap);\n if (!instance) throw new Error(\"Invalid verified block receiver\");\n const target = required(blocks.get(instance.block));\n const arguments_ = Object.entries(item.inputs).map(([input, value]) => {\n const formal = required(target.inputs.find((field) => field.name === input));\n return `${required(required(blockFields.get(target.id)).get(formal.id))} := ${expression(value)}`;\n });\n const receiver = item.index\n ? `${load(item.instance)}[${expression(item.index)}]`\n : load(item.instance);\n write(`${receiver}(${arguments_.join(\", \")});`, depth, item.span);\n break;\n }\n case \"invoke\": {\n const receiver = item.instance\n ? `${load(item.instance)}${item.index ? `[${expression(item.index)}]` : \"\"}.`\n : \"\";\n const called = required(core.functions.find((fn) => fn.id === item.function));\n const programCall = this.programRoutines.has(called.id);\n const arguments_ = item.arguments.map((value, index) => {\n if (\n !called.owner &&\n !programCall &&\n !called.parameters.some((parameter) => parameter.mode === \"inOut\")\n )\n return expression(value);\n const parameter = required(called.parameters[index]);\n const formal = required(\n required(this.routineScopes.get(called.id)).references.get(parameter.id),\n );\n return `${formal} := ${expression(value)}`;\n });\n const call = `${receiver}${required(functionNames.get(item.function))}(${arguments_.join(\", \")})`;\n if (programCall) {\n write(`${call};`, depth, item.span);\n if (item.destination)\n write(\n `${load(item.destination)} := ${required(functionNames.get(called.id))}.${required(this.programResults.get(called.id))};`,\n depth,\n item.span,\n );\n break;\n }\n write(\n item.destination ? `${load(item.destination)} := ${call};` : `${call};`,\n depth,\n item.span,\n );\n break;\n }\n case \"if\":\n write(`IF ${expression(item.condition)} THEN`, depth, item.span);\n body(item.then, depth + 1);\n if (item.else.length) {\n write(\"ELSE\", depth, item.span);\n body(item.else, depth + 1);\n }\n write(\"END_IF;\", depth, item.span);\n break;\n case \"switch\": {\n for (const [index, branch] of item.cases.entries()) {\n const conditions = branch.values.map(\n (value) =>\n `(${expression(item.value)} = ${targetTypes.literal(value, item.value.type)})`,\n );\n write(`${index ? \"ELSIF\" : \"IF\"} ${conditions.join(\" OR \")} THEN`, depth, item.span);\n body(branch.body, depth + 1);\n }\n if (item.cases.length) {\n if (item.fallback.length) write(\"ELSE\", depth, item.span);\n body(item.fallback, depth + 1);\n write(\"END_IF;\", depth, item.span);\n } else body(item.fallback, depth);\n break;\n }\n case \"for\": {\n // Iterate with a DINT ordinal rather than overflowing the authored\n // counter at a width boundary. Reconstruct its typed value each scan.\n const counterType = scopeTypes.get(item.counter);\n if (!counterType || item.start.kind !== \"integer\")\n throw new Error(\"Invalid verified loop\");\n if (!item.maxIterations) {\n if (item.counterScope === \"existing\")\n write(\n `${load(item.counter)} := ${item.dynamic ? expression(item.dynamic.start) : targetTypes.literal(item.start, counterType)};`,\n depth,\n item.span,\n );\n break;\n }\n const ordinal = locals.allocate(\"iteration\");\n declarations.push(` ${ordinal} : DINT;`);\n declarationSpans.push(item.span);\n const wide = counterType === \"ULINT\" ? \"ULINT\" : \"LINT\";\n const ascending = BigInt(item.step) > 0n;\n const step = BigInt(item.step) < 0n ? -BigInt(item.step) : BigInt(item.step);\n let iterations = `DINT#${item.maxIterations}`;\n let first = `${wide}#${item.start.value}`;\n if (item.dynamic) {\n first = `TO_${wide}(${expression(item.dynamic.start)})`;\n const last = `TO_${wide}(${expression(item.dynamic.limit)})`;\n const count = locals.allocate(\"iterationCount\");\n declarations.push(` ${count} : DINT;`);\n declarationSpans.push(item.span);\n const comparison = ascending ? \"<\" : \">\";\n const inclusive = item.dynamic.exclusive ? \"\" : \"=\";\n const distance = ascending ? `${last} - ${first}` : `${first} - ${last}`;\n const exclusive = item.dynamic.exclusive ? ` - ${wide}#1` : \"\";\n write(`${count} := DINT#0;`, depth, item.span);\n write(`IF ${first} ${comparison}${inclusive} ${last} THEN`, depth, item.span);\n write(\n `${count} := ${wide}_TO_DINT(((${distance}${exclusive}) / ${wide}#${step}) + ${wide}#1);`,\n depth + 1,\n item.span,\n );\n write(\"END_IF;\", depth, item.span);\n iterations = count;\n }\n write(\n `FOR ${ordinal} := DINT#0 TO ${item.dynamic ? `${iterations} - DINT#1` : `DINT#${item.maxIterations - 1}`} DO`,\n depth,\n item.span,\n );\n const counterValue = `${load(item.counter)} := TO_${counterType}(${first} ${ascending ? \"+\" : \"-\"} (${wide}#${step} * DINT_TO_${wide}(${ordinal})));`;\n write(counterValue, depth + 1, item.span);\n body(item.body, depth + 1);\n write(\"END_FOR;\", depth, item.span);\n // CODESYS keeps the ordinal at EXIT and advances it on normal\n // completion/CONTINUE. Reconstructing here preserves that distinction.\n if (item.counterScope === \"existing\") write(counterValue, depth, item.span);\n break;\n }\n case \"return\":\n if (block) {\n if (item.value) {\n const returned = expression(item.value);\n for (const output of block.outputs)\n write(\n `${load(output.id)} := ${returned}.${targetTypes.field(required(block.result), output.name)};`,\n depth,\n item.span,\n );\n }\n } else if (program) {\n if (item.value)\n write(\n `${required(this.programResults.get(fn.id))} := ${expression(item.value)};`,\n depth,\n item.span,\n );\n } else if (!method || fn.result)\n write(\n `${name} := ${item.value ? expression(item.value) : \"TRUE\"};`,\n depth,\n item.span,\n );\n if (mutex) release(mutex, depth, item.span);\n write(\"RETURN;\", depth, item.span);\n break;\n case \"break\":\n write(\"EXIT;\", depth, item.span);\n break;\n case \"continue\":\n write(\"CONTINUE;\", depth, item.span);\n break;\n }\n }\n };\n\n if (mutex && acquired) {\n // ARM64 implements __COMPARE_AND_SWAP with load-linked/store-conditional, which can fail\n // even when the word holds the expected value. Retry while the lock reads free.\n write(`${acquired} := FALSE;`, 0);\n write(`WHILE NOT ${acquired} AND ${mutex} = 0 DO`, 0);\n write(`${acquired} := __COMPARE_AND_SWAP(ADR(${mutex}), 0, 1);`, 1);\n write(\"END_WHILE;\", 0);\n write(`IF NOT ${acquired} THEN`, 0);\n if (unavailable) write(`${name} := ${unavailable};`, 1);\n write(\"RETURN;\", 1);\n write(\"END_IF;\", 0);\n }\n body(fn.body, 0);\n if (mutex) release(mutex, 0);\n if (!block && !method && !program && !fn.result) write(`${name} := TRUE;`, 0);\n\n const header = this.routineHeader(fn, name);\n const declaration = [header.declaration];\n mappings.push({ path: `${mappingName}/declaration.st`, line: 1, span: fn.span });\n const section = (keyword: string, items: readonly Variable[]): void => {\n if (!items.length) return;\n declaration.push(keyword);\n for (const item of items) {\n mappings.push({\n path: `${mappingName}/declaration.st`,\n line: declaration.length + 1,\n span: item.span,\n });\n const initial =\n item.initial && !instancedBlock(item.type, typeMap)\n ? targetTypes.declarationInitializer(item.initial, item.type)\n : \"\";\n declaration.push(` ${load(item.id)} : ${targetTypes.name(item.type)}${initial};`);\n }\n declaration.push(\"END_VAR\");\n };\n\n section(\n \"VAR_INPUT\",\n inputs.filter((item) => item.mode !== \"inOut\"),\n );\n section(\n \"VAR_IN_OUT\",\n inputs.filter((item) => item.mode === \"inOut\"),\n );\n if (program && \"parameters\" in fn && fn.result) {\n declaration.push(\n \"VAR_OUTPUT\",\n ` ${required(this.programResults.get(fn.id))} : ${targetTypes.name(fn.result)};`,\n \"END_VAR\",\n );\n }\n if (block) {\n if (block.runtime?.kind === \"mailbox\")\n declaration.push(\n \"VAR\",\n ` ${required(this.mailboxLocks.get(block.id))} : __XWORD;`,\n \"END_VAR\",\n );\n section(\"VAR_OUTPUT\", block.outputs);\n section(\n \"VAR\",\n block.state.filter((item) => !layout.retainedVariables.has(item.id)),\n );\n section(\n \"VAR RETAIN\",\n block.state.filter((item) => layout.retainedVariables.has(item.id)),\n );\n }\n if (declarations.length) {\n declaration.push(block || program ? \"VAR_TEMP\" : \"VAR\");\n declarationSpans.forEach((span, index) => {\n mappings.push({\n path: `${mappingName}/declaration.st`,\n line: declaration.length + index + 1,\n span,\n });\n });\n declaration.push(...declarations, \"END_VAR\");\n }\n\n objects.push({\n id: fn.id,\n kind: header.kind,\n name,\n declaration: `${declaration.join(\"\\n\")}\\n`,\n implementation: `${lines.join(\"\\n\")}\\n`,\n });\n }\n\n private emitProgram(program: CodesysPlan[\"core\"][\"programs\"][number]): void {\n const { core, options } = this.plan;\n const { names, functionNames, objects } = this;\n // Each wrapper snapshots physical inputs before the authored scan and commits\n // outputs afterwards. RETURN in an authored routine cannot skip that epilogue.\n const explicit =\n options.programNames && Object.hasOwn(options.programNames, program.name)\n ? options.programNames[program.name]\n : undefined;\n const name = explicit ?? names.allocateObject(\"PRG\", program.name);\n const fn = required(core.functions.find((item) => item.id === program.entry));\n const used = accessedStorage(fn, core);\n const channels = this.channels.filter((channel) => used.has(channel.root));\n const stateful = this.programRoutines.has(program.entry);\n const call = `${functionNames.get(program.entry)}();`;\n const lines = [\n ...channels\n .filter((channel) => channel.input)\n .map(({ target, wire, inverted }) => `${target} := ${inverted ? \"NOT \" : \"\"}${wire};`),\n stateful ? call : `plc_discard := ${call}`,\n ...channels\n .filter((channel) => !channel.input)\n .map(({ target, wire }) => `${wire} := ${target};`),\n ];\n objects.push({\n id: program.id,\n kind: \"program\",\n name,\n declaration: stateful\n ? `PROGRAM ${name}\\n`\n : `PROGRAM ${name}\\nVAR\\n plc_discard : BOOL;\\nEND_VAR\\n`,\n implementation: `${lines.join(\"\\n\")}\\n`,\n });\n }\n}\n",
|
|
8
|
+
"import type {\n Constant,\n CoreExpression,\n CoreFunction,\n CoreFunctionBlock,\n CorePath,\n CoreStatement,\n EmitResult,\n GeneratedObject,\n SourceSpan,\n Variable,\n} from \"@tsplc/compiler/ir\";\nimport { defaultValue, instancedBlock, standardBlocks } from \"@tsplc/compiler/ir\";\nimport { planGlobalNames } from \"./global-names.ts\";\nimport { Names } from \"./names.ts\";\nimport { NumericLowering } from \"./numeric.ts\";\nimport { type CodesysPlan, diagnostic, isCodesysPlan } from \"./plan.ts\";\nimport { accessedStorage } from \"./task-access.ts\";\nimport { emitHttp, httpMethods, httpCertificateVerifier, opcuaServiceCapacity } from \"./http.ts\";\nimport type { Publication } from \"@tsplc/config\";\n\nexport interface SourceMapping {\n path: string;\n line: number;\n span: SourceSpan;\n}\n\n// All symbol relationships were checked by normalization and planning. Failure\n// here is an emitter invariant violation, rather than a recoverable source error.\nfunction required<T>(value: T | undefined): T {\n if (value === undefined) throw new Error(\"Missing verified CODESYS symbol.\");\n return value;\n}\n\ntype CodesysBundle = EmitResult & {\n /** Variables a generated device tree maps to their bit or byte channels. */\n ioMappings: readonly { key: string; address: string; variable: string }[];\n mappings: readonly SourceMapping[];\n ioSymbols: Readonly<Record<string, string>>;\n publication: Publication;\n};\n\nexport function emitCodesys(plan: CodesysPlan): CodesysBundle {\n if (!isCodesysPlan(plan)) {\n return {\n artifacts: [],\n objects: [],\n mappings: [],\n ioSymbols: {},\n publication: { production: [], development: [] },\n ioMappings: [],\n diagnostics: [diagnostic(\"Emission requires a validated CODESYS plan.\")],\n };\n }\n return new CodesysEmitter(plan).emit();\n}\n\n// A bundle owns target names and source mappings. Per-routine declarations and\n// implementation lines stay local to emitRoutine, so they cannot leak between POUs.\nclass CodesysEmitter {\n private readonly names;\n private networkName: string | undefined;\n private readonly rpcChannels: {\n path: string;\n request: string;\n requestId: string;\n reply: string;\n replyId: string;\n epoch: string;\n }[] = [];\n private readonly references = new Map<string, string>();\n /** Each `io` binding: an AT wire copied to or from its logical target around the scan. */\n private readonly channels: {\n key: string;\n root: string;\n input: boolean;\n target: string;\n wire: string;\n inverted?: boolean;\n }[] = [];\n private readonly ioMappings: { key: string; address: string; variable: string }[] = [];\n private readonly objects: GeneratedObject[] = [];\n private readonly mappings: SourceMapping[] = [];\n private readonly mailboxLocks = new Map<string, string>();\n private readonly blockFields = new Map<string, Map<string, string>>();\n private readonly typeMap;\n private readonly blocks;\n private readonly blockNames;\n private readonly functionNames = new Map<string, string>();\n private readonly programRoutines = new Set<string>();\n private readonly programResults = new Map<string, string>();\n private readonly routineScopes = new Map<\n string,\n { names: Names; references: Map<string, string> }\n >();\n private readonly targetTypes;\n private readonly numeric: NumericLowering;\n private readonly globals;\n private readonly retainedVariables;\n\n constructor(private readonly plan: CodesysPlan) {\n const { core, options } = plan;\n const persistent = new Set(\n core.variables.filter((item) => item.storage !== \"constant\").map((item) => item.id),\n );\n for (const fn of core.functions) {\n if (!fn.owner && [...accessedStorage(fn, core)].some((id) => persistent.has(id)))\n this.programRoutines.add(fn.id);\n }\n const { names, typeMap, blockNames, targetTypes, globals, retainedVariables } = planGlobalNames(\n core,\n options.programNames,\n );\n this.names = names;\n this.typeMap = typeMap;\n this.blockNames = blockNames;\n this.targetTypes = targetTypes;\n this.globals = globals;\n this.retainedVariables = retainedVariables;\n this.blocks = new Map(core.blocks.map((block) => [block.id, block]));\n this.numeric = new NumericLowering(this.typeMap, (label) => this.names.allocate(label));\n this.objects.push(...this.targetTypes.objects);\n }\n\n emit(): CodesysBundle {\n this.emitGlobals();\n this.emitIo();\n if (Object.values(this.plan.http).some((endpoint) => endpoint.transport !== \"opcua\")) {\n this.networkName = this.names.allocateObject(\"GVL\", \"TsplcNetwork\");\n this.objects.push({\n id: \"runtime:httpNetwork\",\n kind: \"globalList\",\n name: this.networkName,\n // Blocks in other global lists take this in their initializers, so it must initialize first.\n declaration: `{attribute 'qualified_only'}\n{attribute 'global_init_slot' := '40000'}\nVAR_GLOBAL\nnetwork:NBS.AsyncProperty := (usiTaskPrio:=15,udiTaskInterval:=1000,tnTaskName:='tsPLC HTTP');\nEND_VAR\n`,\n });\n }\n\n // Helpers must be discovered before allocating local names: an ST local must\n // never shadow a helper, function, FB, or DUT that the implementation calls.\n const { core } = this.plan;\n const entries = new Set(core.programs.map((program) => program.entry));\n for (const fn of core.functions.filter((fn) => !fn.owner)) {\n const program = this.programRoutines.has(fn.id);\n const label = program && entries.has(fn.id) ? `${fn.name}_body` : fn.name;\n this.functionNames.set(fn.id, this.names.allocateObject(program ? \"PRG\" : \"F\", label));\n }\n for (const fn of core.functions) this.prepareStatements(fn.body);\n for (const block of core.blocks) this.prepareStatements(block.body);\n this.objects.push(...this.numeric.objects);\n this.allocateBlockFields();\n\n const routines = [...core.functions, ...core.blocks.filter((block) => !block.standard)];\n for (const fn of routines) this.allocateRoutineScope(fn);\n for (const fn of routines) this.emitRoutine(fn);\n for (const program of core.programs) this.emitProgram(program);\n\n const { objects, mappings } = this;\n const paths = new Map<string, string>();\n for (const object of objects) {\n const path = this.objectPath(object);\n paths.set(object.id, path);\n object.sourcePath =\n object.implementation === undefined ? `${path}.st` : `${path}/declaration.st`;\n }\n const artifacts = objects.flatMap((object) => {\n const path = paths.get(object.id)!;\n return object.implementation === undefined\n ? [{ path: `${path}.st`, content: object.declaration }]\n : [\n { path: `${path}/declaration.st`, content: object.declaration },\n { path: `${path}/implementation.st`, content: object.implementation },\n ];\n });\n for (const mapping of mappings) {\n const object = objects.find((object) => {\n const key = object.kind === \"method\" ? object.id : object.name;\n return mapping.path === `${key}.st` || mapping.path.startsWith(`${key}/`);\n });\n if (object) {\n const key = object.kind === \"method\" ? object.id : object.name;\n mapping.path = paths.get(object.id)! + mapping.path.slice(key.length);\n }\n }\n const ioSymbols = Object.fromEntries([\n ...this.channels.map((channel) => [channel.key, channel.target]),\n ...this.ioMappings.map((mapping) => [mapping.key, mapping.variable]),\n ]);\n const { ioMappings } = this;\n const logicalIo = this.plan.core.variables\n .filter((variable) => variable.storage === \"input\" || variable.storage === \"output\")\n .map((variable) => variable.id);\n const rpcSymbols = [\n ...new Set(\n this.rpcChannels.flatMap((channel) =>\n [channel.request, channel.requestId, channel.reply, channel.replyId, channel.epoch].map(\n (path) => path.replace(/\\[\\d+\\]$/, \"\"),\n ),\n ),\n ),\n ];\n const published = (ids: readonly string[]) =>\n [...ids, ...logicalIo].map((id) => required(this.references.get(id))).concat(rpcSymbols);\n const publication = {\n production: published(this.plan.publication.production),\n development: published(this.plan.publication.development),\n };\n const exposures = Object.fromEntries(\n core.variables\n .filter((variable) => variable.exposure)\n .map((variable) => {\n const record = this.typeMap.get(variable.type);\n if (record?.kind !== \"record\") throw new Error(\"Invalid exposure record.\");\n const root = required(this.references.get(variable.id));\n const fields = Object.fromEntries(\n record.fields\n .filter((field) => field.name !== \"contractVersion\")\n .map((field) => {\n const type = this.typeMap.get(field.type);\n const kind =\n type?.kind === \"bool\" ? \"boolean\" : type?.kind === \"string\" ? \"string\" : \"number\";\n return [\n field.name,\n { path: `${root}.${this.targetTypes.field(record.id, field.name)}`, kind },\n ];\n }),\n );\n return [\n variable.exposure!.name,\n {\n version: variable.exposure!.version,\n versionPath: `${root}.${this.targetTypes.field(record.id, \"contractVersion\")}`,\n telemetry: fields,\n },\n ];\n }),\n );\n artifacts.push(\n { path: \"exposures.json\", content: JSON.stringify(exposures, null, 2) + \"\\n\" },\n {\n path: \"machines.ts\",\n content: `// Generated explicit read-only machine interfaces. Do not edit.\\nexport const machines=${JSON.stringify(exposures, null, 2)} as const;\\nexport const serviceChannels=${JSON.stringify(this.rpcChannels, null, 2)} as const;\\n`,\n },\n );\n return { artifacts, objects, mappings, ioSymbols, ioMappings, publication, diagnostics: [] };\n }\n\n private objectPath(object: GeneratedObject): string {\n const { core } = this.plan;\n if (object.kind === \"method\" && object.parent) {\n const parent = required(this.objects.find((candidate) => candidate.id === object.parent));\n return `${this.objectPath(parent)}/methods/${object.name}`;\n }\n if (object.kind === \"method\") {\n const method = required(core.functions.find((fn) => fn.id === object.id));\n const owner = required(this.objects.find((item) => item.id === method.owner?.block));\n return `${this.objectPath(owner)}/methods/${object.name}`;\n }\n let source = object.id.split(\":\")[0] ?? \"\";\n const program = core.programs.find((item) => item.id === object.id);\n if (program) source = program.entry.split(\":\")[0] ?? \"\";\n const group = this.globals.find((item) => item.id === object.id);\n if (group) {\n // Variable IDs are relative to tsconfig, unlike their diagnostic spans.\n source = group.variables[0]?.id.split(\":\")[0] ?? \"\";\n }\n if (\n /^[\\w./ -]+\\.tsx?$/.test(source) &&\n !source.split(/[\\\\/]/).includes(\"..\") &&\n !source.startsWith(\"/\")\n ) {\n const segments = source.replaceAll(\"\\\\\", \"/\").split(\"/\").slice(0, -1);\n if (segments[0] === \"src\") segments.shift();\n // A DUT directory can also contain sibling input/output layouts. Keep\n // that directory for every DUT, or its primary type would block the folder.\n if (object.kind !== \"dataType\" && segments.at(-1) === object.name) segments.pop();\n return [...segments, object.name].join(\"/\");\n }\n return `${object.kind === \"dataType\" ? \"Types\" : object.id === \"io\" ? \"IO\" : \"_Generated\"}/${object.name}`;\n }\n\n private emitGlobals(): void {\n const { options } = this.plan;\n const { globals, references, mappings, targetTypes, typeMap, objects } = this;\n for (const group of globals) {\n const { name, fields } = group;\n const published = new Set(this.plan.publication[options.buildTarget]);\n const publish = group.variables.some((variable) => published.has(variable.id));\n const lines = [\n ...(publish ? [\"{attribute 'linkalways'}\"] : []),\n \"{attribute 'qualified_only'}\",\n group.storage === \"constants\"\n ? \"VAR_GLOBAL CONSTANT\"\n : group.storage === \"retained\"\n ? \"VAR_GLOBAL RETAIN\"\n : \"VAR_GLOBAL\",\n ];\n for (const item of group.variables) {\n const field = required(fields.get(item.id));\n references.set(item.id, `${name}.${field}`);\n if (published.has(item.id))\n lines.push(` {attribute 'symbol' := '${item.exposure ? \"read\" : \"readwrite\"}'}`);\n mappings.push({ path: `${name}.st`, line: lines.length + 1, span: item.span });\n let initial = \"\";\n if (!instancedBlock(item.type, typeMap)) {\n const value = item.initial ?? defaultValue(item.type, typeMap);\n // CONSTANT declarations always keep their initializer. Mutable zero\n // aggregates use the same implicit initialization as the original ST.\n initial =\n group.storage === \"constants\"\n ? ` := ${targetTypes.literal(value, item.type)}`\n : targetTypes.declarationInitializer(value, item.type);\n }\n lines.push(` ${field} : ${targetTypes.name(item.type)}${initial};`);\n }\n lines.push(\"END_VAR\");\n objects.push({\n id: group.id,\n kind: \"globalList\",\n name,\n declaration: `${lines.join(\"\\n\")}\\n`,\n });\n }\n }\n\n private emitIo(): void {\n const { core, options } = this.plan;\n const { names, references, channels, ioMappings, mappings, targetTypes, typeMap, objects } =\n this;\n const ioName = names.allocate(\"GVL_IO\");\n const ioFields = new Names();\n for (const name of this.blockNames.values()) ioFields.reserve(name);\n const ioLines = [\"{attribute 'linkalways'}\", \"{attribute 'qualified_only'}\", \"VAR_GLOBAL\"];\n for (const item of core.variables.filter(\n (item) => item.storage === \"input\" || item.storage === \"output\",\n )) {\n const field = ioFields.allocate(item.name);\n const initial = item.initial ?? defaultValue(item.type, typeMap);\n const binding = required(options.io[item.name]);\n references.set(item.id, `${ioName}.${field}`);\n if (binding.mapped) {\n ioMappings.push({\n key: item.name,\n address: binding.address,\n variable: `${ioName}.${field}`,\n });\n mappings.push({ path: `${ioName}.st`, line: ioLines.length + 2, span: item.span });\n ioLines.push(\n \" {attribute 'symbol' := 'read'}\",\n ` ${field} : ${targetTypes.name(item.type)} := ${targetTypes.literal(initial, item.type)};`,\n );\n continue;\n }\n const wire = ioFields.allocate(`${item.name}_physical`);\n channels.push({\n key: item.name,\n root: item.id,\n input: item.storage === \"input\",\n target: `${ioName}.${field}`,\n wire: `${ioName}.${wire}`,\n inverted: binding.inverted,\n });\n mappings.push(\n { path: `${ioName}.st`, line: ioLines.length + 1, span: item.span },\n { path: `${ioName}.st`, line: ioLines.length + 3, span: item.span },\n );\n ioLines.push(\n ` ${wire} AT ${binding.address} : ${targetTypes.name(item.type)};`,\n // Publish the scan's logical value for monitoring. Physical wires stay\n // private; external writes cannot alter the controller's IO snapshot.\n \" {attribute 'symbol' := 'read'}\",\n ` ${field} : ${targetTypes.name(item.type)} := ${targetTypes.literal(initial, item.type)};`,\n );\n }\n for (const { key, root, segments, type } of this.plan.storageBindings) {\n const { address, mapped, inverted } = required(options.io[key]);\n const target = segments.reduce(\n (path, segment) =>\n segment.kind === \"field\"\n ? `${path}.${targetTypes.field(segment.record, segment.name)}`\n : `${path}[${segment.value}]`,\n required(references.get(root.id)),\n );\n if (mapped) {\n ioMappings.push({ key, address, variable: target });\n continue;\n }\n const wire = ioFields.allocate(`${key.replace(/\\W+/g, \"_\").replace(/_+$/, \"\")}_physical`);\n // The wire takes the target's own type, so equal-width EDS types need no conversion.\n ioLines.push(` ${wire} AT ${address} : ${targetTypes.name(type.id)};`);\n channels.push({\n key,\n root: root.id,\n input: address[1] === \"I\",\n target,\n wire: `${ioName}.${wire}`,\n inverted,\n });\n }\n ioLines.push(\"END_VAR\");\n // Mapped storage bindings need no IO list; mapped logical IO is declared here.\n if (ioLines.length > 4)\n objects.push({\n id: \"io\",\n kind: \"globalList\",\n name: ioName,\n declaration: `${ioLines.join(\"\\n\")}\\n`,\n });\n }\n\n private prepareStatements(items: readonly CoreStatement[]): void {\n const { numeric } = this;\n for (const item of items) {\n if (item.kind === \"assign\") {\n numeric.prepare(item.value);\n item.path?.forEach((segment) => {\n if (segment.kind === \"index\") numeric.prepare(segment.value);\n });\n }\n if (item.kind === \"if\") {\n numeric.prepare(item.condition);\n this.prepareStatements(item.then);\n this.prepareStatements(item.else);\n }\n if (item.kind === \"switch\") {\n numeric.prepare(item.value);\n for (const branch of item.cases) this.prepareStatements(branch.body);\n this.prepareStatements(item.fallback);\n }\n if (item.kind === \"for\") {\n if (item.dynamic) {\n numeric.prepare(item.dynamic.start);\n numeric.prepare(item.dynamic.limit);\n }\n this.prepareStatements(item.body);\n }\n if (item.kind === \"return\" && item.value) numeric.prepare(item.value);\n if (item.kind === \"invoke\") {\n if (item.index) numeric.prepare(item.index);\n for (const value of item.arguments) numeric.prepare(value);\n }\n if (item.kind === \"blockUpdate\") {\n if (item.index) numeric.prepare(item.index);\n for (const value of Object.values(item.inputs)) numeric.prepare(value);\n }\n }\n }\n\n private allocateBlockFields(): void {\n const { core } = this.plan;\n const { objects, functionNames, blockNames, blockFields } = this;\n for (const block of core.blocks) {\n const fields = new Names(),\n mapped = new Map<string, string>();\n for (const object of objects) fields.reserve(object.name);\n for (const objectName of [\n ...core.functions.filter((fn) => !fn.owner).map((fn) => required(functionNames.get(fn.id))),\n ...blockNames.values(),\n ])\n fields.reserve(objectName);\n for (const method of core.functions.filter((fn) => fn.owner?.block === block.id))\n functionNames.set(method.id, fields.allocate(method.name));\n const native = block.standard && standardBlocks[block.standard];\n for (const item of [...block.inputs, ...block.outputs, ...block.state])\n mapped.set(\n item.id,\n native\n ? required(\n [...native.inputs, ...native.outputs].find(([name]) => name === item.name),\n )[1]\n : fields.allocate(item.name, true),\n );\n if (block.runtime?.kind === \"mailbox\")\n this.mailboxLocks.set(block.id, fields.allocate(\"plc_mailbox_lock\"));\n blockFields.set(block.id, mapped);\n }\n }\n\n private allocateRoutineScope(fn: CoreFunction | CoreFunctionBlock): void {\n const block = \"inputs\" in fn ? fn : undefined;\n const owner =\n block ?? (\"owner\" in fn && fn.owner ? this.blocks.get(fn.owner.block) : undefined);\n const names = new Names(),\n references = new Map<string, string>();\n for (const object of this.objects) names.reserve(object.name);\n for (const name of [...this.functionNames.values(), ...this.blockNames.values()])\n names.reserve(name);\n if (this.programRoutines.has(fn.id) && \"parameters\" in fn && fn.result)\n this.programResults.set(fn.id, names.allocate(\"plc_result\"));\n if (owner) {\n for (const item of [...owner.outputs, ...owner.state]) {\n const name = required(required(this.blockFields.get(owner.id)).get(item.id));\n names.reserve(name);\n references.set(item.id, name);\n }\n }\n for (const item of \"parameters\" in fn ? fn.parameters : fn.inputs) {\n const name = block\n ? required(required(this.blockFields.get(block.id)).get(item.id))\n : names.allocate(item.name);\n names.reserve(name);\n references.set(item.id, name);\n }\n for (const item of fn.locals) references.set(item.id, names.allocate(item.name));\n this.routineScopes.set(fn.id, { names, references });\n }\n\n private routineHeader(\n fn: CoreFunction | CoreFunctionBlock,\n name: string,\n ): { kind: GeneratedObject[\"kind\"]; declaration: string } {\n if (\"inputs\" in fn) return { kind: \"functionBlock\", declaration: `FUNCTION_BLOCK ${name}` };\n if (fn.owner)\n return {\n kind: \"method\",\n declaration: `METHOD ${fn.owner.access.toUpperCase()} ${name}${fn.result ? ` : ${this.targetTypes.name(fn.result)}` : \"\"}`,\n };\n if (this.programRoutines.has(fn.id)) return { kind: \"program\", declaration: `PROGRAM ${name}` };\n return {\n kind: \"function\",\n declaration: `FUNCTION ${name} : ${fn.result ? this.targetTypes.name(fn.result) : \"BOOL\"}`,\n };\n }\n\n private emitRoutine(fn: CoreFunction | CoreFunctionBlock): void {\n const { core } = this.plan;\n if (\"inputs\" in fn && (fn.runtime?.kind === \"http\" || fn.runtime?.kind === \"rpc\")) {\n const endpoint = required(this.plan.http[fn.id]);\n const rpcGlobal =\n endpoint.transport === \"opcua\"\n ? this.names.allocateObject(\"GVL\", \"TsplcRpc_\" + required(this.blockNames.get(fn.id)))\n : undefined;\n if (rpcGlobal) {\n this.objects.push({\n id: fn.id + \":rpc\",\n kind: \"globalList\",\n name: rpcGlobal,\n declaration: `{attribute 'qualified_only'}\nVAR_GLOBAL\n {attribute 'symbol' := 'read'} requests:ARRAY[1..${opcuaServiceCapacity}] OF STRING(2048);\n {attribute 'symbol' := 'read'} requestIds:ARRAY[1..${opcuaServiceCapacity}] OF STRING(64);\n {attribute 'symbol' := 'readwrite'} replyIds:ARRAY[1..${opcuaServiceCapacity}] OF STRING(64);\n {attribute 'symbol' := 'readwrite'} replies:ARRAY[1..${opcuaServiceCapacity}] OF STRING(2048);\n {attribute 'symbol' := 'readwrite'} epochs:ARRAY[1..${opcuaServiceCapacity}] OF STRING(32);\n inUse:ARRAY[1..${opcuaServiceCapacity}] OF __XWORD;\n sequence:ARRAY[1..${opcuaServiceCapacity}] OF UDINT;\nEND_VAR`,\n });\n for (let slot = 1; slot <= opcuaServiceCapacity; slot++)\n this.rpcChannels.push({\n path: endpoint.path,\n request: `${rpcGlobal}.requests[${slot}]`,\n reply: `${rpcGlobal}.replies[${slot}]`,\n requestId: `${rpcGlobal}.requestIds[${slot}]`,\n replyId: `${rpcGlobal}.replyIds[${slot}]`,\n epoch: `${rpcGlobal}.epochs[${slot}]`,\n });\n }\n const generated = emitHttp(\n fn,\n required(this.blockNames.get(fn.id)),\n required(this.blockFields.get(fn.id)),\n this.typeMap,\n this.targetTypes,\n endpoint,\n this.networkName ? `${this.networkName}.network` : \"\",\n rpcGlobal,\n );\n this.objects.push(\n generated,\n ...httpMethods(generated.id, endpoint.transport),\n ...httpCertificateVerifier(generated.id, generated.name, required(this.plan.http[fn.id])),\n );\n return;\n }\n const {\n blockNames,\n functionNames,\n references,\n objects,\n mappings,\n targetTypes,\n typeMap,\n blocks,\n blockFields,\n numeric,\n retainedVariables,\n } = this;\n const block = \"inputs\" in fn ? fn : undefined;\n const method = \"owner\" in fn ? fn.owner : undefined;\n const program = this.programRoutines.has(fn.id);\n const owner = method ? required(blocks.get(method.block)) : block;\n const name = block ? required(blockNames.get(block.id)) : required(functionNames.get(fn.id));\n const inputs = \"parameters\" in fn ? fn.parameters : fn.inputs;\n const state = owner ? [...owner.outputs, ...owner.state] : [];\n const mappingName = method ? fn.id : name;\n const routineScope = required(this.routineScopes.get(fn.id));\n const scope = new Map([...references, ...routineScope.references]),\n locals = routineScope.names;\n const declarations = fn.locals.map(\n (item) => ` ${required(scope.get(item.id))} : ${targetTypes.name(item.type)};`,\n );\n const declarationSpans = fn.locals.map((item) => item.span);\n const mutex =\n method && owner?.runtime?.kind === \"mailbox\"\n ? required(this.mailboxLocks.get(owner.id))\n : undefined;\n const acquired = mutex ? locals.allocate(\"plc_acquired\") : undefined;\n const unavailable = mutex && fn.result ? locals.allocate(\"plc_unavailable\") : undefined;\n if (acquired) {\n declarations.push(` ${acquired} : BOOL;`);\n declarationSpans.push(fn.span);\n }\n if (unavailable && fn.result) {\n declarations.push(\n ` ${unavailable} : ${targetTypes.name(fn.result)} := ${targetTypes.literal(defaultValue(fn.result, typeMap), fn.result)};`,\n );\n declarationSpans.push(fn.span);\n }\n // Count target lines as they are appended; diagnostics use these exact offsets.\n const lines: string[] = [];\n const write = (line: string, depth: number, source?: SourceSpan): void => {\n lines.push(\" \".repeat(depth) + line);\n if (source)\n mappings.push({\n path: `${mappingName}/implementation.st`,\n line: lines.length,\n span: source,\n });\n };\n\n // Only the holder releases, so a failed swap is spurious (see the acquire above); retry it.\n const release = (lock: string, depth: number, source?: SourceSpan) => {\n write(`WHILE NOT __COMPARE_AND_SWAP(ADR(${lock}), 1, 0) DO`, depth, source);\n write(\";\", depth + 1);\n write(\"END_WHILE;\", depth);\n };\n\n const load = (id: string): string => {\n const value = scope.get(id);\n if (!value) throw new Error(`Missing verified storage ${id}.`);\n return value;\n };\n const scopeTypes = new Map(\n [...core.variables, ...inputs, ...state, ...fn.locals].map((variable) => [\n variable.id,\n variable.type,\n ]),\n );\n\n // Block output records are a source abstraction; target FB fields are direct.\n const place = (id: string, path: CorePath = []): string => {\n let text = load(id),\n typeId = required(scopeTypes.get(id));\n let outputBlock: string | undefined;\n for (const segment of path) {\n const type = required(typeMap.get(typeId));\n if (segment.kind === \"field\" && type.kind === \"block\" && segment.name === \"out\") {\n outputBlock = type.block;\n typeId = required(type.output);\n continue;\n }\n if (segment.kind === \"field\" && outputBlock) {\n const output = required(\n required(blocks.get(outputBlock)).outputs.find((field) => field.name === segment.name),\n );\n text += `.${required(required(blockFields.get(outputBlock)).get(output.id))}`;\n typeId = output.type;\n outputBlock = undefined;\n } else if (segment.kind === \"field\" && type.kind === \"record\") {\n text += `.${targetTypes.field(typeId, segment.name)}`;\n typeId = required(type.fields.find((field) => field.name === segment.name)).type;\n } else if (segment.kind === \"index\" && type.kind === \"array\") {\n // A strict enum converts explicitly to its DINT base, as HTTP JSON encoding does.\n text +=\n typeMap.get(segment.value.type)?.kind === \"enum\"\n ? `[TO_DINT(${expression(segment.value)})]`\n : `[${expression(segment.value)}]`;\n typeId = type.element;\n } else throw new Error(\"Invalid verified place\");\n }\n return text;\n };\n\n const expression = (value: CoreExpression): string => {\n if (value.kind === \"constant\") return targetTypes.literal(value.value, value.type);\n if (value.kind === \"load\") return place(value.root, value.path);\n if (value.kind === \"borrow\") return place(value.place.root, value.place.path);\n if (value.kind === \"convert\" && typeMap.get(value.type)?.kind === \"string\")\n return expression(value.operand);\n if (value.kind === \"unary\" || value.kind === \"convert\")\n return numeric.render(value, [expression(value.operand)]);\n return numeric.render(value, [expression(value.left), expression(value.right)]);\n };\n\n // Aggregate constants are expanded into legal leaf assignments for ST.\n const assignConstant = (\n destination: string,\n value: Constant,\n id: string,\n depth: number,\n span: SourceSpan,\n ): void => {\n const type = required(typeMap.get(id));\n if (type.kind === \"record\" && value.kind === \"record\")\n type.fields.forEach((field) => {\n assignConstant(\n `${destination}.${targetTypes.field(id, field.name)}`,\n required(value.fields[field.name]),\n field.type,\n depth,\n span,\n );\n });\n else if (type.kind === \"array\" && value.kind === \"array\")\n value.items.forEach((item, index) => {\n assignConstant(\n `${destination}[${type.lowerBound + index}]`,\n item,\n type.element,\n depth,\n span,\n );\n });\n else write(`${destination} := ${targetTypes.literal(value, id)};`, depth, span);\n };\n\n const body = (items: readonly CoreStatement[], depth: number): void => {\n for (const item of items) {\n switch (item.kind) {\n case \"assign\":\n if (item.value.kind === \"constant\")\n assignConstant(\n place(item.root, item.path),\n item.value.value,\n item.value.type,\n depth,\n item.span,\n );\n else\n write(\n `${place(item.root, item.path)} := ${expression(item.value)};`,\n depth,\n item.span,\n );\n break;\n case \"blockUpdate\": {\n const instance = instancedBlock(required(scopeTypes.get(item.instance)), typeMap);\n if (!instance) throw new Error(\"Invalid verified block receiver\");\n const target = required(blocks.get(instance.block));\n const arguments_ = Object.entries(item.inputs).map(([input, value]) => {\n const formal = required(target.inputs.find((field) => field.name === input));\n return `${required(required(blockFields.get(target.id)).get(formal.id))} := ${expression(value)}`;\n });\n const receiver = item.index\n ? `${load(item.instance)}[${expression(item.index)}]`\n : load(item.instance);\n write(`${receiver}(${arguments_.join(\", \")});`, depth, item.span);\n break;\n }\n case \"invoke\": {\n const receiver = item.instance\n ? `${load(item.instance)}${item.index ? `[${expression(item.index)}]` : \"\"}.`\n : \"\";\n const called = required(core.functions.find((fn) => fn.id === item.function));\n const programCall = this.programRoutines.has(called.id);\n const arguments_ = item.arguments.map((value, index) => {\n if (\n !called.owner &&\n !programCall &&\n !called.parameters.some((parameter) => parameter.mode === \"inOut\")\n )\n return expression(value);\n const parameter = required(called.parameters[index]);\n const formal = required(\n required(this.routineScopes.get(called.id)).references.get(parameter.id),\n );\n return `${formal} := ${expression(value)}`;\n });\n const call = `${receiver}${required(functionNames.get(item.function))}(${arguments_.join(\", \")})`;\n if (programCall) {\n write(`${call};`, depth, item.span);\n if (item.destination)\n write(\n `${load(item.destination)} := ${required(functionNames.get(called.id))}.${required(this.programResults.get(called.id))};`,\n depth,\n item.span,\n );\n break;\n }\n write(\n item.destination ? `${load(item.destination)} := ${call};` : `${call};`,\n depth,\n item.span,\n );\n break;\n }\n case \"if\":\n write(`IF ${expression(item.condition)} THEN`, depth, item.span);\n body(item.then, depth + 1);\n if (item.else.length) {\n write(\"ELSE\", depth, item.span);\n body(item.else, depth + 1);\n }\n write(\"END_IF;\", depth, item.span);\n break;\n case \"switch\": {\n for (const [index, branch] of item.cases.entries()) {\n const conditions = branch.values.map(\n (value) =>\n `(${expression(item.value)} = ${targetTypes.literal(value, item.value.type)})`,\n );\n write(`${index ? \"ELSIF\" : \"IF\"} ${conditions.join(\" OR \")} THEN`, depth, item.span);\n body(branch.body, depth + 1);\n }\n if (item.cases.length) {\n if (item.fallback.length) write(\"ELSE\", depth, item.span);\n body(item.fallback, depth + 1);\n write(\"END_IF;\", depth, item.span);\n } else body(item.fallback, depth);\n break;\n }\n case \"for\": {\n // Iterate with a DINT ordinal rather than overflowing the authored\n // counter at a width boundary. Reconstruct its typed value each scan.\n const counterType = scopeTypes.get(item.counter);\n if (!counterType || item.start.kind !== \"integer\")\n throw new Error(\"Invalid verified loop\");\n if (!item.maxIterations) {\n if (item.counterScope === \"existing\")\n write(\n `${load(item.counter)} := ${item.dynamic ? expression(item.dynamic.start) : targetTypes.literal(item.start, counterType)};`,\n depth,\n item.span,\n );\n break;\n }\n const ordinal = locals.allocate(\"iteration\");\n declarations.push(` ${ordinal} : DINT;`);\n declarationSpans.push(item.span);\n const wide = counterType === \"ULINT\" ? \"ULINT\" : \"LINT\";\n const ascending = BigInt(item.step) > 0n;\n const step = BigInt(item.step) < 0n ? -BigInt(item.step) : BigInt(item.step);\n let iterations = `DINT#${item.maxIterations}`;\n let first = `${wide}#${item.start.value}`;\n if (item.dynamic) {\n first = `TO_${wide}(${expression(item.dynamic.start)})`;\n const last = `TO_${wide}(${expression(item.dynamic.limit)})`;\n const count = locals.allocate(\"iterationCount\");\n declarations.push(` ${count} : DINT;`);\n declarationSpans.push(item.span);\n const comparison = ascending ? \"<\" : \">\";\n const inclusive = item.dynamic.exclusive ? \"\" : \"=\";\n const distance = ascending ? `${last} - ${first}` : `${first} - ${last}`;\n const exclusive = item.dynamic.exclusive ? ` - ${wide}#1` : \"\";\n write(`${count} := DINT#0;`, depth, item.span);\n write(`IF ${first} ${comparison}${inclusive} ${last} THEN`, depth, item.span);\n write(\n `${count} := ${wide}_TO_DINT(((${distance}${exclusive}) / ${wide}#${step}) + ${wide}#1);`,\n depth + 1,\n item.span,\n );\n write(\"END_IF;\", depth, item.span);\n iterations = count;\n }\n write(\n `FOR ${ordinal} := DINT#0 TO ${item.dynamic ? `${iterations} - DINT#1` : `DINT#${item.maxIterations - 1}`} DO`,\n depth,\n item.span,\n );\n const counterValue = `${load(item.counter)} := TO_${counterType}(${first} ${ascending ? \"+\" : \"-\"} (${wide}#${step} * DINT_TO_${wide}(${ordinal})));`;\n write(counterValue, depth + 1, item.span);\n body(item.body, depth + 1);\n write(\"END_FOR;\", depth, item.span);\n // CODESYS keeps the ordinal at EXIT and advances it on normal\n // completion/CONTINUE. Reconstructing here preserves that distinction.\n if (item.counterScope === \"existing\") write(counterValue, depth, item.span);\n break;\n }\n case \"return\":\n if (block) {\n if (item.value) {\n const returned = expression(item.value);\n for (const output of block.outputs)\n write(\n `${load(output.id)} := ${returned}.${targetTypes.field(required(block.result), output.name)};`,\n depth,\n item.span,\n );\n }\n } else if (program) {\n if (item.value)\n write(\n `${required(this.programResults.get(fn.id))} := ${expression(item.value)};`,\n depth,\n item.span,\n );\n } else if (!method || fn.result)\n write(\n `${name} := ${item.value ? expression(item.value) : \"TRUE\"};`,\n depth,\n item.span,\n );\n if (mutex) release(mutex, depth, item.span);\n write(\"RETURN;\", depth, item.span);\n break;\n case \"break\":\n write(\"EXIT;\", depth, item.span);\n break;\n case \"continue\":\n write(\"CONTINUE;\", depth, item.span);\n break;\n }\n }\n };\n\n if (mutex && acquired) {\n // ARM64 implements __COMPARE_AND_SWAP with load-linked/store-conditional, which can fail\n // even when the word holds the expected value. Retry while the lock reads free.\n write(`${acquired} := FALSE;`, 0);\n write(`WHILE NOT ${acquired} AND ${mutex} = 0 DO`, 0);\n write(`${acquired} := __COMPARE_AND_SWAP(ADR(${mutex}), 0, 1);`, 1);\n write(\"END_WHILE;\", 0);\n write(`IF NOT ${acquired} THEN`, 0);\n if (unavailable) write(`${name} := ${unavailable};`, 1);\n write(\"RETURN;\", 1);\n write(\"END_IF;\", 0);\n }\n body(fn.body, 0);\n if (mutex) release(mutex, 0);\n if (!block && !method && !program && !fn.result) write(`${name} := TRUE;`, 0);\n\n const header = this.routineHeader(fn, name);\n const declaration = [header.declaration];\n mappings.push({ path: `${mappingName}/declaration.st`, line: 1, span: fn.span });\n const section = (keyword: string, items: readonly Variable[]): void => {\n if (!items.length) return;\n declaration.push(keyword);\n for (const item of items) {\n mappings.push({\n path: `${mappingName}/declaration.st`,\n line: declaration.length + 1,\n span: item.span,\n });\n const initial =\n item.initial && !instancedBlock(item.type, typeMap)\n ? targetTypes.declarationInitializer(item.initial, item.type)\n : \"\";\n declaration.push(` ${load(item.id)} : ${targetTypes.name(item.type)}${initial};`);\n }\n declaration.push(\"END_VAR\");\n };\n\n section(\n \"VAR_INPUT\",\n inputs.filter((item) => item.mode !== \"inOut\"),\n );\n section(\n \"VAR_IN_OUT\",\n inputs.filter((item) => item.mode === \"inOut\"),\n );\n if (program && \"parameters\" in fn && fn.result) {\n declaration.push(\n \"VAR_OUTPUT\",\n ` ${required(this.programResults.get(fn.id))} : ${targetTypes.name(fn.result)};`,\n \"END_VAR\",\n );\n }\n if (block) {\n if (block.runtime?.kind === \"mailbox\")\n declaration.push(\n \"VAR\",\n ` ${required(this.mailboxLocks.get(block.id))} : __XWORD;`,\n \"END_VAR\",\n );\n section(\"VAR_OUTPUT\", block.outputs);\n section(\n \"VAR\",\n block.state.filter((item) => !retainedVariables.has(item.id)),\n );\n section(\n \"VAR RETAIN\",\n block.state.filter((item) => retainedVariables.has(item.id)),\n );\n }\n if (declarations.length) {\n declaration.push(block || program ? \"VAR_TEMP\" : \"VAR\");\n declarationSpans.forEach((span, index) => {\n mappings.push({\n path: `${mappingName}/declaration.st`,\n line: declaration.length + index + 1,\n span,\n });\n });\n declaration.push(...declarations, \"END_VAR\");\n }\n\n objects.push({\n id: fn.id,\n kind: header.kind,\n name,\n declaration: `${declaration.join(\"\\n\")}\\n`,\n implementation: `${lines.join(\"\\n\")}\\n`,\n });\n }\n\n private emitProgram(program: CodesysPlan[\"core\"][\"programs\"][number]): void {\n const { core, options } = this.plan;\n const { names, functionNames, objects } = this;\n // Each wrapper snapshots physical inputs before the authored scan and commits\n // outputs afterwards. RETURN in an authored routine cannot skip that epilogue.\n const explicit =\n options.programNames && Object.hasOwn(options.programNames, program.name)\n ? options.programNames[program.name]\n : undefined;\n const name = explicit ?? names.allocateObject(\"PRG\", program.name);\n const fn = required(core.functions.find((item) => item.id === program.entry));\n const used = accessedStorage(fn, core);\n const channels = this.channels.filter((channel) => used.has(channel.root));\n const stateful = this.programRoutines.has(program.entry);\n const call = `${functionNames.get(program.entry)}();`;\n const lines = [\n ...channels\n .filter((channel) => channel.input)\n .map(({ target, wire, inverted }) => `${target} := ${inverted ? \"NOT \" : \"\"}${wire};`),\n stateful ? call : `plc_discard := ${call}`,\n ...channels\n .filter((channel) => !channel.input)\n .map(({ target, wire }) => `${wire} := ${target};`),\n ];\n objects.push({\n id: program.id,\n kind: \"program\",\n name,\n declaration: stateful\n ? `PROGRAM ${name}\\n`\n : `PROGRAM ${name}\\nVAR\\n plc_discard : BOOL;\\nEND_VAR\\n`,\n implementation: `${lines.join(\"\\n\")}\\n`,\n });\n }\n}\n",
|
|
9
|
+
"import { standardBlocks, type VerifiedCoreModule } from \"@tsplc/compiler/ir\";\nimport { Names, pascalCase } from \"./names.ts\";\nimport { storageLayout } from \"./storage.ts\";\nimport { CodesysTypes } from \"./types.ts\";\n\nexport const planGlobalNames = (\n core: VerifiedCoreModule,\n programNames: Readonly<Record<string, string>> = {},\n) => {\n const names = new Names();\n for (const name of Object.values(programNames)) names.reserve(name);\n\n const typeMap = new Map(core.types.map((type) => [type.id, type]));\n const blockNames = new Map(\n core.blocks.map((block) => [\n block.id,\n block.standard\n ? standardBlocks[block.standard].native\n : names.allocateObject(\"FB\", block.name),\n ]),\n );\n for (const name of blockNames.values()) names.reserve(name);\n const targetTypes = new CodesysTypes(typeMap, names, blockNames);\n\n const { globalLists, retainedVariables } = storageLayout(core);\n const hasExports = (group: (typeof globalLists)[number]) =>\n group.variables.some((variable) => variable.exported && !variable.exposure);\n const globals = globalLists.map((group) => {\n const splitByStorage = globalLists.some(\n (other) =>\n other.module === group.module && other.storage !== group.storage && hasExports(other),\n );\n // Exported lists are the program's public interface. Private storage stays generated.\n const name = hasExports(group)\n ? names.allocate(\n pascalCase(splitByStorage ? `${group.module}-${group.storage}` : group.module),\n )\n : names.allocateObject(\"GVL\", `${group.module}_${group.storage}`);\n const fields = new Names();\n for (const name of blockNames.values()) fields.reserve(name);\n return {\n ...group,\n name,\n fields: new Map(group.variables.map((item) => [item.id, fields.allocate(item.name)])),\n };\n });\n\n return { names, typeMap, blockNames, targetTypes, globals, retainedVariables };\n};\n",
|
|
10
|
+
"import { basename } from \"node:path\";\nimport { instancedBlock, type Variable, type VerifiedCoreModule } from \"@tsplc/compiler/ir\";\n\ninterface GlobalList {\n id: string;\n module: string;\n storage: \"constants\" | \"retained\" | \"state\";\n variables: Variable[];\n}\n\n/** The source module that owns a module-level variable: its file name without extension. */\nexport const moduleName = (variable: Variable): string =>\n basename(variable.span.file).replace(/\\.[^.]+$/, \"\");\n\n/** CODESYS promotes an enclosing instance when private child state is retained. */\nexport function storageLayout(core: VerifiedCoreModule) {\n const types = new Map(core.types.map((type) => [type.id, type]));\n const blocks = new Map(core.blocks.map((block) => [block.id, block]));\n const retention = new Map<string, boolean>();\n const blockRetained = (id: string): boolean => {\n const cached = retention.get(id);\n if (cached !== undefined) return cached;\n const block = blocks.get(id);\n if (!block) throw new Error(\"Missing verified block during retention planning.\");\n const retained = block.state.some((field) => {\n const type = instancedBlock(field.type, types);\n return field.retain || (type !== undefined && blockRetained(type.block));\n });\n retention.set(id, retained);\n return retained;\n };\n\n const retainedBlocks = new Set(\n core.blocks.filter((block) => blockRetained(block.id)).map((block) => block.id),\n );\n const retainedVariables = new Set(\n [...core.variables, ...core.blocks.flatMap((block) => block.state)]\n .filter((variable) => {\n const type = instancedBlock(variable.type, types);\n return variable.retain || (type !== undefined && retainedBlocks.has(type.block));\n })\n .map((variable) => variable.id),\n );\n\n const groups = new Map<string, GlobalList>();\n for (const variable of core.variables) {\n if (variable.storage === \"input\" || variable.storage === \"output\") continue;\n const storage =\n variable.storage === \"constant\"\n ? \"constants\"\n : retainedVariables.has(variable.id)\n ? \"retained\"\n : \"state\";\n const id = `${variable.span.file}:${storage}`;\n let group = groups.get(id);\n if (!group) {\n group = { id, module: moduleName(variable), storage, variables: [] };\n groups.set(id, group);\n }\n group.variables.push(variable);\n }\n return { retainedBlocks, retainedVariables, globalLists: [...groups.values()] };\n}\n",
|
|
11
|
+
"import { instancedBlock } from \"@tsplc/compiler/ir\";\nimport type { Constant, GeneratedObject, PlcType } from \"@tsplc/compiler/ir\";\nimport { Names } from \"./names.ts\";\nimport { scalarLiteral } from \"./numeric.ts\";\n\nexport class CodesysTypes {\n readonly objects: GeneratedObject[] = [];\n private readonly names = new Map<string, string>();\n private readonly fields = new Map<string, Map<string, string>>();\n\n constructor(\n private readonly types: ReadonlyMap<string, PlcType>,\n names: Names,\n blockNames: ReadonlyMap<string, string>,\n ) {\n // Register every type and member name before following layout dependencies.\n for (const type of types.values()) {\n if (type.kind === \"block\") {\n const name = blockNames.get(type.block);\n if (!name) throw new Error(\"Missing verified block name\");\n this.names.set(type.id, name);\n }\n if ([\"record\", \"array\", \"enum\", \"string\"].includes(type.kind)) {\n const label = type.id.split(\":\").at(-1)!;\n if (type.kind === \"record\" || type.kind === \"enum\") {\n const prefix = type.kind === \"record\" ? \"ST\" : \"E\";\n this.names.set(type.id, names.allocateObject(prefix, label));\n } else this.names.set(type.id, names.allocate(`T_${label}`));\n }\n if (type.kind === \"record\" || type.kind === \"enum\") {\n const names = new Names(),\n fields = new Map<string, string>();\n for (const member of type.kind === \"record\" ? type.fields : type.members) {\n fields.set(member.name, names.allocate(member.name, true));\n }\n this.fields.set(type.id, fields);\n }\n }\n\n // A block array is declared in place: a function block cannot be a data type's element.\n for (const type of types.values())\n if (type.kind === \"array\" && instancedBlock(type.id, types))\n this.names.set(\n type.id,\n `ARRAY[${type.lowerBound}..${type.lowerBound + type.length - 1}] OF ${this.name(type.element)}`,\n );\n\n // Verified layouts are acyclic. Emit child DUTs first, then their containing DUT.\n const emitted = new Set<string>();\n const emit = (type: PlcType): void => {\n if (instancedBlock(type.id, types) || !this.names.has(type.id) || emitted.has(type.id))\n return;\n if (type.kind === \"array\") emit(this.type(type.element));\n if (type.kind === \"record\") {\n for (const field of type.fields) emit(this.type(field.type));\n }\n emitted.add(type.id);\n const name = this.name(type.id);\n let declaration: string;\n if (type.kind === \"record\") {\n const fields = type.fields\n .map((field) => ` ${this.field(type.id, field.name)} : ${this.name(field.type)};`)\n .join(\"\\n\");\n declaration = `TYPE ${name} :\nSTRUCT\n${fields}\nEND_STRUCT\nEND_TYPE\n`;\n } else if (type.kind === \"array\") {\n declaration = `TYPE ${name} : ARRAY[${type.lowerBound}..${type.lowerBound + type.length - 1}] OF ${this.name(type.element)};\nEND_TYPE\n`;\n } else if (type.kind === \"string\") {\n declaration = `TYPE ${name} : ${type.encoding === \"utf8\" ? \"STRING\" : \"WSTRING\"}(${type.capacity});\nEND_TYPE\n`;\n } else if (type.kind === \"enum\") {\n const members = type.members\n .map((member) => ` ${this.field(type.id, member.name)} := ${member.value}`)\n .join(\",\\n\");\n declaration = `{attribute 'qualified_only'}\n{attribute 'strict'}\nTYPE ${name} : (\n${members}\n) DINT;\nEND_TYPE\n`;\n } else throw new Error(\"Unsupported verified data type\");\n this.objects.push({ id: type.id, kind: \"dataType\", name, declaration });\n };\n for (const type of types.values()) emit(type);\n }\n\n private type(id: string): PlcType {\n const type = this.types.get(id);\n if (!type) throw new Error(\"Missing verified type\");\n return type;\n }\n\n name(id: string): string {\n return this.names.get(id) ?? id;\n }\n\n field(id: string, name: string): string {\n const field = this.fields.get(id)?.get(name);\n if (!field) throw new Error(\"Missing verified field\");\n return field;\n }\n\n declarationInitializer(value: Constant, id: string): string {\n const type = this.type(id);\n // Our DUT fields have no custom initializers. CODESYS initializes their\n // numbers/BOOL/strings to zero/false/empty, including nested arrays/records.\n // Keep explicit nonzero enum members and signed floating zero: omission must\n // not change the initial value selected by PLC semantics.\n if ((type.kind === \"record\" || type.kind === \"array\") && this.isZero(value)) return \"\";\n return ` := ${this.literal(value, id)}`;\n }\n\n private isZero(value: Constant): boolean {\n if (value.kind === \"bool\") return !value.value;\n if (value.kind === \"integer\") return value.value === \"0\";\n if (value.kind === \"float\") return Object.is(value.value, 0);\n if (value.kind === \"string\") return value.value === \"\";\n if (value.kind === \"array\") return value.items.every((item) => this.isZero(item));\n if (value.kind === \"record\")\n return Object.values(value.fields).every((item) => this.isZero(item));\n // Time/calendar values remain explicit without relying on target defaults.\n return false;\n }\n\n literal(value: Constant, id: string): string {\n const type = this.type(id);\n if (type.kind === \"enum\" && value.kind === \"integer\") {\n const member = type.members.find((member) => member.value === value.value);\n if (!member) throw new Error(\"Missing verified enum member\");\n return `${this.name(id)}.${this.field(id, member.name)}`;\n }\n if (type.kind === \"string\" && value.kind === \"string\") {\n const wide = type.encoding === \"utf16\",\n quote = wide ? '\"' : \"'\";\n let text = \"\";\n for (const char of value.value) {\n const code = char.charCodeAt(0);\n if (char === \"$\") text += \"$$\";\n else if (char === quote) text += `$${char}`;\n else if (code < 32 || code === 127)\n text += `$${code\n .toString(16)\n .toUpperCase()\n .padStart(wide ? 4 : 2, \"0\")}`;\n else text += char;\n }\n return `${quote}${text}${quote}`;\n }\n if (type.kind === \"array\" && value.kind === \"array\") {\n return `[${value.items.map((item) => this.literal(item, type.element)).join(\", \")}]`;\n }\n if (type.kind === \"record\" && value.kind === \"record\") {\n const fields = type.fields.map((field) => {\n const initial = value.fields[field.name];\n if (!initial) throw new Error(\"Missing verified record initializer\");\n return `${this.field(id, field.name)} := ${this.literal(initial, field.type)}`;\n });\n return `(${fields.join(\", \")})`;\n }\n if (type.kind === \"duration\" && value.kind === \"duration\") {\n return `T#${BigInt(value.nanoseconds) / 1_000_000n}ms`;\n }\n if (type.kind === \"calendar\" && value.kind === \"calendar\") {\n if (type.domain === \"date\") return `D#${value.value}`;\n if (type.domain === \"timeOfDay\") return `TOD#${value.value}`;\n return `DT#${value.value.replace(\"T\", \"-\")}`;\n }\n return scalarLiteral(value, id);\n }\n}\n",
|
|
9
12
|
"import {\n type Constant,\n type CoreExpression,\n type GeneratedObject,\n integerRange,\n floatMaximum,\n integerType,\n type PlcType,\n} from \"@tsplc/compiler/ir\";\n\nexport function scalarLiteral(value: Constant, type: string): string {\n if (value.kind === \"bool\") return value.value ? \"TRUE\" : \"FALSE\";\n if (value.kind === \"integer\") return `${type}#${value.value}`;\n if (value.kind === \"float\") {\n // String(-0) loses the IEEE sign; keep it explicit in target float literals.\n const text = Object.is(value.value, -0) ? \"-0.0\" : String(value.value).replace(/e/i, \"E\");\n return `${type}#${text}`;\n }\n throw new Error(\"Expected verified scalar constant\");\n}\n\nexport class NumericLowering {\n readonly objects: GeneratedObject[] = [];\n private readonly helpers = new Map<string, string>();\n\n constructor(\n private readonly types: ReadonlyMap<string, PlcType>,\n private readonly allocate: (label: string) => string,\n ) {}\n\n prepare(value: CoreExpression): void {\n if (value.kind === \"load\") {\n value.path?.forEach((segment) => {\n if (segment.kind === \"index\") this.prepare(segment.value);\n });\n }\n if (value.kind === \"borrow\") {\n value.place.path.forEach((segment) => {\n if (segment.kind === \"index\") this.prepare(segment.value);\n });\n }\n if (value.kind === \"binary\") {\n this.prepare(value.left);\n this.prepare(value.right);\n if (value.policy) this.arithmetic(value.type, value.operator, value.policy);\n }\n if (value.kind === \"unary\") this.prepare(value.operand);\n if (value.kind === \"convert\") {\n this.prepare(value.operand);\n if (value.policy === \"saturate\") this.saturation(value.operand.type, value.type);\n }\n }\n\n render(value: CoreExpression, operands: readonly string[]): string {\n if (value.kind === \"convert\") {\n return value.policy === \"saturate\"\n ? `${this.saturation(value.operand.type, value.type)}(${operands[0]})`\n : `TO_${value.type}(${operands[0]})`;\n }\n if (value.kind === \"unary\") {\n // Avoid signed intermediate casts: TIME spans the complete UDINT range.\n if (value.operator === \"timeToMilliseconds\") return `TIME_TO_UDINT(${operands[0]})`;\n // Milliseconds since the runtime started; DINT wraps after 24.8 days, so subtract to compare.\n if (value.operator === \"clock\") return \"TO_DINT(TIME_TO_UDINT(TIME()))\";\n return value.operator === \"not\"\n ? `(NOT ${operands[0]})`\n : `TO_${value.type}(${value.operator === \"negate\" ? \"-\" : \"NOT \"}${operands[0]})`;\n }\n if (value.kind !== \"binary\") throw new Error(\"Expected numeric operation\");\n if (value.policy) {\n return `${this.arithmetic(value.type, value.operator, value.policy)}(${operands.join(\", \")})`;\n }\n if (value.operator === \"shiftLeft\" || value.operator === \"shiftRight\") {\n const shift = value.operator === \"shiftLeft\" ? \"SHL\" : \"SHR\";\n return `TO_${value.type}(${shift}(${operands.join(\", \")}))`;\n }\n const tokens: Readonly<Record<string, string>> = {\n add: \"+\",\n subtract: \"-\",\n multiply: \"*\",\n divide: \"/\",\n remainder: \"MOD\",\n equal: \"=\",\n notEqual: \"<>\",\n less: \"<\",\n lessEqual: \"<=\",\n greater: \">\",\n greaterEqual: \">=\",\n bitAnd: \"AND\",\n bitOr: \"OR\",\n bitXor: \"XOR\",\n };\n const token = tokens[value.operator];\n if (!token) throw new Error(\"Boolean short-circuit operation was not normalized\");\n const text =\n value.operator === \"remainder\"\n ? `(${operands[0]} - (${operands[0]} / ${operands[1]}) * ${operands[1]})`\n : `(${operands[0]} ${token} ${operands[1]})`;\n return value.type === \"BOOL\" ? text : `TO_${value.type}(${text})`;\n }\n\n private helper(\n key: string,\n type: string,\n inputs: readonly [string, string][],\n body: (name: string) => string,\n locals = \"\",\n ): string {\n const existing = this.helpers.get(key);\n if (existing) return existing;\n const name = this.allocate(`numeric_${key}`);\n this.helpers.set(key, name);\n const parameters = inputs\n .map(([input, inputType]) => ` ${input} : ${inputType};`)\n .join(\"\\n\");\n const variables = locals\n ? `VAR\n${locals}\nEND_VAR\n`\n : \"\";\n const declaration = `FUNCTION ${name} : ${type}\nVAR_INPUT\n${parameters}\nEND_VAR\n${variables}`;\n this.objects.push({\n id: `numeric:${key}`,\n kind: \"function\",\n name,\n declaration,\n implementation: body(name),\n });\n return name;\n }\n\n private add64(): string {\n // XOR forms the sum bits; each carry moves left until it exits the 64-bit word.\n // This gives modulo 2^64 addition without relying on target integer overflow.\n return this.helper(\n \"add64\",\n \"LWORD\",\n [\n [\"a\", \"LWORD\"],\n [\"b\", \"LWORD\"],\n ],\n (name) => `x := a;\ny := b;\nFOR i := 1 TO 64 DO\n carry := SHL(x AND y, 1);\n x := x XOR y;\n y := carry;\nEND_FOR;\n${name} := x;\n`,\n ` x, y, carry : LWORD;\n i : UINT;`,\n );\n }\n\n private wrap64(operator: string): string {\n const add = this.add64();\n if (operator === \"add\") return add;\n if (operator === \"subtract\") {\n // Two's complement negation and addition use the same modulo word operation.\n return this.helper(\n \"subtract64\",\n \"LWORD\",\n [\n [\"a\", \"LWORD\"],\n [\"b\", \"LWORD\"],\n ],\n (name) => `${name} := ${add}(a, ${add}(NOT b, LWORD#1));\n`,\n );\n }\n if (operator !== \"multiply\") throw new Error(\"Unsupported verified wrapping operation\");\n // Shift-and-add retains exactly the low 64 product bits.\n return this.helper(\n \"multiply64\",\n \"LWORD\",\n [\n [\"a\", \"LWORD\"],\n [\"b\", \"LWORD\"],\n ],\n (name) => `x := a;\ny := b;\nresult := LWORD#0;\nFOR i := 1 TO 64 DO\n IF (y AND LWORD#1) <> LWORD#0 THEN\n result := ${add}(result, x);\n END_IF;\n x := SHL(x, 1);\n y := SHR(y, 1);\nEND_FOR;\n${name} := result;\n`,\n ` x, y, result : LWORD;\n i : UINT;`,\n );\n }\n\n private arithmetic(typeId: string, operator: string, policy: \"wrap\" | \"saturate\"): string {\n const type = this.types.get(typeId);\n if (type?.kind !== \"integer\") throw new Error(\"Expected verified integer arithmetic\");\n const token = operator === \"add\" ? \"+\" : operator === \"subtract\" ? \"-\" : \"*\";\n const key = `${policy}_${operator}_${typeId}`;\n if (policy === \"wrap\") {\n if (type.bits === 64) {\n const operation = this.wrap64(operator);\n return this.helper(\n key,\n typeId,\n [\n [\"a\", typeId],\n [\"b\", typeId],\n ],\n (\n name,\n ) => `${name} := LWORD_TO_${typeId}(${operation}(${typeId}_TO_LWORD(a), ${typeId}_TO_LWORD(b)));\n`,\n );\n }\n const wide = !type.signed && operator !== \"subtract\" ? \"ULINT\" : \"LINT\";\n return this.helper(\n key,\n typeId,\n [\n [\"a\", typeId],\n [\"b\", typeId],\n ],\n (\n name,\n ) => `${name} := ${wide}_TO_${typeId}(${typeId}_TO_${wide}(a) ${token} ${typeId}_TO_${wide}(b));\n`,\n );\n }\n\n const [minimum, maximum] = integerRange(type);\n const min = `${typeId}#${minimum}`,\n max = `${typeId}#${maximum}`,\n zero = `${typeId}#0`;\n return this.helper(\n key,\n typeId,\n [\n [\"a\", typeId],\n [\"b\", typeId],\n ],\n (name) => {\n const clamp = (\n condition: string,\n endpoint: string,\n depth = \"\",\n ) => `${depth}IF ${condition} THEN\n${depth} ${name} := ${endpoint};\n${depth} RETURN;\n${depth}END_IF;\n`;\n let body: string;\n if (!type.signed) {\n // Unsigned subtraction has only underflow; the other operations have only overflow.\n if (operator === \"add\") body = clamp(`a > ${max} - b`, max);\n else if (operator === \"subtract\") body = clamp(\"a < b\", zero);\n else\n body = `IF b <> ${zero} THEN\n${clamp(`a > ${max} / b`, max, \" \")}END_IF;\n`;\n } else if (operator === \"add\") {\n body = `IF b > ${zero} THEN\n${clamp(`a > ${max} - b`, max, \" \")}ELSIF b < ${zero} THEN\n${clamp(`a < ${min} - b`, min, \" \")}END_IF;\n`;\n } else if (operator === \"subtract\") {\n body = `IF b < ${zero} THEN\n${clamp(`a > ${max} + b`, max, \" \")}ELSIF b > ${zero} THEN\n${clamp(`a < ${min} + b`, min, \" \")}END_IF;\n`;\n } else {\n // Handle zero first, then divide the endpoint before multiplying. Each sign\n // quadrant tests representability without forming an overflowing product.\n body =\n clamp(`a = ${zero}`, zero) +\n clamp(`b = ${zero}`, zero) +\n `IF a > ${zero} THEN\n IF b > ${zero} THEN\n${clamp(`a > ${max} / b`, max, \" \")} ELSE\n${clamp(`b < ${min} / a`, min, \" \")} END_IF;\nELSE\n IF b > ${zero} THEN\n${clamp(`a < ${min} / b`, min, \" \")} ELSE\n${clamp(`a < ${max} / b`, max, \" \")} END_IF;\nEND_IF;\n`;\n }\n return `${body}${name} := a ${token} b;\n`;\n },\n );\n }\n\n private saturation(sourceId: string, targetId: string): string {\n const source = this.types.get(sourceId),\n target = this.types.get(targetId);\n if (source?.kind === \"float\" && target?.kind === \"float\") {\n // Widening cannot exceed the destination's finite range. Identity\n // conversions are removed by normalization; neither needs a helper.\n if (source.bits <= target.bits) return `TO_${targetId}`;\n const maximum = floatMaximum(target);\n const literal = (value: number, type: string): string =>\n scalarLiteral({ kind: \"float\", value }, type);\n return this.helper(\n `saturate_${sourceId}_${targetId}`,\n targetId,\n [[\"value\", sourceId]],\n (name) => `IF value < ${literal(-maximum, sourceId)} THEN\n ${name} := ${literal(-maximum, targetId)};\n RETURN;\nEND_IF;\nIF value > ${literal(maximum, sourceId)} THEN\n ${name} := ${literal(maximum, targetId)};\n RETURN;\nEND_IF;\n${name} := TO_${targetId}(value);\n`,\n );\n }\n if (!source || !target || !integerType(source) || !integerType(target)) {\n throw new Error(\"Expected verified integer saturation\");\n }\n const [fromMin, fromMax] = integerRange(source),\n [toMin, toMax] = integerRange(target);\n return this.helper(\n `saturate_${sourceId}_${targetId}`,\n targetId,\n [[\"value\", sourceId]],\n (name) => {\n let body = \"\";\n if (fromMin < toMin)\n body += `IF value < ${sourceId}#${toMin} THEN\n ${name} := ${targetId}#${toMin};\n RETURN;\nEND_IF;\n`;\n if (fromMax > toMax)\n body += `IF value > ${sourceId}#${toMax} THEN\n ${name} := ${targetId}#${toMax};\n RETURN;\nEND_IF;\n`;\n return `${body}${name} := TO_${targetId}(value);\n`;\n },\n );\n }\n}\n",
|
|
10
|
-
"import {\n instancedBlock,\n type Constant,\n type CoreExpression,\n type CorePath,\n type CoreStatement,\n type Deployment,\n type Diagnostic,\n isVerifiedCore,\n type PlcType,\n type SourceSpan,\n type VerifiedCoreModule,\n} from \"@tsplc/compiler/ir\";\nimport { type CodesysOptions, optionsSchema } from \"./config.ts\";\nimport { ioLayout } from \"@tsplc/typegen/hardware\";\nimport { iecSpelling, isStoragePath, resolveStoragePath, type StorageBinding } from \"./io-paths.ts\";\nimport { isIecIdentifier } from \"./names.ts\";\nimport { storageLayout } from \"./storage.ts\";\nimport { validateHttpLayout, resolveHttpEndpoint, type HttpEndpoint } from \"./http.ts\";\nimport { accessedStorage } from \"./task-access.ts\";\nimport { resolvePublication } from \"./publication.ts\";\nimport type { Publication } from \"@tsplc/config\";\n\n// Only this planner can admit a target configuration for emission. Cloning a\n// branded-looking object does not give it membership in this private identity set.\nconst planned: unique symbol = Symbol(\"CODESYS plan\");\nexport interface CodesysPlan {\n readonly [planned]: true;\n readonly core: VerifiedCoreModule;\n readonly deployment: Deployment;\n readonly options: CodesysOptions;\n /** `io` keys that name authored storage, resolved against the verified types. */\n readonly storageBindings: readonly StorageBinding[];\n readonly publication: Publication;\n readonly http: Readonly<Record<string, HttpEndpoint>>;\n}\nconst plans = new WeakSet<object>();\nexport function diagnostic(message: string, span?: SourceSpan): Diagnostic {\n return { origin: \"backend\", code: \"PLC7001\", severity: \"error\", message, ...(span && { span }) };\n}\nexport function isCodesysPlan(plan: CodesysPlan): boolean {\n return plans.has(plan);\n}\n\nexport function planCodesys(\n core: VerifiedCoreModule,\n deployment: Deployment,\n value: unknown,\n): { plan?: CodesysPlan; diagnostics: readonly Diagnostic[] } {\n if (!isVerifiedCore(core))\n return { diagnostics: [diagnostic(\"CODESYS requires a verified, normalized core module.\")] };\n\n const parsed = optionsSchema.safeParse(value);\n if (!parsed.success)\n return {\n diagnostics: parsed.error.issues.map((issue) =>\n diagnostic(`${issue.path.join(\".\")}: ${issue.message}`),\n ),\n };\n\n const backgroundTasks = new Map<string, Deployment[\"tasks\"][number]>();\n for (const program of core.programs) {\n if (!program.background) continue;\n const { priority, intervalNanoseconds } = program.background;\n const name = `TsplcBackground_${priority}_${BigInt(intervalNanoseconds) / 1000000n}`;\n const existing = backgroundTasks.get(name);\n backgroundTasks.set(name, {\n name,\n priority,\n intervalNanoseconds,\n programs: [...(existing?.programs ?? []), program.name],\n });\n }\n deployment = { tasks: [...deployment.tasks, ...backgroundTasks.values()] };\n const options = parsed.data;\n const diagnostics: Diagnostic[] = [];\n const report = (message: string, span?: SourceSpan): void => {\n diagnostics.push(diagnostic(message, span));\n };\n const callerTasks = deployment.tasks;\n for (const continuation of core.programs.filter((program) => program.continuation)) {\n const scope = continuation.continuation!;\n const root = core.variables.find(\n (variable) => variable.name === scope.instance && variable.span.file === scope.file,\n );\n if (!root) {\n report(`Missing continuation owner ${scope.instance}.`);\n continue;\n }\n const owners = callerTasks.filter((task) =>\n task.programs.some((name) => {\n const program = core.programs.find((program) => program.name === name);\n if (!program || program.background) return false;\n const fn = core.functions.find((fn) => fn.id === program.entry);\n return fn && accessedStorage(fn, core).has(root.id);\n }),\n );\n if (owners.length !== 1) {\n report(\n `Continuation owner ${scope.instance} must belong to exactly one caller task.`,\n root.span,\n );\n continue;\n }\n deployment = {\n tasks: deployment.tasks.map((task) =>\n task.name === owners[0]!.name\n ? { ...task, programs: [...task.programs, continuation.name] }\n : task,\n ),\n };\n }\n const http = new Map<string, HttpEndpoint>();\n for (const block of core.blocks)\n if (block.runtime?.kind === \"http\" || block.runtime?.kind === \"rpc\") {\n try {\n validateHttpLayout(block, new Map(core.types.map((type) => [type.id, type])));\n http.set(\n block.id,\n block.runtime.kind === \"rpc\"\n ? {\n transport: \"opcua\",\n host: \"\",\n port: 0,\n authority: \"\",\n path: block.runtime.path,\n token: \"\",\n timeoutMs: options.http.timeoutMs,\n tls: false,\n }\n : resolveHttpEndpoint(block.runtime.url, options.http),\n );\n } catch (cause) {\n report(cause instanceof Error ? cause.message : String(cause), block.span);\n }\n }\n\n const storageBindings = validateIo(core, options, report);\n validateTasks(core, deployment, report);\n validateStorage(core, options, report);\n validateConstants(core, report);\n const { publication, errors } = resolvePublication(core, options.publish);\n for (const error of errors) report(error);\n\n if (diagnostics.length) return { diagnostics };\n\n const plan: CodesysPlan = Object.freeze({\n core,\n deployment: structuredClone(deployment),\n options: structuredClone(options),\n storageBindings,\n publication,\n http: Object.fromEntries(http),\n [planned]: true as const,\n });\n // Parsed options can contain nested engineering settings; detach and freeze the complete plan.\n const freeze = (value: unknown): void => {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return;\n for (const child of Object.values(value)) freeze(child);\n Object.freeze(value);\n };\n freeze(plan.deployment);\n freeze(plan.options);\n freeze(plan.storageBindings);\n freeze(plan.publication);\n plans.add(plan);\n return { plan, diagnostics: [] };\n}\n\ntype Report = (message: string, span?: SourceSpan) => void;\n\n/** Validate every `io` binding and return the ones that name authored storage. */\nfunction validateIo(\n core: VerifiedCoreModule,\n options: CodesysOptions,\n report: Report,\n): StorageBinding[] {\n // Compare physical bindings as bit intervals, regardless of their spelling.\n // Different widths can still overlap.\n const types = new Map(core.types.map((type) => [type.id, type]));\n const targets: {\n name: string;\n binding: CodesysOptions[\"io\"][string];\n type: PlcType;\n region: \"I\" | \"Q\";\n span?: SourceSpan;\n }[] = [];\n const names = new Set<string>();\n for (const item of core.variables.filter(\n (item) => item.storage === \"input\" || item.storage === \"output\",\n )) {\n if (names.has(item.name))\n report(`Ambiguous I/O name ${item.name}; logical I/O names must be unique.`, item.span);\n names.add(item.name);\n const binding = Object.hasOwn(options.io, item.name) ? options.io[item.name] : undefined;\n if (!binding) {\n report(`Missing I/O binding for ${item.name}.`, item.span);\n continue;\n }\n targets.push({\n name: item.name,\n binding,\n type: types.get(item.type)!,\n region: item.storage === \"input\" ? \"I\" : \"Q\",\n span: item.span,\n });\n }\n\n const scheduled = new Set<string>();\n for (const program of core.programs) {\n const fn = core.functions.find((item) => item.id === program.entry)!;\n for (const id of accessedStorage(fn, core)) scheduled.add(id);\n }\n const storageBindings: StorageBinding[] = [];\n for (const [name, binding] of Object.entries(options.io)) {\n if (names.has(name)) continue;\n if (!isStoragePath(name)) {\n report(`Unknown I/O binding ${name}.`);\n continue;\n }\n const resolved = resolveStoragePath(core, name);\n if (\"error\" in resolved) {\n report(resolved.error);\n continue;\n }\n const overlapping = storageBindings.find((other) => nested(other, resolved));\n if (overlapping) report(`${name} overlaps the binding ${overlapping.key}.`);\n if (!scheduled.has(resolved.root.id))\n report(\n `${name}: no scheduled program uses ${resolved.root.name}, so it would never be copied.`,\n );\n storageBindings.push(resolved);\n targets.push({\n name,\n binding,\n type: resolved.type,\n region: binding.address[1] === \"I\" ? \"I\" : \"Q\",\n });\n }\n\n const addresses: {\n region: string;\n start: bigint;\n end: bigint;\n name: string;\n shared?: boolean;\n }[] = [];\n for (const { name, binding, type, region, span } of targets) {\n // An array binds at its first element; the remaining elements follow at\n // consecutive addresses of the same width, like an EDS byte/word span.\n const array = type.kind === \"array\" ? type : undefined;\n const element = array ? types.get(array.element) : type;\n // Typegen spells channels as IEC types; equal layouts bind (an EDS UINT flag word into a WORD).\n const layout = ioLayout(iecSpelling(type, types) ?? \"\");\n if (binding.type && (!layout || ioLayout(binding.type) !== layout))\n report(`I/O type mismatch for ${name}: ${type.id} cannot bind to ${binding.type}.`, span);\n if (!binding.address.startsWith(`%${region}`))\n report(`Wrong address region for ${name}: expected %${region}X.`, span);\n const match = /^%([IQ])([XBWD])([0-9]+)(?:\\.([0-7]))?$/.exec(binding.address);\n if (!match) continue;\n if (region === \"I\" && element?.kind === \"float\")\n report(\n \"Floating logical inputs require an explicit runtime nonfinite policy, which is not supported yet.\",\n span,\n );\n if (array && element?.kind === \"bool\")\n report(\n `BOOL arrays are not bit-packed in CODESYS I/O; bind each element of ${name} separately.`,\n span,\n );\n const size = match[2] === \"X\" ? 1 : match[2] === \"B\" ? 8 : match[2] === \"W\" ? 16 : 32;\n if (ioBits(element) !== size) report(`Address size does not match ${name}:${type.id}.`, span);\n // CODESYS numbers %IW/%ID by element: %IW12 is bytes 24-25. See verify.py.\n const unit = size === 1 ? 8n : BigInt(size);\n const offset = BigInt(match[3]!);\n const start = offset * unit + BigInt(match[4] ?? 0),\n end = start + BigInt(size) * BigInt(array?.length ?? 1);\n if (binding.inverted && (region !== \"I\" || element?.kind !== \"bool\" || array))\n report(`Only a BOOL input can be inverted: ${name}.`, span);\n if (binding.shared && region !== \"I\") report(`Only an input can be shared: ${name}.`, span);\n const collision = addresses.find(\n (address) =>\n address.region === match[1] &&\n address.start < end &&\n start < address.end &&\n !(binding.shared && address.shared && address.start === start && address.end === end),\n );\n if (collision)\n report(`Overlapping I/O address ${binding.address} with ${collision.name}.`, span);\n addresses.push({ region: match[1]!, start, end, name, shared: binding.shared });\n if (offset > 0x7fff_ffffn) report(`I/O offset is too large: ${binding.address}.`, span);\n }\n return storageBindings;\n}\n\n/** Two storage bindings conflict when one target contains the other. */\nfunction nested(left: StorageBinding, right: StorageBinding): boolean {\n return (\n left.root.id === right.root.id &&\n left.segments.every((a, index) => {\n const b = right.segments[index];\n if (!b) return true;\n return a.kind === \"field\"\n ? b.kind === \"field\" && a.name === b.name\n : b.kind === \"index\" && a.value === b.value;\n })\n );\n}\n\n/** Width of one bound element; BOOL is a single bit, numeric scalars their storage width. */\nfunction ioBits(type: PlcType | undefined): number {\n if (type?.kind === \"bool\") return 1;\n return type && \"bits\" in type ? type.bits : 0;\n}\n\nfunction validateTasks(core: VerifiedCoreModule, deployment: Deployment, report: Report): void {\n // One cyclic task owns each mutable storage root, including transitive calls\n // and borrowed globals. Sharing state within an ordered task remains valid.\n const programs = new Map(core.programs.map((program) => [program.name, program]));\n const assignment = new Map<string, string>();\n const taskNames = new Set<string>();\n const stateOwners = new Map<string, string>();\n const globals = new Map(core.variables.map((item) => [item.id, item]));\n const functions = new Map(core.functions.map((item) => [item.id, item]));\n const blockRuntimes = new Map(\n core.types.flatMap((type) =>\n type.kind === \"block\"\n ? [[type.id, core.blocks.find((block) => block.id === type.block)?.runtime?.kind] as const]\n : [],\n ),\n );\n for (const task of deployment.tasks) {\n if (!isIecIdentifier(task.name)) report(`Invalid task name ${task.name}.`);\n if (taskNames.has(task.name.toUpperCase())) report(`Duplicate task name ${task.name}.`);\n taskNames.add(task.name.toUpperCase());\n if (!Number.isInteger(task.priority) || task.priority < 0 || task.priority > 31)\n report(`Task ${task.name} priority must be 0..31.`);\n if (!/^[1-9][0-9]*$/.test(task.intervalNanoseconds))\n report(`Invalid task interval for ${task.name}.`);\n else {\n const ns = BigInt(task.intervalNanoseconds);\n if (ns % 1_000_000n || ns > 4_294_967_295_000_000n)\n report(`Task ${task.name} requires an exact positive TIME interval in milliseconds.`);\n }\n if (!task.programs.length) report(`Task ${task.name} has no programs.`);\n for (const name of task.programs) {\n const program = programs.get(name);\n if (!program) {\n report(`Unknown task program ${name}.`);\n continue;\n }\n if (assignment.has(name)) report(`Program ${name} must belong to exactly one task.`);\n assignment.set(name, task.name);\n const fn = functions.get(program.entry);\n if (!fn) throw new Error(\"Verified core has a missing entry.\");\n const host =\n program.background &&\n core.variables.find(\n (item) =>\n item.name === program.background?.worker &&\n item.span.file === fn.span.file &&\n blockRuntimes.get(item.type) === \"backgroundHost\",\n );\n for (const id of accessedStorage(fn, core, host ? host.id : undefined)) {\n const item = globals.get(id);\n if (!item || item.storage === \"constant\") continue;\n if (blockRuntimes.get(item.type) === \"mailbox\") continue;\n const ownsWorker =\n program.background?.worker === item.name && item.span.file === fn.span.file;\n if (program.background && (!ownsWorker || item.id === host?.id))\n report(\n `Background task ${program.name} accesses scan-owned storage ${item.name}; pass value snapshots through the mailbox.`,\n item.span,\n );\n const owner = stateOwners.get(id);\n if (owner && owner !== task.name)\n report(\n `Storage ${item.name} is shared across cyclic tasks ${owner} and ${task.name}.`,\n item.span,\n );\n stateOwners.set(id, task.name);\n }\n }\n }\n for (const name of programs.keys())\n if (!assignment.has(name)) report(`Program ${name} has no cyclic task.`);\n}\n\nfunction validateStorage(core: VerifiedCoreModule, options: CodesysOptions, report: Report): void {\n const programs = new Map(core.programs.map((program) => [program.name, program]));\n if (core.blocks.some((block) => block.standard === \"Blinker\")) {\n for (const target of Object.values(options.programNames ?? {})) {\n if (target.toUpperCase() === \"UTIL\")\n report(`IEC object name ${target} shadows the Util library namespace required by Blinker.`);\n }\n }\n const explicitNames = new Set<string>();\n for (const [name, target] of Object.entries(options.programNames ?? {})) {\n if (!programs.has(name)) report(`Unknown program name override ${name}.`);\n if (explicitNames.has(target.toUpperCase())) report(`Duplicate IEC program name ${target}.`);\n explicitNames.add(target.toUpperCase());\n }\n const types = new Map(core.types.map((type) => [type.id, type]));\n const blocks = new Map(core.blocks.map((block) => [block.id, block]));\n\n // InOut addresses must not survive a retained restart, including nested children.\n const blockHasInOut = (id: string): boolean => {\n const block = blocks.get(id)!;\n return (\n block.inputs.some((input) => input.mode === \"inOut\") ||\n block.state.some((field) => {\n const type = instancedBlock(field.type, types);\n return type !== undefined && blockHasInOut(type.block);\n })\n );\n };\n\n const layout = storageLayout(core);\n for (const block of core.blocks)\n if (layout.retainedBlocks.has(block.id) && blockHasInOut(block.id))\n report(\n \"Retained function blocks cannot contain direct or nested InOut references.\",\n block.span,\n );\n for (const variable of core.variables) {\n const type = instancedBlock(variable.type, types);\n if (variable.retain && type && blockHasInOut(type.block))\n report(\n \"Retained function blocks cannot contain direct or nested InOut references.\",\n variable.span,\n );\n }\n}\n\nfunction validateConstants(core: VerifiedCoreModule, report: Report): void {\n const types = new Map(core.types.map((type) => [type.id, type]));\n const constant = (value: Constant, id: string, span?: SourceSpan): void => {\n const type = types.get(id)!;\n if (type.kind === \"string\" && value.kind === \"string\") {\n if (\n type.encoding === \"utf8\" &&\n [...value.value].some(\n (character) => character.charCodeAt(0) === 0 || character.charCodeAt(0) > 127,\n )\n )\n report(\n \"Non-ASCII STRING literals require a verified project-wide UTF8 setting; this profile supports ASCII literals.\",\n span,\n );\n if (type.encoding === \"utf16\" && /[\\uD800-\\uDFFF]/.test(value.value))\n report(\"CODESYS WSTRING uses UCS-2 and cannot represent surrogate code units.\", span);\n }\n if (type.kind === \"array\" && value.kind === \"array\")\n for (const item of value.items) constant(item, type.element, span);\n if (type.kind === \"record\" && value.kind === \"record\")\n for (const field of type.fields) constant(value.fields[field.name]!, field.type, span);\n };\n const constantsInPath = (path: CorePath = []): void => {\n for (const segment of path) if (segment.kind === \"index\") constantsInExpression(segment.value);\n };\n const constantsInExpression = (value: CoreExpression): void => {\n if (value.kind === \"constant\") constant(value.value, value.type, value.span);\n if (value.kind === \"load\") constantsInPath(value.path);\n if (value.kind === \"borrow\") constantsInPath(value.place.path);\n if (value.kind === \"unary\" || value.kind === \"convert\") constantsInExpression(value.operand);\n if (value.kind === \"binary\") {\n constantsInExpression(value.left);\n constantsInExpression(value.right);\n }\n };\n const constantsInBody = (items: readonly CoreStatement[]): void => {\n for (const item of items) {\n if (item.kind === \"assign\") {\n constantsInExpression(item.value);\n constantsInPath(item.path);\n }\n if (item.kind === \"if\") {\n constantsInExpression(item.condition);\n constantsInBody(item.then);\n constantsInBody(item.else);\n }\n if (item.kind === \"switch\") {\n constantsInExpression(item.value);\n item.cases.forEach((branch) => {\n for (const value of branch.values) constant(value, item.value.type, item.span);\n constantsInBody(branch.body);\n });\n constantsInBody(item.fallback);\n }\n if (item.kind === \"for\") constantsInBody(item.body);\n if (item.kind === \"invoke\") {\n if (item.index) constantsInExpression(item.index);\n item.arguments.forEach(constantsInExpression);\n }\n if (item.kind === \"blockUpdate\") {\n if (item.index) constantsInExpression(item.index);\n Object.values(item.inputs).forEach(constantsInExpression);\n }\n if (item.kind === \"return\" && item.value) constantsInExpression(item.value);\n }\n };\n core.variables.forEach((variable) => {\n if (variable.initial) constant(variable.initial, variable.type, variable.span);\n });\n for (const fn of core.functions) constantsInBody(fn.body);\n core.blocks.forEach((block) => {\n [...block.outputs, ...block.state, ...block.locals].forEach((variable) => {\n if (variable.initial) constant(variable.initial, variable.type, variable.span);\n });\n constantsInBody(block.body);\n });\n}\n",
|
|
13
|
+
"import {\n instancedBlock,\n type Constant,\n type CoreExpression,\n type CorePath,\n type CoreStatement,\n type Deployment,\n type Diagnostic,\n isVerifiedCore,\n type PlcType,\n type SourceSpan,\n type VerifiedCoreModule,\n} from \"@tsplc/compiler/ir\";\nimport { type CodesysOptions, optionsSchema } from \"./config.ts\";\nimport { ioLayout } from \"@tsplc/typegen/hardware\";\nimport { iecSpelling, isStoragePath, resolveStoragePath, type StorageBinding } from \"./io-paths.ts\";\nimport { isIecIdentifier } from \"./names.ts\";\nimport { storageLayout } from \"./storage.ts\";\nimport { validateHttpLayout, resolveHttpEndpoint, type HttpEndpoint } from \"./http.ts\";\nimport { accessedStorage, schedulePrograms, taskStorageOwnership } from \"./task-access.ts\";\nimport { resolvePublication } from \"./publication.ts\";\nimport type { Publication } from \"@tsplc/config\";\n\n// Only this planner can admit a target configuration for emission. Cloning a\n// branded-looking object does not give it membership in this private identity set.\nconst planned: unique symbol = Symbol(\"CODESYS plan\");\nexport interface CodesysPlan {\n readonly [planned]: true;\n readonly core: VerifiedCoreModule;\n readonly deployment: Deployment;\n readonly options: CodesysOptions;\n /** `io` keys that name authored storage, resolved against the verified types. */\n readonly storageBindings: readonly StorageBinding[];\n readonly publication: Publication;\n readonly http: Readonly<Record<string, HttpEndpoint>>;\n}\nconst plans = new WeakSet<object>();\nexport function diagnostic(message: string, span?: SourceSpan): Diagnostic {\n return { origin: \"backend\", code: \"PLC7001\", severity: \"error\", message, ...(span && { span }) };\n}\nexport function isCodesysPlan(plan: CodesysPlan): boolean {\n return plans.has(plan);\n}\n\nexport function planCodesys(\n core: VerifiedCoreModule,\n deployment: Deployment,\n value: unknown,\n): { plan?: CodesysPlan; diagnostics: readonly Diagnostic[] } {\n if (!isVerifiedCore(core))\n return { diagnostics: [diagnostic(\"CODESYS requires a verified, normalized core module.\")] };\n\n const parsed = optionsSchema.safeParse(value);\n if (!parsed.success)\n return {\n diagnostics: parsed.error.issues.map((issue) =>\n diagnostic(`${issue.path.join(\".\")}: ${issue.message}`),\n ),\n };\n\n const options = parsed.data;\n const diagnostics: Diagnostic[] = [];\n const report = (message: string, span?: SourceSpan): void => {\n diagnostics.push(diagnostic(message, span));\n };\n deployment = { tasks: schedulePrograms(core, deployment.tasks, report) };\n const http = new Map<string, HttpEndpoint>();\n for (const block of core.blocks)\n if (block.runtime?.kind === \"http\" || block.runtime?.kind === \"rpc\") {\n try {\n validateHttpLayout(block, new Map(core.types.map((type) => [type.id, type])));\n http.set(\n block.id,\n block.runtime.kind === \"rpc\"\n ? {\n transport: \"opcua\",\n host: \"\",\n port: 0,\n authority: \"\",\n path: block.runtime.path,\n token: \"\",\n timeoutMs: options.http.timeoutMs,\n tls: false,\n }\n : resolveHttpEndpoint(block.runtime.url, options.http),\n );\n } catch (cause) {\n report(cause instanceof Error ? cause.message : String(cause), block.span);\n }\n }\n\n const storageBindings = validateIo(core, options, report);\n validateTasks(core, deployment, report);\n validateStorage(core, options, report);\n validateConstants(core, report);\n const { publication, errors } = resolvePublication(core, options.publish);\n for (const error of errors) report(error);\n\n if (diagnostics.length) return { diagnostics };\n\n const plan: CodesysPlan = Object.freeze({\n core,\n deployment: structuredClone(deployment),\n options: structuredClone(options),\n storageBindings,\n publication,\n http: Object.fromEntries(http),\n [planned]: true as const,\n });\n // Parsed options can contain nested engineering settings; detach and freeze the complete plan.\n const freeze = (value: unknown): void => {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return;\n for (const child of Object.values(value)) freeze(child);\n Object.freeze(value);\n };\n freeze(plan.deployment);\n freeze(plan.options);\n freeze(plan.storageBindings);\n freeze(plan.publication);\n plans.add(plan);\n return { plan, diagnostics: [] };\n}\n\ntype Report = (message: string, span?: SourceSpan) => void;\n\n/** Validate every `io` binding and return the ones that name authored storage. */\nfunction validateIo(\n core: VerifiedCoreModule,\n options: CodesysOptions,\n report: Report,\n): StorageBinding[] {\n // Compare physical bindings as bit intervals, regardless of their spelling.\n // Different widths can still overlap.\n const types = new Map(core.types.map((type) => [type.id, type]));\n const targets: {\n name: string;\n binding: CodesysOptions[\"io\"][string];\n type: PlcType;\n region: \"I\" | \"Q\";\n span?: SourceSpan;\n }[] = [];\n const names = new Set<string>();\n for (const item of core.variables.filter(\n (item) => item.storage === \"input\" || item.storage === \"output\",\n )) {\n if (names.has(item.name))\n report(`Ambiguous I/O name ${item.name}; logical I/O names must be unique.`, item.span);\n names.add(item.name);\n const binding = Object.hasOwn(options.io, item.name) ? options.io[item.name] : undefined;\n if (!binding) {\n report(`Missing I/O binding for ${item.name}.`, item.span);\n continue;\n }\n targets.push({\n name: item.name,\n binding,\n type: types.get(item.type)!,\n region: item.storage === \"input\" ? \"I\" : \"Q\",\n span: item.span,\n });\n }\n\n const scheduled = new Set<string>();\n for (const program of core.programs) {\n const fn = core.functions.find((item) => item.id === program.entry)!;\n for (const id of accessedStorage(fn, core)) scheduled.add(id);\n }\n const storageBindings: StorageBinding[] = [];\n for (const [name, binding] of Object.entries(options.io)) {\n if (names.has(name)) continue;\n if (!isStoragePath(name)) {\n report(`Unknown I/O binding ${name}.`);\n continue;\n }\n const resolved = resolveStoragePath(core, name);\n if (\"error\" in resolved) {\n report(resolved.error);\n continue;\n }\n const overlapping = storageBindings.find((other) => nested(other, resolved));\n if (overlapping) report(`${name} overlaps the binding ${overlapping.key}.`);\n if (!scheduled.has(resolved.root.id))\n report(\n `${name}: no scheduled program uses ${resolved.root.name}, so it would never be copied.`,\n );\n storageBindings.push(resolved);\n targets.push({\n name,\n binding,\n type: resolved.type,\n region: binding.address[1] === \"I\" ? \"I\" : \"Q\",\n });\n }\n\n const addresses: {\n region: string;\n start: bigint;\n end: bigint;\n name: string;\n shared?: boolean;\n }[] = [];\n for (const { name, binding, type, region, span } of targets) {\n // An array binds at its first element; the remaining elements follow at\n // consecutive addresses of the same width, like an EDS byte/word span.\n const array = type.kind === \"array\" ? type : undefined;\n const element = array ? types.get(array.element) : type;\n // Typegen spells channels as IEC types; equal layouts bind (an EDS UINT flag word into a WORD).\n const layout = ioLayout(iecSpelling(type, types) ?? \"\");\n if (binding.type && (!layout || ioLayout(binding.type) !== layout))\n report(`I/O type mismatch for ${name}: ${type.id} cannot bind to ${binding.type}.`, span);\n if (!binding.address.startsWith(`%${region}`))\n report(`Wrong address region for ${name}: expected %${region}X.`, span);\n const match = /^%([IQ])([XBWD])([0-9]+)(?:\\.([0-7]))?$/.exec(binding.address);\n if (!match) continue;\n if (region === \"I\" && element?.kind === \"float\")\n report(\n \"Floating logical inputs require an explicit runtime nonfinite policy, which is not supported yet.\",\n span,\n );\n if (array && element?.kind === \"bool\")\n report(\n `BOOL arrays are not bit-packed in CODESYS I/O; bind each element of ${name} separately.`,\n span,\n );\n const size = match[2] === \"X\" ? 1 : match[2] === \"B\" ? 8 : match[2] === \"W\" ? 16 : 32;\n if (ioBits(element) !== size) report(`Address size does not match ${name}:${type.id}.`, span);\n // CODESYS numbers %IW/%ID by element: %IW12 is bytes 24-25. See verify.py.\n const unit = size === 1 ? 8n : BigInt(size);\n const offset = BigInt(match[3]!);\n const start = offset * unit + BigInt(match[4] ?? 0),\n end = start + BigInt(size) * BigInt(array?.length ?? 1);\n if (binding.inverted && (region !== \"I\" || element?.kind !== \"bool\" || array))\n report(`Only a BOOL input can be inverted: ${name}.`, span);\n if (binding.shared && region !== \"I\") report(`Only an input can be shared: ${name}.`, span);\n const collision = addresses.find(\n (address) =>\n address.region === match[1] &&\n address.start < end &&\n start < address.end &&\n !(binding.shared && address.shared && address.start === start && address.end === end),\n );\n if (collision)\n report(`Overlapping I/O address ${binding.address} with ${collision.name}.`, span);\n addresses.push({ region: match[1]!, start, end, name, shared: binding.shared });\n if (offset > 0x7fff_ffffn) report(`I/O offset is too large: ${binding.address}.`, span);\n }\n return storageBindings;\n}\n\n/** Two storage bindings conflict when one target contains the other. */\nfunction nested(left: StorageBinding, right: StorageBinding): boolean {\n return (\n left.root.id === right.root.id &&\n left.segments.every((a, index) => {\n const b = right.segments[index];\n if (!b) return true;\n return a.kind === \"field\"\n ? b.kind === \"field\" && a.name === b.name\n : b.kind === \"index\" && a.value === b.value;\n })\n );\n}\n\n/** Width of one bound element; BOOL is a single bit, numeric scalars their storage width. */\nfunction ioBits(type: PlcType | undefined): number {\n if (type?.kind === \"bool\") return 1;\n return type && \"bits\" in type ? type.bits : 0;\n}\n\nfunction validateTasks(core: VerifiedCoreModule, deployment: Deployment, report: Report): void {\n const programs = new Map(core.programs.map((program) => [program.name, program]));\n const assignment = new Map<string, string>();\n const taskNames = new Set<string>();\n const checkOwnership = taskStorageOwnership(core, report);\n for (const task of deployment.tasks) {\n if (!isIecIdentifier(task.name)) report(`Invalid task name ${task.name}.`);\n if (taskNames.has(task.name.toUpperCase())) report(`Duplicate task name ${task.name}.`);\n taskNames.add(task.name.toUpperCase());\n if (!Number.isInteger(task.priority) || task.priority < 0 || task.priority > 31)\n report(`Task ${task.name} priority must be 0..31.`);\n if (!/^[1-9][0-9]*$/.test(task.intervalNanoseconds))\n report(`Invalid task interval for ${task.name}.`);\n else {\n const ns = BigInt(task.intervalNanoseconds);\n if (ns % 1_000_000n || ns > 4_294_967_295_000_000n)\n report(`Task ${task.name} requires an exact positive TIME interval in milliseconds.`);\n }\n if (!task.programs.length) report(`Task ${task.name} has no programs.`);\n for (const name of task.programs) {\n const program = programs.get(name);\n if (!program) {\n report(`Unknown task program ${name}.`);\n continue;\n }\n if (assignment.has(name)) report(`Program ${name} must belong to exactly one task.`);\n assignment.set(name, task.name);\n checkOwnership(task.name, program);\n }\n }\n for (const name of programs.keys())\n if (!assignment.has(name)) report(`Program ${name} has no cyclic task.`);\n}\n\nfunction validateStorage(core: VerifiedCoreModule, options: CodesysOptions, report: Report): void {\n const programs = new Map(core.programs.map((program) => [program.name, program]));\n if (core.blocks.some((block) => block.standard === \"Blinker\")) {\n for (const target of Object.values(options.programNames ?? {})) {\n if (target.toUpperCase() === \"UTIL\")\n report(`IEC object name ${target} shadows the Util library namespace required by Blinker.`);\n }\n }\n const explicitNames = new Set<string>();\n for (const [name, target] of Object.entries(options.programNames ?? {})) {\n if (!programs.has(name)) report(`Unknown program name override ${name}.`);\n if (explicitNames.has(target.toUpperCase())) report(`Duplicate IEC program name ${target}.`);\n explicitNames.add(target.toUpperCase());\n }\n const types = new Map(core.types.map((type) => [type.id, type]));\n const blocks = new Map(core.blocks.map((block) => [block.id, block]));\n\n // InOut addresses must not survive a retained restart, including nested children.\n const blockHasInOut = (id: string): boolean => {\n const block = blocks.get(id)!;\n return (\n block.inputs.some((input) => input.mode === \"inOut\") ||\n block.state.some((field) => {\n const type = instancedBlock(field.type, types);\n return type !== undefined && blockHasInOut(type.block);\n })\n );\n };\n\n const layout = storageLayout(core);\n for (const block of core.blocks)\n if (layout.retainedBlocks.has(block.id) && blockHasInOut(block.id))\n report(\n \"Retained function blocks cannot contain direct or nested InOut references.\",\n block.span,\n );\n for (const variable of core.variables) {\n const type = instancedBlock(variable.type, types);\n if (variable.retain && type && blockHasInOut(type.block))\n report(\n \"Retained function blocks cannot contain direct or nested InOut references.\",\n variable.span,\n );\n }\n}\n\nfunction validateConstants(core: VerifiedCoreModule, report: Report): void {\n const types = new Map(core.types.map((type) => [type.id, type]));\n const constant = (value: Constant, id: string, span?: SourceSpan): void => {\n const type = types.get(id)!;\n if (type.kind === \"string\" && value.kind === \"string\") {\n if (\n type.encoding === \"utf8\" &&\n [...value.value].some(\n (character) => character.charCodeAt(0) === 0 || character.charCodeAt(0) > 127,\n )\n )\n report(\n \"Non-ASCII STRING literals require a verified project-wide UTF8 setting; this profile supports ASCII literals.\",\n span,\n );\n if (type.encoding === \"utf16\" && /[\\uD800-\\uDFFF]/.test(value.value))\n report(\"CODESYS WSTRING uses UCS-2 and cannot represent surrogate code units.\", span);\n }\n if (type.kind === \"array\" && value.kind === \"array\")\n for (const item of value.items) constant(item, type.element, span);\n if (type.kind === \"record\" && value.kind === \"record\")\n for (const field of type.fields) constant(value.fields[field.name]!, field.type, span);\n };\n const constantsInPath = (path: CorePath = []): void => {\n for (const segment of path) if (segment.kind === \"index\") constantsInExpression(segment.value);\n };\n const constantsInExpression = (value: CoreExpression): void => {\n if (value.kind === \"constant\") constant(value.value, value.type, value.span);\n if (value.kind === \"load\") constantsInPath(value.path);\n if (value.kind === \"borrow\") constantsInPath(value.place.path);\n if (value.kind === \"unary\" || value.kind === \"convert\") constantsInExpression(value.operand);\n if (value.kind === \"binary\") {\n constantsInExpression(value.left);\n constantsInExpression(value.right);\n }\n };\n const constantsInBody = (items: readonly CoreStatement[]): void => {\n for (const item of items) {\n if (item.kind === \"assign\") {\n constantsInExpression(item.value);\n constantsInPath(item.path);\n }\n if (item.kind === \"if\") {\n constantsInExpression(item.condition);\n constantsInBody(item.then);\n constantsInBody(item.else);\n }\n if (item.kind === \"switch\") {\n constantsInExpression(item.value);\n item.cases.forEach((branch) => {\n for (const value of branch.values) constant(value, item.value.type, item.span);\n constantsInBody(branch.body);\n });\n constantsInBody(item.fallback);\n }\n if (item.kind === \"for\") constantsInBody(item.body);\n if (item.kind === \"invoke\") {\n if (item.index) constantsInExpression(item.index);\n item.arguments.forEach(constantsInExpression);\n }\n if (item.kind === \"blockUpdate\") {\n if (item.index) constantsInExpression(item.index);\n Object.values(item.inputs).forEach(constantsInExpression);\n }\n if (item.kind === \"return\" && item.value) constantsInExpression(item.value);\n }\n };\n core.variables.forEach((variable) => {\n if (variable.initial) constant(variable.initial, variable.type, variable.span);\n });\n for (const fn of core.functions) constantsInBody(fn.body);\n core.blocks.forEach((block) => {\n [...block.outputs, ...block.state, ...block.locals].forEach((variable) => {\n if (variable.initial) constant(variable.initial, variable.type, variable.span);\n });\n constantsInBody(block.body);\n });\n}\n",
|
|
11
14
|
"import type { PlcType, Variable, VerifiedCoreModule } from \"@tsplc/compiler/ir\";\nimport { type IoTarget, ioLayout } from \"@tsplc/typegen/hardware\";\nimport { moduleName } from \"./storage.ts\";\n\ntype StorageSegment =\n { kind: \"field\"; record: string; name: string } | { kind: \"index\"; value: number };\n\n/** An `io` key that names a field of authored module storage, e.g. `PlantIO.Motor.Output.Run`. */\nexport interface StorageBinding {\n key: string;\n root: Variable;\n segments: readonly StorageSegment[];\n type: PlcType;\n}\n\nconst pathPattern = /^([\\w$-]+)\\.([A-Za-z_$][\\w$]*)((?:\\.[A-Za-z_$][\\w$]*|\\[-?\\d+\\])*)$/;\n\nexport const isStoragePath = (key: string): boolean => key.includes(\".\") || key.includes(\"[\");\n\n/** Resolve a storage path against verified types; the error explains the first unresolvable segment. */\nexport function resolveStoragePath(\n core: VerifiedCoreModule,\n key: string,\n): StorageBinding | { error: string } {\n const match = pathPattern.exec(key);\n if (!match) return { error: `${key}: expected Module.variable followed by .field or [index].` };\n const [, module, name, rest] = match;\n const roots = core.variables.filter(\n (item) => item.storage === \"module\" && item.name === name && moduleName(item) === module,\n );\n if (roots.length !== 1)\n return {\n error: roots.length\n ? `${key}: ${module}.${name} is declared by more than one module named ${module}.`\n : `${key}: no mutable module variable ${module}.${name}.`,\n };\n const root = roots[0]!;\n const types = new Map(core.types.map((type) => [type.id, type]));\n let type = types.get(root.type)!;\n const segments: StorageSegment[] = [];\n for (const [, field, index] of rest!.matchAll(/\\.([A-Za-z_$][\\w$]*)|\\[(-?\\d+)\\]/g)) {\n if (field !== undefined) {\n const member = type.kind === \"record\" ? type.fields.find((f) => f.name === field) : undefined;\n if (!member) return { error: `${key}: no field ${field}.` };\n segments.push({ kind: \"field\", record: type.id, name: field });\n type = types.get(member.type)!;\n } else {\n const value = Number(index);\n if (type.kind !== \"array\") return { error: `${key}: ${index} indexes a non-array value.` };\n if (value < type.lowerBound || value >= type.lowerBound + type.length)\n return {\n error: `${key}: index ${value} is outside ${type.lowerBound}..${type.lowerBound + type.length - 1}.`,\n };\n segments.push({ kind: \"index\", value });\n type = types.get(type.element)!;\n }\n }\n return { key, root, segments, type };\n}\n\n/** IEC spelling of a bindable type, as typegen spells channels; undefined for records, enums, strings. */\nexport function iecSpelling(\n type: PlcType,\n types: ReadonlyMap<string, PlcType>,\n): string | undefined {\n if (\n type.kind === \"bool\" ||\n type.kind === \"integer\" ||\n type.kind === \"bits\" ||\n type.kind === \"float\"\n )\n return type.id;\n if (type.kind !== \"array\") return undefined;\n const element = iecSpelling(types.get(type.element)!, types);\n const upper = type.lowerBound + type.length - 1;\n return element && !element.startsWith(\"ARRAY\")\n ? `ARRAY[${type.lowerBound}..${upper}] OF ${element}`\n : undefined;\n}\n\n/** Every key an `io` mapping may use: logical IO names and paths into mutable module storage. */\nexport function ioTargets(core: VerifiedCoreModule): IoTarget[] {\n const types = new Map(core.types.map((type) => [type.id, type]));\n const targets: IoTarget[] = [];\n const add = (key: string, type: PlcType) => {\n const layout = ioLayout(iecSpelling(type, types) ?? \"\");\n if (layout) targets.push({ key, layout });\n };\n const visit = (key: string, type: PlcType): void => {\n add(key, type);\n if (type.kind === \"record\")\n for (const field of type.fields) visit(`${key}.${field.name}`, types.get(field.type)!);\n // Typegen writes keys as template literal types, so any index matches here.\n if (type.kind === \"array\") visit(`${key}[` + \"${number}\" + \"]\", types.get(type.element)!);\n };\n for (const variable of core.variables) {\n if (variable.storage === \"input\" || variable.storage === \"output\")\n add(variable.name, types.get(variable.type)!);\n else if (variable.storage === \"module\")\n visit(`${moduleName(variable)}.${variable.name}`, types.get(variable.type)!);\n }\n return targets;\n}\n",
|
|
12
|
-
"import { basename } from \"node:path\";\nimport { instancedBlock, type Variable, type VerifiedCoreModule } from \"@tsplc/compiler/ir\";\n\ninterface GlobalList {\n id: string;\n module: string;\n storage: \"constants\" | \"retained\" | \"state\";\n variables: Variable[];\n}\n\n/** The source module that owns a module-level variable: its file name without extension. */\nexport const moduleName = (variable: Variable): string =>\n basename(variable.span.file).replace(/\\.[^.]+$/, \"\");\n\n/** CODESYS promotes an enclosing instance when private child state is retained. */\nexport function storageLayout(core: VerifiedCoreModule) {\n const types = new Map(core.types.map((type) => [type.id, type]));\n const blocks = new Map(core.blocks.map((block) => [block.id, block]));\n const retention = new Map<string, boolean>();\n const blockRetained = (id: string): boolean => {\n const cached = retention.get(id);\n if (cached !== undefined) return cached;\n const block = blocks.get(id);\n if (!block) throw new Error(\"Missing verified block during retention planning.\");\n const retained = block.state.some((field) => {\n const type = instancedBlock(field.type, types);\n return field.retain || (type !== undefined && blockRetained(type.block));\n });\n retention.set(id, retained);\n return retained;\n };\n\n const retainedBlocks = new Set(\n core.blocks.filter((block) => blockRetained(block.id)).map((block) => block.id),\n );\n const retainedVariables = new Set(\n [...core.variables, ...core.blocks.flatMap((block) => block.state)]\n .filter((variable) => {\n const type = instancedBlock(variable.type, types);\n return variable.retain || (type !== undefined && retainedBlocks.has(type.block));\n })\n .map((variable) => variable.id),\n );\n\n const groups = new Map<string, GlobalList>();\n for (const variable of core.variables) {\n if (variable.storage === \"input\" || variable.storage === \"output\") continue;\n const storage =\n variable.storage === \"constant\"\n ? \"constants\"\n : retainedVariables.has(variable.id)\n ? \"retained\"\n : \"state\";\n const id = `${variable.span.file}:${storage}`;\n let group = groups.get(id);\n if (!group) {\n group = { id, module: moduleName(variable), storage, variables: [] };\n groups.set(id, group);\n }\n group.variables.push(variable);\n }\n return { retainedBlocks, retainedVariables, globalLists: [...groups.values()] };\n}\n",
|
|
13
15
|
"import type { CoreFunctionBlock, GeneratedObject, PlcType } from \"@tsplc/compiler/ir\";\nimport type { HttpOptions } from \"@tsplc/config\";\nimport type { CodesysTypes } from \"./types.ts\";\n\nexport const opcuaServiceCapacity = 16;\n\nexport interface HttpEndpoint {\n transport?: \"http\" | \"opcua\";\n host: string;\n port: number;\n authority: string;\n path: string;\n token: string;\n timeoutMs: number;\n tls: boolean;\n}\nexport const resolveHttpEndpoint = (value: string, input: HttpOptions): HttpEndpoint => {\n const url = new URL(value);\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.hash ||\n url.hostname.includes(\":\")\n )\n throw new Error(\n \"fetch requires an HTTP(S) URL with an IPv4 address or DNS hostname, without credentials or fragment.\",\n );\n if (\n (url.pathname + url.search).length > 2048 ||\n url.hostname.length > 253 ||\n Number(url.port || (url.protocol === \"https:\" ? 443 : 80)) === 0\n )\n throw new Error(\"HTTP URL exceeds the native host/path limits or has an invalid port.\");\n let token = \"\";\n const origins = new Set<string>();\n for (const credential of input.credentials) {\n const configured = process.env[credential.originEnv],\n secret = process.env[credential.bearerTokenEnv];\n if (!configured || !secret)\n throw new Error(\n `HTTP credentials require ${credential.originEnv} and ${credential.bearerTokenEnv}.`,\n );\n const origin = new URL(configured);\n if (\n ![\"http:\", \"https:\"].includes(origin.protocol) ||\n origin.username ||\n origin.password ||\n origin.pathname !== \"/\" ||\n origin.search ||\n origin.hash\n )\n throw new Error(\n `HTTP credential origin ${credential.originEnv} must contain only a scheme, host and port.`,\n );\n if (origins.has(origin.origin)) throw new Error(\"HTTP credential origins must be unique.\");\n origins.add(origin.origin);\n if (/[\\r\\n\\0]/.test(secret) || secret.length > 512)\n throw new Error(`Invalid bearer token in ${credential.bearerTokenEnv}.`);\n if (origin.origin === url.origin) token = secret;\n }\n return {\n host: url.hostname,\n port: Number(url.port || (url.protocol === \"https:\" ? 443 : 80)),\n authority: url.host,\n path: url.pathname + url.search,\n token,\n timeoutMs: input.timeoutMs,\n tls: url.protocol === \"https:\",\n };\n};\nconst quote = (text: string) =>\n \"'\" +\n text.replaceAll(\"$\", \"$$\").replaceAll(\"'\", \"$'\").replaceAll(\"\\r\", \"$R\").replaceAll(\"\\n\", \"$N\") +\n \"'\";\n\nconst httpLayouts = (block: CoreFunctionBlock, types: ReadonlyMap<string, PlcType>) => {\n const request = block.inputs.find((v) => v.name === \"request\"),\n response = block.outputs.find((v) => v.name === \"result\");\n if (!request || !response) throw new Error(\"Missing HTTP record ports.\");\n const requestLayout = types.get(request.type),\n responseLayout = types.get(response.type);\n if (\n requestLayout?.kind !== \"record\" ||\n responseLayout?.kind !== \"record\" ||\n responseLayout.fields.length === 0 ||\n responseLayout.fields.length > 31\n )\n throw new Error(\"HTTP requires closed request/response records with 1..31 response fields.\");\n const scalarSize = (id: string): number => {\n const type = types.get(id);\n if (type?.kind === \"string\" && type.encoding === \"utf8\" && type.capacity <= 2048)\n return type.capacity * 6 + 2;\n if (type?.kind === \"bool\") return 5;\n if (type?.kind === \"enum\")\n return Math.max(...type.members.map((member) => member.value.length));\n if ((type?.kind === \"integer\" || type?.kind === \"bits\") && type.bits <= 32) {\n const signed = type.kind === \"integer\" && type.signed;\n return String(signed ? -(2 ** (type.bits - 1)) : 2 ** type.bits - 1).length;\n }\n throw new Error(\n \"HTTP JSON supports bounded UTF-8 strings, BOOL, enums, and integers up to 32 bits.\",\n );\n };\n const recordSize = (record: typeof requestLayout, response: boolean) =>\n 2 +\n record.fields.reduce((size, field) => {\n const type = types.get(field.type);\n const valueSize =\n type?.kind === \"array\" && !response\n ? 2 + type.length * (scalarSize(type.element) + 1)\n : scalarSize(field.type);\n return size + field.name.length + 4 + valueSize;\n }, 0);\n if (recordSize(requestLayout, false) > 2048 || recordSize(responseLayout, true) > 2048)\n throw new Error(\n \"The worst-case HTTP JSON payload exceeds the native 2048-byte buffer; reduce record/string/array bounds.\",\n );\n return { request, response, requestLayout, responseLayout };\n};\nexport const validateHttpLayout = (\n block: CoreFunctionBlock,\n types: ReadonlyMap<string, PlcType>,\n): void => {\n httpLayouts(block, types);\n};\n\n/** Native transport and typed JSON codecs; no application protocol lives here. */\nexport const emitHttp = (\n block: CoreFunctionBlock,\n name: string,\n fields: ReadonlyMap<string, string>,\n types: ReadonlyMap<string, PlcType>,\n target: CodesysTypes,\n endpoint: HttpEndpoint,\n network: string,\n rpcGlobal?: string,\n): GeneratedObject => {\n const port = (label: string) => {\n const variable = [...block.inputs, ...block.outputs].find((v) => v.name === label);\n if (!variable) throw new Error(\"Missing HTTP port \" + label);\n return fields.get(variable.id)!;\n };\n const { request, response, requestLayout, responseLayout } = httpLayouts(block, types);\n const encode = (typeId: string, value: string): string => {\n const type = types.get(typeId)!;\n if (type.kind === \"array\")\n return Array.from(\n { length: type.length },\n (_, i) =>\n `${i ? \"Append(',');\" : \"\"}${encode(type.element, `${value}[${i + type.lowerBound}]`)}`,\n ).join(\"\\n\");\n if (type.kind === \"string\" && type.encoding === \"utf8\" && type.capacity <= 2048)\n return `WriteString(${value});`;\n if (type.kind === \"bool\")\n return `IF ${value} THEN Append('true'); ELSE Append('false'); END_IF;`;\n if (type.kind === \"enum\") return `Append(DINT_TO_STRING(TO_DINT(${value})));`;\n if (type.kind === \"bits\" && type.bits <= 32)\n return `Append(UDINT_TO_STRING(TO_UDINT(${value})));`;\n if (type.kind === \"integer\" && type.bits <= 32)\n return `Append(${target.name(typeId)}_TO_STRING(${value}));`;\n throw new Error(\n \"HTTP JSON supports bounded UTF-8 strings, BOOL, enums, integers up to 32 bits and fixed arrays.\",\n );\n };\n const requestCode = requestLayout.fields\n .map((field, i) => {\n const type = types.get(field.type)!,\n value = `${port(\"request\")}.${target.field(request.type, field.name)}`;\n return `Append(${quote((i ? \",\" : \"\") + '\"' + field.name + '\":')});${type.kind === \"array\" ? \"Append('[');\" : \"\"}${encode(field.type, value)}${type.kind === \"array\" ? \"Append(']');\" : \"\"}`;\n })\n .join(\"\\n\");\n const responseCode = responseLayout.fields\n .map((field, i) => {\n const type = types.get(field.type)!,\n value = `${port(\"result\")}.${target.field(response.type, field.name)}`;\n let decode: string;\n if (type.kind === \"string\" && type.encoding === \"utf8\" && type.capacity <= 2048)\n decode = `ReadString(); IF ByteLength(token) > ${type.capacity} THEN malformed := TRUE; ELSE ${value} := token; END_IF;`;\n else if (type.kind === \"bool\")\n decode = `IF MatchLiteral('true') THEN ${value}:=TRUE; ELSIF MatchLiteral('false') THEN ${value}:=FALSE; ELSE malformed:=TRUE;END_IF;`;\n else if (\n ((type.kind === \"integer\" || type.kind === \"bits\") && type.bits <= 32) ||\n type.kind === \"enum\"\n ) {\n const signed = type.kind === \"enum\" || (type.kind === \"integer\" && type.signed),\n bits = type.kind === \"enum\" ? 32 : type.bits;\n const min = signed ? -(2 ** (bits - 1)) : 0,\n max = signed ? 2 ** (bits - 1) - 1 : 2 ** bits - 1;\n decode = `ReadInteger(); IF numberValue < ${min} OR numberValue > ${max} THEN malformed:=TRUE; ELSE `;\n if (type.kind === \"enum\")\n decode += `CASE numberValue OF ${type.members.map((m) => `${m.value}: ${value}:=${target.name(field.type)}.${target.field(field.type, m.name)};`).join(\" \")} ELSE malformed:=TRUE; END_CASE;`;\n else decode += `${value}:=TO_${target.name(field.type)}(numberValue);`;\n decode += \" END_IF;\";\n } else throw new Error(\"HTTP responses currently require flat scalar records.\");\n return `${i === 0 ? \"IF\" : \"ELSIF\"} part = ${quote(field.name)} THEN IF (seen AND SHL(DWORD#1,${i})) <> 0 THEN malformed:=TRUE; END_IF; seen:=seen OR SHL(DWORD#1,${i}); ${decode}`;\n })\n .join(\"\\n\");\n const inputs = block.inputs\n .map((v) => `${fields.get(v.id)} : ${target.name(v.type)};`)\n .join(\"\\n\");\n const outputs = block.outputs\n .map((v) => `${fields.get(v.id)} : ${target.name(v.type)};`)\n .join(\"\\n\");\n const decodeResponse = `cursor:=1;malformed:=FALSE;seen:=0;\nSkipWhitespace();Expect(123);SkipWhitespace();\nWHILE cursor<=TO_UINT(ByteLength(payload)) AND NOT malformed DO\n IF payload[cursor-1]=125 THEN cursor:=cursor+1;EXIT;END_IF;\n ReadString();part:=token;SkipWhitespace();Expect(58);SkipWhitespace();\n ${responseCode} ELSE malformed:=TRUE;END_IF;\n SkipWhitespace();\n IF payload[cursor-1]=44 THEN cursor:=cursor+1;SkipWhitespace();IF payload[cursor-1]=125 THEN malformed:=TRUE;END_IF;\n ELSIF payload[cursor-1]<>125 THEN malformed:=TRUE;END_IF;\nEND_WHILE;\nSkipWhitespace();\nIF malformed OR cursor<>TO_UINT(ByteLength(payload))+1 OR seen<>DWORD#${2 ** responseLayout.fields.length - 1} THEN ${port(\"error\")}:=4;END_IF;`;\n if (endpoint.transport === \"opcua\") {\n if (!rpcGlobal) throw new Error(\"Missing OPC UA RPC global.\");\n const channel = (field: string, index = \"slotIndex\") => `${rpcGlobal}.${field}[${index}]`;\n return {\n id: block.id,\n kind: \"functionBlock\",\n name,\n declaration: `FUNCTION_BLOCK ${name}\nVAR_INPUT ${inputs} END_VAR\nVAR_OUTPUT ${outputs} END_VAR\nVAR\n timeout:TON;stage:UINT;slotIndex:UINT;candidate:UINT;\n identity:STRING(64);epoch:STRING(32);prefix:STRING(80);\n payload:STRING(2048);token:STRING(2048);part:STRING(2048);\n cursor:UINT;malformed:BOOL;seen:DWORD;numberValue:LINT;tokenUsed:UINT;\nEND_VAR`,\n implementation: `IF NOT ${port(\"start\")} OR ${port(\"cancel\")} THEN\n IF slotIndex>0 THEN ${channel(\"requestIds\")}:='';${channel(\"requests\")}:='';${channel(\"inUse\")}:=0;END_IF;\n slotIndex:=0;stage:=0;timeout(IN:=FALSE);${port(\"busy\")}:=FALSE;${port(\"done\")}:=FALSE;${port(\"error\")}:=0;RETURN;\nEND_IF;\nIF stage=0 THEN\n FOR candidate:=1 TO ${opcuaServiceCapacity} DO\n (* __COMPARE_AND_SWAP can fail spuriously on ARM64; retry while the slot reads free. *)\n WHILE slotIndex=0 AND ${channel(\"epochs\", \"candidate\")}<>'' AND ${channel(\"inUse\", \"candidate\")}=0 DO\n IF __COMPARE_AND_SWAP(ADR(${channel(\"inUse\", \"candidate\")}),0,1) THEN slotIndex:=candidate;END_IF;\n END_WHILE;\n IF slotIndex>0 THEN EXIT;END_IF;\n END_FOR;\n IF slotIndex=0 THEN ${port(\"error\")}:=7;stage:=90;\n ELSE\n ${channel(\"sequence\")}:=${channel(\"sequence\")}+1;\n IF ${channel(\"sequence\")}=0 THEN ${channel(\"epochs\")}:='';${port(\"error\")}:=5;stage:=90;\n ELSE\n epoch:=${channel(\"epochs\")};identity:=CONCAT(CONCAT(epoch,':'),UDINT_TO_STRING(${channel(\"sequence\")}));\n prefix:=CONCAT(identity,'|');payload:='';malformed:=FALSE;\n Append('{');${requestCode}Append('}');\n IF malformed THEN ${port(\"error\")}:=3;stage:=90;\n ELSIF ByteLength(payload)+LEN(prefix)>2048 THEN ${port(\"error\")}:=3;stage:=90;\n ELSE\n FOR candidate:=0 TO LEN(prefix)-1 DO ${channel(\"requests\")}[candidate]:=prefix[candidate];END_FOR;\n FOR candidate:=0 TO ByteLength(payload)-1 DO ${channel(\"requests\")}[candidate+LEN(prefix)]:=payload[candidate];END_FOR;\n ${channel(\"requests\")}[ByteLength(payload)+LEN(prefix)]:=0;${channel(\"requestIds\")}:=identity;stage:=1;\n END_IF;\n END_IF;\n END_IF;\nEND_IF;\ntimeout(IN:=stage<90,PT:=T#${endpoint.timeoutMs}ms);\nIF timeout.Q THEN ${port(\"error\")}:=2;stage:=90;END_IF;\nIF stage=1 THEN\n IF ${channel(\"epochs\")}<>epoch THEN ${port(\"error\")}:=5;stage:=90;\n ELSIF ${channel(\"replyIds\")}=identity AND_THEN LEFT(${channel(\"replies\")},LEN(prefix))=prefix THEN\n payload:='';cursor:=LEN(prefix);\n IF ByteLength(${channel(\"replies\")})<cursor+4 THEN ${port(\"error\")}:=4;\n ELSIF ${channel(\"replies\")}[cursor]<>48 OR ${channel(\"replies\")}[cursor+1]<>124 THEN ${port(\"error\")}:=5;\n ELSE\n FOR candidate:=cursor+2 TO ByteLength(${channel(\"replies\")})-1 DO payload[candidate-cursor-2]:=${channel(\"replies\")}[candidate];END_FOR;\n payload[ByteLength(${channel(\"replies\")})-cursor-2]:=0;\n ${decodeResponse}\n END_IF;\n stage:=90;\n END_IF;\nEND_IF;\n${port(\"busy\")}:=stage<90;\nIF stage=90 THEN\n IF slotIndex>0 THEN ${channel(\"requestIds\")}:='';${channel(\"requests\")}:='';${channel(\"inUse\")}:=0;slotIndex:=0;END_IF;\n timeout(IN:=FALSE);${port(\"busy\")}:=FALSE;${port(\"done\")}:=TRUE;\nEND_IF;`,\n };\n }\n // Helpers are emitted as native methods under the HTTP block by the emitter.\n return {\n id: block.id,\n kind: \"functionBlock\",\n name,\n declaration: `FUNCTION_BLOCK ${name}\nVAR_INPUT\n${inputs}\nEND_VAR\nVAR_OUTPUT\n${outputs}\nEND_VAR\nVAR\n remoteAddress : NBS.IPv4Address;\n remoteIP : NBS.IIPAddress := remoteAddress;\n resolver : NBS.ResolveHostname := (itfAsyncProperty:=${network});\n ${endpoint.tls ? `certificateVerifier : ${name}_CertificateVerifier;\\n tlsContext : NBS.TLSContext := (itfCertVerifer:=certificateVerifier,sUseCaseName:='tsPLC HTTPS',ePurpose:=NBS.PURPOSE.CLIENT_SIDE,sTLSVersion:='1.2',sHostname:=${quote(endpoint.host)},udiVerificationMode:=2);` : \"\"}\n client : NBS.TCP_Client := (itfAsyncProperty:=${network},itfIPAddress:=remoteAddress,uiPort:=${endpoint.port},udiTimeOut:=${endpoint.timeoutMs * 1000}${endpoint.tls ? \",itfTLSContext:=tlsContext\" : \"\"});\n writer : NBS.TCP_Write;\n reader : NBS.TCP_Read;\n timeout : TON;\n stage : UINT;\n wire : STRING(8192);\n received : STRING(8192);\n chunk : ARRAY[0..8191] OF BYTE;\n payload : STRING(2048);\n token : STRING(2048);\n part : STRING(2048);\n used : UINT;\n headerEnd : UINT;\n contentLength : DINT;\n status : UINT;\n cursor : UINT;\n malformed : BOOL;\n seen : DWORD;\n numberValue : LINT;\n wireUsed : UINT;\n tokenUsed : UINT;\n index : UINT;\nEND_VAR\n`,\n // The host goes in the resolver call, not an initial value: an online change keeps the values\n // an instance already holds, so a changed host would otherwise wait for a download.\n implementation: `IF NOT ${port(\"start\")} OR ${port(\"cancel\")} THEN\n resolver(xExecute:=FALSE,itfIPAddress:=remoteIP);client(xEnable:=FALSE); writer(xExecute:=FALSE); reader(xEnable:=FALSE); timeout(IN:=FALSE);\n stage:=0; ${port(\"busy\")}:=FALSE; ${port(\"done\")}:=FALSE; ${port(\"error\")}:=0;\n RETURN;\nEND_IF;\nIF stage=0 THEN\n payload:=''; malformed:=FALSE; used:=0; received:='';\n ${block.runtime?.kind === \"http\" && block.runtime.json ? `Append('{'); ${requestCode} Append('}');` : \"\"}\n IF malformed THEN ${port(\"error\")}:=3; stage:=90;\n ELSE\n wire:='';wireUsed:=0;\n AppendWire(${quote((block.runtime?.kind === \"http\" ? block.runtime.method : \"GET\") + \" \" + endpoint.path + \" HTTP/1.1\\r\\nHost: \" + endpoint.authority + \"\\r\\n\" + (endpoint.token ? \"Authorization: Bearer \" + endpoint.token + \"\\r\\n\" : \"\") + (block.runtime?.kind === \"http\" && block.runtime.json ? \"Content-Type: application/json\\r\\n\" : \"\") + \"Accept: application/json\\r\\nConnection: close\\r\\nContent-Length: \")});\n AppendWire(UINT_TO_STRING(ByteLength(payload)));AppendWire('$R$N$R$N');AppendWire(payload); stage:=10;\n END_IF;\nEND_IF;\ntimeout(IN:=stage<90,PT:=T#${endpoint.timeoutMs}ms);\nIF timeout.Q THEN ${port(\"error\")}:=2; stage:=90; END_IF;\n${port(\"busy\")}:=stage<90;\nIF stage=10 THEN\n resolver(xExecute:=TRUE,sHostname:=${quote(endpoint.host)},itfIPAddress:=remoteIP);\n IF resolver.xError THEN ${port(\"error\")}:=5;stage:=90;ELSIF resolver.xDone THEN stage:=1;END_IF;\nEND_IF;\nIF stage=1 THEN\n client(xEnable:=TRUE);\n IF client.xError THEN ${port(\"error\")}:=${endpoint.tls ? 6 : 5};stage:=90; ELSIF client.xActive THEN stage:=2;END_IF;\nEND_IF;\nIF stage=2 THEN\n writer(xExecute:=TRUE,itfConnection:=client.itfConnection,pData:=ADR(wire),udiSize:=UINT_TO_UDINT(wireUsed));\n IF writer.xError THEN ${port(\"error\")}:=5;stage:=90;ELSIF writer.xDone THEN stage:=3;END_IF;\nEND_IF;\nIF stage=3 THEN\n IF used>=8191 THEN ${port(\"error\")}:=3;stage:=90;\n ELSE\n reader(xEnable:=TRUE,itfConnection:=client.itfConnection,pData:=ADR(chunk),udiSize:=8191);\n IF reader.xError THEN ${port(\"error\")}:=5;stage:=90;\n ELSIF reader.xReady AND reader.udiCount>0 THEN\n IF TO_UDINT(used)+reader.udiCount>8191 THEN ${port(\"error\")}:=3;stage:=90;\n ELSE\n FOR index:=0 TO TO_UINT(reader.udiCount)-1 DO received[used+index]:=chunk[index];END_FOR;\n used:=used+TO_UINT(reader.udiCount);received[used]:=0;\n FindHeaders();\n IF headerEnd=0 AND used>4096 THEN ${port(\"error\")}:=3;stage:=90;END_IF;\n IF headerEnd>0 THEN\n IF headerEnd>4096 THEN ${port(\"error\")}:=3;stage:=90;\n ELSE\n ReadHeaders();\n IF malformed OR contentLength<0 OR contentLength>2048 THEN ${port(\"error\")}:=3;stage:=90;\n ELSIF TO_DINT(used)>=TO_DINT(headerEnd)+3+contentLength THEN\n IF status<200 OR status>=300 THEN ${port(\"error\")}:=10000+status;stage:=90;\n ELSE\n payload:='';IF contentLength>0 THEN FOR index:=0 TO TO_UINT(contentLength)-1 DO payload[index]:=received[headerEnd+3+index]; END_FOR;END_IF;payload[TO_UINT(contentLength)]:=0; ${decodeResponse}\n stage:=90;\n END_IF;\n END_IF;\n END_IF;\n END_IF;\n END_IF;\n END_IF;\n END_IF;\nEND_IF;\nIF stage=90 THEN\n resolver(xExecute:=FALSE,itfIPAddress:=remoteIP);client(xEnable:=FALSE);writer(xExecute:=FALSE);reader(xEnable:=FALSE);timeout(IN:=FALSE);\n ${port(\"busy\")}:=FALSE;${port(\"done\")}:=TRUE;\nEND_IF;\n`,\n };\n};\n\nexport const httpCertificateVerifier = (\n owner: string,\n name: string,\n endpoint: HttpEndpoint,\n): GeneratedObject[] => {\n if (!endpoint.tls) return [];\n const id = `${owner}:certificateVerifier`;\n // NBS represents certificate handles as pointers; verification keeps the native trust result.\n const ipv4 = /^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(endpoint.host);\n return [\n {\n id,\n kind: \"functionBlock\",\n name: `${name}_CertificateVerifier`,\n declaration: `FUNCTION_BLOCK ${name}_CertificateVerifier IMPLEMENTS NBS.ICertificateVerifier\nVAR\n hostname:STRING(255):=${quote(endpoint.host)};\n ${ipv4 ? `address:ARRAY[0..3] OF BYTE := [${endpoint.host.split(\".\").join(\",\")}];` : \"\"}\nEND_VAR`,\n implementation: \"\",\n },\n {\n id: `${id}:VerifyCertificate`,\n parent: id,\n kind: \"method\",\n name: \"VerifyCertificate\",\n declaration: `METHOD PUBLIC VerifyCertificate : UDINT\nVAR_INPUT hCert:POINTER TO BYTE;eCurState:UDINT;END_VAR\nVAR matched:BOOL;result:UDINT;END_VAR`,\n implementation: `VerifyCertificate:=eCurState;\nIF eCurState<>0 THEN RETURN;END_IF;\nmatched:=CmpX509Cert_Implementation.${ipv4 ? \"X509CertCheckIP(hCert,ADR(address),0,ADR(result))\" : \"X509CertCheckHost(hCert,ADR(hostname),4,ADR(result))\"};\nIF result<>0 THEN VerifyCertificate:=result;ELSIF NOT matched THEN VerifyCertificate:=1;END_IF;`,\n },\n ];\n};\n\nexport const httpMethods = (\n owner: string,\n transport: \"http\" | \"opcua\" = \"http\",\n): GeneratedObject[] => {\n const method = (\n name: string,\n declaration: string,\n implementation: string,\n result?: string,\n ): GeneratedObject => ({\n id: `${owner}:${name}`,\n parent: owner,\n kind: \"method\",\n name,\n declaration: `METHOD PRIVATE ${name}${result ? ` : ${result}` : \"\"}\\n${declaration}`,\n implementation,\n });\n return [\n // Standard string helpers accept STRING(255); native buffers must retain their full byte length.\n method(\n \"ByteLength\",\n \"VAR_INPUT value:STRING(8192);END_VAR\\nVAR i:UINT;END_VAR\",\n \"ByteLength:=0;FOR i:=0 TO 8191 DO IF value[i]=0 THEN ByteLength:=i;RETURN;END_IF;END_FOR;ByteLength:=8192;\",\n \"UINT\",\n ),\n method(\n \"Append\",\n \"VAR_INPUT value : STRING(2048); END_VAR\\nVAR offset:UINT;i:UINT;END_VAR\",\n `offset:=TO_UINT(ByteLength(payload));IF offset+TO_UINT(ByteLength(value))>2048 THEN malformed:=TRUE; ELSE IF ByteLength(value)>0 THEN FOR i:=0 TO TO_UINT(ByteLength(value))-1 DO payload[offset+i]:=value[i];END_FOR;END_IF;payload[offset+TO_UINT(ByteLength(value))]:=0;END_IF;`,\n ),\n method(\n \"AppendWire\",\n \"VAR_INPUT value:STRING(8192);END_VAR\\nVAR i:UINT;END_VAR\",\n `IF wireUsed+TO_UINT(ByteLength(value))>8191 THEN malformed:=TRUE;RETURN;END_IF;IF ByteLength(value)>0 THEN FOR i:=0 TO TO_UINT(ByteLength(value))-1 DO wire[wireUsed+i]:=value[i];END_FOR;END_IF;wireUsed:=wireUsed+TO_UINT(ByteLength(value));wire[wireUsed]:=0;`,\n ),\n method(\n \"FindHeaders\",\n \"VAR i:UINT;END_VAR\",\n `headerEnd:=0;IF used<4 THEN RETURN;END_IF;\nFOR i:=0 TO used-4 DO IF received[i]=13 AND received[i+1]=10 AND received[i+2]=13 AND received[i+3]=10 THEN headerEnd:=i+1;RETURN;END_IF;END_FOR;`,\n ),\n method(\n \"MatchLiteral\",\n \"VAR_INPUT value:STRING(8);END_VAR\\nVAR i:UINT;size:UINT;END_VAR\",\n `MatchLiteral:=FALSE;size:=TO_UINT(ByteLength(value));IF cursor+size-1>TO_UINT(ByteLength(payload)) THEN RETURN;END_IF;\nFOR i:=0 TO size-1 DO IF payload[cursor-1+i]<>value[i] THEN RETURN;END_IF;END_FOR;cursor:=cursor+size;MatchLiteral:=TRUE;`,\n \"BOOL\",\n ),\n method(\n \"ReadHeaders\",\n `VAR lineStart:UINT;lineEnd:UINT;i:UINT;j:UINT;key:STRING(64);octet:BYTE;found:BOOL;digits:UINT;END_VAR`,\n `malformed:=FALSE;found:=FALSE;contentLength:=-1;\nIF LEFT(received,9)<>'HTTP/1.1 ' AND LEFT(received,9)<>'HTTP/1.0 ' THEN malformed:=TRUE;RETURN;END_IF;\nstatus:=0;FOR i:=9 TO 11 DO IF received[i]<48 OR received[i]>57 THEN malformed:=TRUE;RETURN;END_IF;status:=status*10+TO_UINT(received[i]-48);END_FOR;\nlineStart:=1;\nWHILE lineStart<headerEnd DO\n lineEnd:=lineStart;WHILE lineEnd<headerEnd AND received[lineEnd-1]<>13 DO lineEnd:=lineEnd+1;END_WHILE;\n key:='';j:=0;i:=lineStart;\n WHILE i<lineEnd AND received[i-1]<>58 AND j<63 DO octet:=received[i-1];IF octet>=65 AND octet<=90 THEN octet:=octet+32;END_IF;key[j]:=octet;j:=j+1;i:=i+1;END_WHILE;key[j]:=0;\n IF key='transfer-encoding' THEN malformed:=TRUE;RETURN;END_IF;\n IF key='content-length' THEN\n IF found THEN malformed:=TRUE;RETURN;END_IF;found:=TRUE;contentLength:=0;digits:=0;i:=i+1;\n WHILE i<lineEnd AND received[i-1]=32 DO i:=i+1;END_WHILE;\n WHILE i<lineEnd DO octet:=received[i-1];IF octet<48 OR octet>57 OR digits>=5 THEN malformed:=TRUE;RETURN;END_IF;contentLength:=contentLength*10+TO_DINT(octet-48);digits:=digits+1;i:=i+1;END_WHILE;\n IF digits=0 THEN malformed:=TRUE;RETURN;END_IF;\n END_IF;\n lineStart:=lineEnd+2;\nEND_WHILE;`,\n ),\n method(\n \"WriteString\",\n `VAR_INPUT value : STRING(2048); END_VAR\\nVAR i:UINT; one:STRING(1); hex:STRING(16):='0123456789abcdef'; END_VAR`,\n `Append('\"');IF ByteLength(value)>0 THEN FOR i:=0 TO ByteLength(value)-1 DO\n one[0]:=value[i];one[1]:=0;\n IF value[i]=34 OR value[i]=92 THEN Append('\\\\');Append(one);\n ELSIF value[i]<32 THEN Append('\\\\u00');one[0]:=hex[SHR(value[i],4)];Append(one);one[0]:=hex[value[i] AND 15];Append(one);\n ELSE Append(one);END_IF;\n END_FOR;END_IF;Append('\"');`,\n ),\n method(\n \"SkipWhitespace\",\n \"\",\n `WHILE cursor<=TO_UINT(ByteLength(payload)) DO IF payload[cursor-1]<>32 AND payload[cursor-1]<>9 AND payload[cursor-1]<>10 AND payload[cursor-1]<>13 THEN EXIT;END_IF;cursor:=cursor+1;END_WHILE;`,\n ),\n method(\n \"Expect\",\n \"VAR_INPUT value:BYTE; END_VAR\",\n `IF cursor>TO_UINT(ByteLength(payload)) OR_ELSE payload[cursor-1]<>value THEN malformed:=TRUE;ELSE cursor:=cursor+1;END_IF;`,\n ),\n method(\n \"TokenByte\",\n \"VAR_INPUT value:BYTE;END_VAR\",\n `IF tokenUsed>=2048 OR value=0 THEN malformed:=TRUE;RETURN;END_IF;token[tokenUsed]:=value;tokenUsed:=tokenUsed+1;token[tokenUsed]:=0;`,\n ),\n method(\n \"ReadHex\",\n \"VAR value:UDINT;i:UINT;octet:BYTE;END_VAR\",\n `numberValue:=0;FOR i:=1 TO 4 DO\nIF cursor>TO_UINT(ByteLength(payload)) THEN malformed:=TRUE;RETURN;END_IF;\noctet:=payload[cursor-1];cursor:=cursor+1;\nIF octet>=48 AND octet<=57 THEN value:=TO_UDINT(octet-48);ELSIF octet>=65 AND octet<=70 THEN value:=TO_UDINT(octet-55);ELSIF octet>=97 AND octet<=102 THEN value:=TO_UDINT(octet-87);ELSE malformed:=TRUE;RETURN;END_IF;\nnumberValue:=numberValue*16+TO_LINT(value);END_FOR;`,\n ),\n method(\n \"ReadString\",\n `VAR octet:BYTE;point:UDINT;high:UDINT;END_VAR`,\n `token:='';tokenUsed:=0;Expect(34);\nWHILE cursor<=TO_UINT(ByteLength(payload)) AND NOT malformed DO\n octet:=payload[cursor-1];cursor:=cursor+1;\n IF octet=34 THEN ValidateUtf8();RETURN;END_IF;\n IF octet=92 THEN\n IF cursor>TO_UINT(ByteLength(payload)) THEN malformed:=TRUE;RETURN;END_IF;\n octet:=payload[cursor-1];cursor:=cursor+1;\n CASE octet OF\n 34,47,92: TokenByte(octet);\n 98:TokenByte(8);102:TokenByte(12);110:TokenByte(10);114:TokenByte(13);116:TokenByte(9);\n 117:\n ReadHex();point:=TO_UDINT(numberValue);\n IF point>=55296 AND point<=56319 THEN\n high:=point;Expect(92);Expect(117);ReadHex();\n IF numberValue<56320 OR numberValue>57343 THEN malformed:=TRUE;RETURN;END_IF;\n point:=65536+(high-55296)*1024+TO_UDINT(numberValue)-56320;\n ELSIF point>=56320 AND point<=57343 THEN malformed:=TRUE;RETURN;END_IF;\n IF point<128 THEN TokenByte(TO_BYTE(point));\n ELSIF point<2048 THEN TokenByte(TO_BYTE(192+SHR(point,6)));TokenByte(TO_BYTE(128+(point AND 63)));\n ELSIF point<65536 THEN TokenByte(TO_BYTE(224+SHR(point,12)));TokenByte(TO_BYTE(128+(SHR(point,6) AND 63)));TokenByte(TO_BYTE(128+(point AND 63)));\n ELSE TokenByte(TO_BYTE(240+SHR(point,18)));TokenByte(TO_BYTE(128+(SHR(point,12) AND 63)));TokenByte(TO_BYTE(128+(SHR(point,6) AND 63)));TokenByte(TO_BYTE(128+(point AND 63)));END_IF;\n ELSE malformed:=TRUE;RETURN;\n END_CASE;\n ELSIF octet<32 THEN malformed:=TRUE;RETURN;ELSE TokenByte(octet);END_IF;\nEND_WHILE;malformed:=TRUE;`,\n ),\n method(\n \"ValidateUtf8\",\n \"VAR i:UINT;j:UINT;count:UINT;first:BYTE;next:BYTE;END_VAR\",\n `i:=0;\nWHILE i<tokenUsed AND NOT malformed DO\n first:=token[i];\n IF first<128 THEN i:=i+1;\n ELSE\n IF first>=194 AND first<=223 THEN count:=1;ELSIF first>=224 AND first<=239 THEN count:=2;ELSIF first>=240 AND first<=244 THEN count:=3;ELSE malformed:=TRUE;RETURN;END_IF;\n IF i+count>=tokenUsed THEN malformed:=TRUE;RETURN;END_IF;\n next:=token[i+1];\n IF (first=224 AND next<160) OR (first=237 AND next>=160) OR (first=240 AND next<144) OR (first=244 AND next>=144) THEN malformed:=TRUE;RETURN;END_IF;\n FOR j:=1 TO count DO IF token[i+j]<128 OR token[i+j]>191 THEN malformed:=TRUE;RETURN;END_IF;END_FOR;\n i:=i+count+1;\n END_IF;\nEND_WHILE;`,\n ),\n method(\n \"ReadInteger\",\n \"VAR negative:BOOL;digits:UINT;octet:BYTE;END_VAR\",\n `numberValue:=0;negative:=FALSE;digits:=0;\nIF payload[cursor-1]=45 THEN negative:=TRUE;cursor:=cursor+1;END_IF;\nWHILE cursor<=TO_UINT(ByteLength(payload)) DO\n octet:=payload[cursor-1];IF octet<48 OR octet>57 THEN EXIT;END_IF;\n IF digits>=10 THEN malformed:=TRUE;RETURN;END_IF;\n IF digits>0 AND numberValue=0 THEN malformed:=TRUE;RETURN;END_IF;numberValue:=numberValue*10+TO_LINT(octet-48);digits:=digits+1;cursor:=cursor+1;\nEND_WHILE;\nIF digits=0 THEN malformed:=TRUE;END_IF;IF negative THEN numberValue:=-numberValue;END_IF;`,\n ),\n ].filter(\n (item) =>\n transport === \"http\" || ![\"AppendWire\", \"FindHeaders\", \"ReadHeaders\"].includes(item.name),\n );\n};\n",
|
|
14
|
-
"import { instancedBlock } from \"@tsplc/compiler/ir\";\nimport type {\n CoreExpression,\n CoreFunction,\n CorePath,\n CoreStatement,\n VerifiedCoreModule,\n} from \"@tsplc/compiler/ir\";\n\n// Follow both helper calls and instance updates. Borrow addresses count as storage\n// access, so scheduling cannot accidentally give one mutable record two owners.\nexport function accessedStorage(\n fn: CoreFunction,\n core: VerifiedCoreModule,\n scheduledHost?: string,\n): Set<string> {\n // Only the generated entry's worker call may borrow its host. Ordinary calls\n // reached through the async body still count as access to scan-owned storage.\n const scheduledCall = fn.body.find(\n (item) => item.kind === \"invoke\" && item.instance === scheduledHost,\n );\n const result = new Set<string>(),\n seen = new Set<string>();\n const functions = new Map(core.functions.map((item) => [item.id, item]));\n const blocks = new Map(core.blocks.map((item) => [item.id, item]));\n const types = new Map(core.types.map((item) => [item.id, item]));\n const variables = new Map(\n [\n ...core.variables,\n ...core.functions.flatMap((item) => [...item.parameters, ...item.locals]),\n ...core.blocks.flatMap((item) => [\n ...item.inputs,\n ...item.outputs,\n ...item.state,\n ...item.locals,\n ]),\n ].map((item) => [item.id, item]),\n );\n\n const path = (segments: CorePath = []): void => {\n segments.forEach((segment) => {\n if (segment.kind === \"index\") expression(segment.value);\n });\n };\n\n const expression = (value: CoreExpression): void => {\n if (value.kind === \"load\") {\n result.add(value.root);\n path(value.path);\n }\n if (value.kind === \"borrow\") {\n result.add(value.place.root);\n path(value.place.path);\n }\n if (value.kind === \"unary\" || value.kind === \"convert\") expression(value.operand);\n if (value.kind === \"binary\") {\n expression(value.left);\n expression(value.right);\n }\n };\n\n const body = (items: readonly CoreStatement[]): void => {\n for (const item of items) {\n if (item.kind === \"assign\") {\n result.add(item.root);\n path(item.path);\n expression(item.value);\n }\n if (item.kind === \"if\") {\n expression(item.condition);\n body(item.then);\n body(item.else);\n }\n if (item.kind === \"switch\") {\n expression(item.value);\n for (const branch of item.cases) body(branch.body);\n body(item.fallback);\n }\n if (item.kind === \"for\") {\n if (item.dynamic) {\n expression(item.dynamic.start);\n expression(item.dynamic.limit);\n }\n result.add(item.counter);\n body(item.body);\n }\n if (item.kind === \"return\" && item.value) expression(item.value);\n if (item.kind === \"invoke\") {\n if (item.instance && item !== scheduledCall) result.add(item.instance);\n if (item.index) expression(item.index);\n item.arguments.forEach(expression);\n if (item.destination) result.add(item.destination);\n const called = functions.get(item.function);\n if (called && !seen.has(called.id)) {\n seen.add(called.id);\n body(called.body);\n }\n }\n if (item.kind === \"blockUpdate\") {\n result.add(item.instance);\n if (item.index) expression(item.index);\n Object.values(item.inputs).forEach(expression);\n const variable = variables.get(item.instance);\n if (!variable) throw new Error(\"Missing verified instance during task planning.\");\n const type = instancedBlock(variable.type, types);\n const block = type && blocks.get(type.block);\n if (block && !seen.has(block.id)) {\n seen.add(block.id);\n body(block.body);\n }\n }\n }\n };\n\n seen.add(fn.id);\n body(fn.body);\n return result;\n}\n",
|
|
16
|
+
"import { instancedBlock } from \"@tsplc/compiler/ir\";\nimport type {\n CoreExpression,\n CoreFunction,\n CorePath,\n CoreStatement,\n PlcProgram,\n SourceSpan,\n Task,\n VerifiedCoreModule,\n} from \"@tsplc/compiler/ir\";\n\ntype Report = (message: string, span?: SourceSpan) => void;\n\nexport function schedulePrograms(\n core: VerifiedCoreModule,\n tasks: readonly Task[],\n report: Report,\n): readonly Task[] {\n const background = new Map<string, Task & { programs: string[] }>();\n for (const program of core.programs) {\n if (!program.background) continue;\n const { priority, intervalNanoseconds } = program.background;\n const name = `TsplcBackground_${priority}_${BigInt(intervalNanoseconds) / 1_000_000n}`;\n const existing = background.get(name);\n if (existing) {\n existing.programs.push(program.name);\n continue;\n }\n background.set(name, {\n name,\n priority,\n intervalNanoseconds,\n programs: [program.name],\n });\n }\n return appendContinuations(core, [...tasks, ...background.values()], report);\n}\n\n/** The generated worker may enter its host, and only mailbox roots are shared between tasks. */\nexport function taskStorageOwnership(\n core: VerifiedCoreModule,\n report: Report,\n): (task: string, program: PlcProgram) => void {\n const owners = new Map<string, string>();\n const globals = new Map(core.variables.map((item) => [item.id, item]));\n const functions = new Map(core.functions.map((item) => [item.id, item]));\n const blocks = new Map(core.blocks.map((block) => [block.id, block.runtime?.kind]));\n const runtimes = new Map(\n core.types.flatMap((type) =>\n type.kind === \"block\" ? [[type.id, blocks.get(type.block)] as const] : [],\n ),\n );\n\n return (task, program) => {\n const fn = functions.get(program.entry);\n if (!fn) throw new Error(\"Verified core has a missing entry.\");\n const worker = program.background?.worker;\n const host =\n worker &&\n core.variables.find(\n (item) =>\n item.name === worker &&\n item.span.file === fn.span.file &&\n runtimes.get(item.type) === \"backgroundHost\",\n );\n for (const id of accessedStorage(fn, core, host ? host.id : undefined)) {\n const item = globals.get(id);\n if (!item || item.storage === \"constant\" || runtimes.get(item.type) === \"mailbox\") continue;\n const ownsWorker = worker === item.name && item.span.file === fn.span.file;\n if (program.background && (!ownsWorker || (host && item.id === host.id)))\n report(\n `Background task ${program.name} accesses scan-owned storage ${item.name}; pass value snapshots through the mailbox.`,\n item.span,\n );\n const owner = owners.get(id);\n if (owner && owner !== task)\n report(\n `Storage ${item.name} is shared across cyclic tasks ${owner} and ${task}.`,\n item.span,\n );\n owners.set(id, task);\n }\n };\n}\n\n// Follow both helper calls and instance updates. Borrow addresses count as storage\n// access, so scheduling cannot accidentally give one mutable record two owners.\nexport function accessedStorage(\n fn: CoreFunction,\n core: VerifiedCoreModule,\n scheduledHost?: string,\n): Set<string> {\n // Only the generated entry's worker call may borrow its host. Ordinary calls\n // reached through the async body still count as access to scan-owned storage.\n const scheduledCall = fn.body.find(\n (item) => item.kind === \"invoke\" && item.instance === scheduledHost,\n );\n const result = new Set<string>(),\n seen = new Set<string>();\n const functions = new Map(core.functions.map((item) => [item.id, item]));\n const blocks = new Map(core.blocks.map((item) => [item.id, item]));\n const types = new Map(core.types.map((item) => [item.id, item]));\n const variables = new Map(\n [\n ...core.variables,\n ...core.functions.flatMap((item) => [...item.parameters, ...item.locals]),\n ...core.blocks.flatMap((item) => [\n ...item.inputs,\n ...item.outputs,\n ...item.state,\n ...item.locals,\n ]),\n ].map((item) => [item.id, item]),\n );\n\n const path = (segments: CorePath = []): void => {\n segments.forEach((segment) => {\n if (segment.kind === \"index\") expression(segment.value);\n });\n };\n\n const expression = (value: CoreExpression): void => {\n if (value.kind === \"load\") {\n result.add(value.root);\n path(value.path);\n }\n if (value.kind === \"borrow\") {\n result.add(value.place.root);\n path(value.place.path);\n }\n if (value.kind === \"unary\" || value.kind === \"convert\") expression(value.operand);\n if (value.kind === \"binary\") {\n expression(value.left);\n expression(value.right);\n }\n };\n\n const body = (items: readonly CoreStatement[]): void => {\n for (const item of items) {\n if (item.kind === \"assign\") {\n result.add(item.root);\n path(item.path);\n expression(item.value);\n }\n if (item.kind === \"if\") {\n expression(item.condition);\n body(item.then);\n body(item.else);\n }\n if (item.kind === \"switch\") {\n expression(item.value);\n for (const branch of item.cases) body(branch.body);\n body(item.fallback);\n }\n if (item.kind === \"for\") {\n if (item.dynamic) {\n expression(item.dynamic.start);\n expression(item.dynamic.limit);\n }\n result.add(item.counter);\n body(item.body);\n }\n if (item.kind === \"return\" && item.value) expression(item.value);\n if (item.kind === \"invoke\") {\n if (item.instance && item !== scheduledCall) result.add(item.instance);\n if (item.index) expression(item.index);\n item.arguments.forEach(expression);\n if (item.destination) result.add(item.destination);\n const called = functions.get(item.function);\n if (called && !seen.has(called.id)) {\n seen.add(called.id);\n body(called.body);\n }\n }\n if (item.kind === \"blockUpdate\") {\n result.add(item.instance);\n if (item.index) expression(item.index);\n Object.values(item.inputs).forEach(expression);\n const variable = variables.get(item.instance);\n if (!variable) throw new Error(\"Missing verified instance during task planning.\");\n const type = instancedBlock(variable.type, types);\n const block = type && blocks.get(type.block);\n if (block && !seen.has(block.id)) {\n seen.add(block.id);\n body(block.body);\n }\n }\n }\n };\n\n seen.add(fn.id);\n body(fn.body);\n return result;\n}\n\n/** Detached continuations run after their caller programs in the same cyclic task. */\nfunction appendContinuations(\n core: VerifiedCoreModule,\n tasks: readonly Task[],\n report: Report,\n): readonly Task[] {\n const continuations = core.programs.flatMap((program) =>\n program.continuation ? [{ name: program.name, scope: program.continuation }] : [],\n );\n if (!continuations.length) return tasks;\n\n const programs = new Map(core.programs.map((program) => [program.name, program]));\n const functions = new Map(core.functions.map((routine) => [routine.id, routine]));\n const placements = tasks.map((task): { task: Task; roots: Set<string>; additions: string[] } => {\n const roots = new Set<string>();\n for (const name of task.programs) {\n const program = programs.get(name);\n if (!program || program.background) continue;\n const entry = functions.get(program.entry);\n if (entry) for (const id of accessedStorage(entry, core)) roots.add(id);\n }\n return { task, roots, additions: [] };\n });\n for (const { name, scope } of continuations) {\n const root = core.variables.find(\n (variable) => variable.name === scope.instance && variable.span.file === scope.file,\n );\n if (!root) {\n report(`Missing continuation owner ${scope.instance}.`);\n continue;\n }\n const owners = placements.filter(({ roots }) => roots.has(root.id));\n const [owner] = owners;\n if (!owner || owners.length !== 1) {\n report(\n `Continuation owner ${scope.instance} must belong to exactly one caller task.`,\n root.span,\n );\n continue;\n }\n owner.additions.push(name);\n }\n return placements.map(({ task, additions }) => ({\n ...task,\n programs: task.programs.concat(additions),\n }));\n}\n",
|
|
15
17
|
"import type { Publication } from \"@tsplc/config\";\nimport type { VerifiedCoreModule } from \"@tsplc/compiler/ir\";\nimport { moduleName } from \"./storage.ts\";\n\nconst globals = (core: VerifiedCoreModule) =>\n core.variables.filter((variable) => variable.storage === \"module\" && variable.exported);\n\n/** Source names are independent of CODESYS name allocation and the active build target. */\nexport const publicationSelectors = (core: VerifiedCoreModule): string[] => {\n const variables = globals(core);\n return [\n ...new Set(\n variables.flatMap((variable) => [\n moduleName(variable),\n `${moduleName(variable)}.${variable.name}`,\n ]),\n ),\n ].sort();\n};\n\nexport const resolvePublication = (\n core: VerifiedCoreModule,\n policy: Publication,\n): { publication: Publication; errors: string[] } => {\n const variables = globals(core);\n const errors: string[] = [];\n const select = (selectors: readonly string[]) => {\n const selected = new Set(\n variables.filter((variable) => variable.exposure).map((variable) => variable.id),\n );\n const seen = new Set<string>();\n for (const selector of selectors) {\n if (seen.has(selector)) errors.push(`Duplicate publication selector ${selector}.`);\n seen.add(selector);\n const candidates = variables.filter(\n (variable) =>\n selector === moduleName(variable) ||\n selector === `${moduleName(variable)}.${variable.name}`,\n );\n if (!candidates.length) {\n errors.push(\n `Unknown publication selector ${selector}; select an exported mutable global or its module.`,\n );\n continue;\n }\n if (new Set(candidates.map((variable) => variable.span.file)).size !== 1) {\n errors.push(`Ambiguous publication selector ${selector}.`);\n continue;\n }\n for (const variable of candidates) selected.add(variable.id);\n }\n return variables.filter((variable) => selected.has(variable.id)).map((variable) => variable.id);\n };\n const publication = {\n production: select(policy.production),\n development: select(policy.development),\n };\n return { publication, errors };\n};\n",
|
|
16
|
-
"import { instancedBlock } from \"@tsplc/compiler/ir\";\nimport type { Constant, GeneratedObject, PlcType } from \"@tsplc/compiler/ir\";\nimport { Names } from \"./names.ts\";\nimport { scalarLiteral } from \"./numeric.ts\";\n\nexport class CodesysTypes {\n readonly objects: GeneratedObject[] = [];\n private readonly names = new Map<string, string>();\n private readonly fields = new Map<string, Map<string, string>>();\n\n constructor(\n private readonly types: ReadonlyMap<string, PlcType>,\n names: Names,\n blockNames: ReadonlyMap<string, string>,\n ) {\n // Register every type and member name before following layout dependencies.\n for (const type of types.values()) {\n if (type.kind === \"block\") {\n const name = blockNames.get(type.block);\n if (!name) throw new Error(\"Missing verified block name\");\n this.names.set(type.id, name);\n }\n if ([\"record\", \"array\", \"enum\", \"string\"].includes(type.kind)) {\n const label = type.id.split(\":\").at(-1)!;\n if (type.kind === \"record\" || type.kind === \"enum\") {\n const prefix = type.kind === \"record\" ? \"ST\" : \"E\";\n this.names.set(type.id, names.allocateObject(prefix, label));\n } else this.names.set(type.id, names.allocate(`T_${label}`));\n }\n if (type.kind === \"record\" || type.kind === \"enum\") {\n const names = new Names(),\n fields = new Map<string, string>();\n for (const member of type.kind === \"record\" ? type.fields : type.members) {\n fields.set(member.name, names.allocate(member.name, true));\n }\n this.fields.set(type.id, fields);\n }\n }\n\n // A block array is declared in place: a function block cannot be a data type's element.\n for (const type of types.values())\n if (type.kind === \"array\" && instancedBlock(type.id, types))\n this.names.set(\n type.id,\n `ARRAY[${type.lowerBound}..${type.lowerBound + type.length - 1}] OF ${this.name(type.element)}`,\n );\n\n // Verified layouts are acyclic. Emit child DUTs first, then their containing DUT.\n const emitted = new Set<string>();\n const emit = (type: PlcType): void => {\n if (instancedBlock(type.id, types) || !this.names.has(type.id) || emitted.has(type.id))\n return;\n if (type.kind === \"array\") emit(this.type(type.element));\n if (type.kind === \"record\") {\n for (const field of type.fields) emit(this.type(field.type));\n }\n emitted.add(type.id);\n const name = this.name(type.id);\n let declaration: string;\n if (type.kind === \"record\") {\n const fields = type.fields\n .map((field) => ` ${this.field(type.id, field.name)} : ${this.name(field.type)};`)\n .join(\"\\n\");\n declaration = `TYPE ${name} :\nSTRUCT\n${fields}\nEND_STRUCT\nEND_TYPE\n`;\n } else if (type.kind === \"array\") {\n declaration = `TYPE ${name} : ARRAY[${type.lowerBound}..${type.lowerBound + type.length - 1}] OF ${this.name(type.element)};\nEND_TYPE\n`;\n } else if (type.kind === \"string\") {\n declaration = `TYPE ${name} : ${type.encoding === \"utf8\" ? \"STRING\" : \"WSTRING\"}(${type.capacity});\nEND_TYPE\n`;\n } else if (type.kind === \"enum\") {\n const members = type.members\n .map((member) => ` ${this.field(type.id, member.name)} := ${member.value}`)\n .join(\",\\n\");\n declaration = `{attribute 'qualified_only'}\n{attribute 'strict'}\nTYPE ${name} : (\n${members}\n) DINT;\nEND_TYPE\n`;\n } else throw new Error(\"Unsupported verified data type\");\n this.objects.push({ id: type.id, kind: \"dataType\", name, declaration });\n };\n for (const type of types.values()) emit(type);\n }\n\n private type(id: string): PlcType {\n const type = this.types.get(id);\n if (!type) throw new Error(\"Missing verified type\");\n return type;\n }\n\n name(id: string): string {\n return this.names.get(id) ?? id;\n }\n\n field(id: string, name: string): string {\n const field = this.fields.get(id)?.get(name);\n if (!field) throw new Error(\"Missing verified field\");\n return field;\n }\n\n declarationInitializer(value: Constant, id: string): string {\n const type = this.type(id);\n // Our DUT fields have no custom initializers. CODESYS initializes their\n // numbers/BOOL/strings to zero/false/empty, including nested arrays/records.\n // Keep explicit nonzero enum members and signed floating zero: omission must\n // not change the initial value selected by PLC semantics.\n if ((type.kind === \"record\" || type.kind === \"array\") && this.isZero(value)) return \"\";\n return ` := ${this.literal(value, id)}`;\n }\n\n private isZero(value: Constant): boolean {\n if (value.kind === \"bool\") return !value.value;\n if (value.kind === \"integer\") return value.value === \"0\";\n if (value.kind === \"float\") return Object.is(value.value, 0);\n if (value.kind === \"string\") return value.value === \"\";\n if (value.kind === \"array\") return value.items.every((item) => this.isZero(item));\n if (value.kind === \"record\")\n return Object.values(value.fields).every((item) => this.isZero(item));\n // Time/calendar values remain explicit without relying on target defaults.\n return false;\n }\n\n literal(value: Constant, id: string): string {\n const type = this.type(id);\n if (type.kind === \"enum\" && value.kind === \"integer\") {\n const member = type.members.find((member) => member.value === value.value);\n if (!member) throw new Error(\"Missing verified enum member\");\n return `${this.name(id)}.${this.field(id, member.name)}`;\n }\n if (type.kind === \"string\" && value.kind === \"string\") {\n const wide = type.encoding === \"utf16\",\n quote = wide ? '\"' : \"'\";\n let text = \"\";\n for (const char of value.value) {\n const code = char.charCodeAt(0);\n if (char === \"$\") text += \"$$\";\n else if (char === quote) text += `$${char}`;\n else if (code < 32 || code === 127)\n text += `$${code\n .toString(16)\n .toUpperCase()\n .padStart(wide ? 4 : 2, \"0\")}`;\n else text += char;\n }\n return `${quote}${text}${quote}`;\n }\n if (type.kind === \"array\" && value.kind === \"array\") {\n return `[${value.items.map((item) => this.literal(item, type.element)).join(\", \")}]`;\n }\n if (type.kind === \"record\" && value.kind === \"record\") {\n const fields = type.fields.map((field) => {\n const initial = value.fields[field.name];\n if (!initial) throw new Error(\"Missing verified record initializer\");\n return `${this.field(id, field.name)} := ${this.literal(initial, field.type)}`;\n });\n return `(${fields.join(\", \")})`;\n }\n if (type.kind === \"duration\" && value.kind === \"duration\") {\n return `T#${BigInt(value.nanoseconds) / 1_000_000n}ms`;\n }\n if (type.kind === \"calendar\" && value.kind === \"calendar\") {\n if (type.domain === \"date\") return `D#${value.value}`;\n if (type.domain === \"timeOfDay\") return `TOD#${value.value}`;\n return `DT#${value.value.replace(\"T\", \"-\")}`;\n }\n return scalarLiteral(value, id);\n }\n}\n",
|
|
17
18
|
"import type { Diagnostic, EmitResult } from \"@tsplc/compiler/ir\";\nimport { CodesysCompilerError } from \"@tsplc/build\";\nimport type { SourceMapping } from \"./emit.ts\";\n\ntype MappedBundle = Pick<EmitResult, \"objects\"> & { mappings: readonly SourceMapping[] };\n\n/** Map verified vendor locations; preserve raw context for everything else. */\nexport function diagnoseCodesys(cause: unknown, bundle: MappedBundle): readonly Diagnostic[] {\n const notes: string[] = [];\n let current = cause;\n while (current instanceof Error) {\n if (current instanceof CodesysCompilerError && current.diagnostics.length) {\n return current.diagnostics.map((item) => {\n // Observed in CODESYS 3.5 SP22. position itself is an opaque vendor value.\n const location =\n item.positionText &&\n /^Line ([1-9][0-9]*)(?:, Column ([1-9][0-9]*))? \\((Decl|Impl)\\)$/.exec(item.positionText);\n const identity = item.object;\n let objectPath: string | undefined;\n if (identity && identity.path.at(-1) === identity.name) {\n const relative = identity.applicationPath;\n if (\n Array.isArray(relative) &&\n relative.length > 0 &&\n relative.every((part) => typeof part === \"string\") &&\n identity.isApplicationChild === (relative.length === 1) &&\n identity.path.length > relative.length &&\n identity.path.slice(-relative.length).every((part, index) => part === relative[index])\n ) {\n objectPath = relative.join(\"/\");\n } else if (\n relative === undefined &&\n identity.isApplicationChild === true &&\n identity.path.length >= 2\n ) {\n // A verified immediate Application parent proves the root identity.\n objectPath = identity.name;\n }\n }\n const objects = objectPath\n ? bundle.objects.flatMap((object) => {\n const declaration =\n object.sourcePath ??\n (object.implementation === undefined\n ? `${object.name}.st`\n : `${object.name}/declaration.st`);\n const nativePath = (\n object.kind === \"method\"\n ? declaration.replace(/\\/methods\\/([^/]+\\/declaration\\.st)$/, \"/$1\")\n : declaration\n ).replace(object.implementation === undefined ? /\\.st$/ : /\\/declaration\\.st$/, \"\");\n return object.name === identity?.name && nativePath === objectPath\n ? [{ object, declaration }]\n : [];\n })\n : [];\n const match = objects.length === 1 ? objects[0] : undefined;\n const section = location?.[3] === \"Decl\" ? \"declaration\" : \"implementation\";\n const path =\n section === \"declaration\"\n ? match?.declaration\n : match?.object.implementation !== undefined\n ? match.declaration.replace(/declaration\\.st$/, \"implementation.st\")\n : undefined;\n const mappings =\n location && path\n ? bundle.mappings.filter(\n (mapping) => mapping.path === path && mapping.line === Number(location[1]),\n )\n : [];\n const mapping = mappings.length === 1 ? mappings[0] : undefined;\n return {\n origin: \"vendor\",\n code: \"PLC8001\",\n severity: \"error\",\n message: item.text,\n ...(mapping && { span: mapping.span }),\n notes: [\n ...notes,\n ...(location && path\n ? [\n \"Generated ST: \" +\n path +\n \":\" +\n location[1] +\n (location[2] ? `:${location[2]}` : \"\"),\n ]\n : []),\n `CODESYS diagnostic: ${JSON.stringify(item)}`,\n ],\n };\n });\n }\n notes.push(current.message);\n if (current.cause === undefined) break;\n current = current.cause;\n if (!(current instanceof Error)) notes.push(String(current));\n }\n return [\n {\n origin: \"vendor\",\n code: \"PLC8001\",\n severity: \"error\",\n message: cause instanceof Error ? cause.message : String(cause),\n ...(notes.length > 1 && { notes: notes.slice(1) }),\n },\n ];\n}\n"
|
|
18
19
|
],
|
|
19
|
-
"mappings": "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",
|
|
20
|
-
"debugId": "
|
|
20
|
+
"mappings": "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",
|
|
21
|
+
"debugId": "C98587762BFC22D464756E2164756E21",
|
|
21
22
|
"names": []
|
|
22
23
|
}
|