@mica-js/core 0.1.0 → 0.1.1

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Placeholder export so the build and test pipeline has something to verify.\n * Replace with the virtual time and event scheduler API.\n */\nexport const MICA_CORE_VERSION = '0.0.0';\n"],"mappings":";;;;;AAIA,IAAa,oBAAoB"}
1
+ {"version":3,"file":"index.js","names":["compareText","compareText","pinKey","compareText"],"sources":["../src/scheduler/time.ts","../src/scheduler/errors.ts","../src/scheduler/queue.ts","../src/scheduler/values.ts","../src/scheduler/runtime.ts","../src/scheduler/ir-adapter.ts","../src/electrical/validation.ts","../src/electrical/network.ts","../src/electrical/floating-input.ts","../src/topology/runtime.ts","../src/power/validation.ts","../src/power/runtime.ts","../src/index.ts"],"sourcesContent":["declare const timeBrand: unique symbol;\n\nexport type TimePs = number & { readonly [timeBrand]: 'TimePs' };\nexport type TimeUnit = 'ps' | 'ns' | 'us' | 'ms' | 's';\nexport const MAX_TIME_PS = 7_200_000_000_000_000;\n\nconst factors: Readonly<Record<TimeUnit, number>> = {\n ps: 1,\n ns: 1_000,\n us: 1_000_000,\n ms: 1_000_000_000,\n s: 1_000_000_000_000,\n};\n\nfunction checked(value: number, name: string): TimePs {\n if (typeof value !== 'number' || !Number.isFinite(value) || !Number.isInteger(value)) {\n throw new TypeError(`${name}=${String(value)} must be a finite integer number of picoseconds`);\n }\n if (value < 0 || value > MAX_TIME_PS) {\n throw new RangeError(`${name}=${value} must be in [0, ${MAX_TIME_PS}] ps`);\n }\n return (value === 0 ? 0 : value) as TimePs;\n}\n\nexport function timePs(value: number): TimePs {\n return checked(value, 'time');\n}\n\nexport function toTimePs(value: number, unit: TimeUnit): TimePs {\n if (typeof unit !== 'string' || !Object.hasOwn(factors, unit)) {\n throw new TypeError(`unit=${String(unit)} must be ps, ns, us, ms, or s`);\n }\n checked(value, `input (${unit})`);\n return checked(value * factors[unit], `conversion ${String(value)} ${unit} to ps`);\n}\n\nexport function addTime(left: number, right: number): TimePs {\n checked(left, 'left');\n checked(right, 'right');\n return checked(left + right, `addition ${left} + ${right}`);\n}\n\nexport function subtractTime(later: number, earlier: number): TimePs {\n checked(later, 'later');\n checked(earlier, 'earlier');\n return checked(later - earlier, `subtraction ${later} - ${earlier}`);\n}\n","export type SchedulerErrorCode =\n | 'invalid-options'\n | 'invalid-instance'\n | 'invalid-target'\n | 'invalid-argument'\n | 'invalid-event-id'\n | 'event-id-exhausted'\n | 'reentrant-execution'\n | 'executor-contract'\n | 'entry-budget-exhausted'\n | 'time-budget-exhausted'\n | 'execution-failed'\n | 'scheduler-faulted';\n\ninterface Details {\n readonly instanceId?: string;\n readonly targetName?: string;\n readonly timePs: number;\n readonly phase?: 'event' | 'control';\n readonly eventId?: number;\n readonly steps?: number;\n readonly entriesAtTime?: number;\n readonly cause?: unknown;\n}\n\nexport class SchedulerError extends Error {\n override readonly name = 'SchedulerError';\n readonly instanceId: string | undefined;\n readonly targetName: string | undefined;\n readonly timePs: number;\n readonly phase: 'event' | 'control' | undefined;\n readonly eventId: number | undefined;\n readonly steps: number;\n readonly entriesAtTime: number;\n override readonly cause: unknown;\n\n constructor(\n readonly code: SchedulerErrorCode,\n message: string,\n details: Details,\n ) {\n super(message, { cause: details.cause });\n this.instanceId = details.instanceId;\n this.targetName = details.targetName;\n this.timePs = details.timePs;\n this.phase = details.phase;\n this.eventId = details.eventId;\n this.steps = details.steps ?? 0;\n this.entriesAtTime = details.entriesAtTime ?? 0;\n this.cause = details.cause;\n }\n}\n","export class MinHeap<T> {\n readonly #items: T[] = [];\n\n constructor(readonly compare: (left: T, right: T) => number) {}\n\n peek(): T | undefined {\n return this.#items[0];\n }\n\n /** Drops non-matching items so callers can release references while preserving heap order. */\n retain(predicate: (item: T) => boolean): void {\n const kept = this.#items.filter(predicate);\n this.#items.length = 0;\n for (const item of kept) this.push(item);\n }\n\n push(item: T): void {\n const items = this.#items;\n let index = items.length;\n items.push(item);\n while (index > 0) {\n const parent = Math.floor((index - 1) / 2);\n if (this.compare(items[parent]!, item) <= 0) break;\n items[index] = items[parent]!;\n index = parent;\n }\n items[index] = item;\n }\n\n pop(): T | undefined {\n const items = this.#items;\n const first = items[0];\n const last = items.pop();\n if (items.length === 0 || last === undefined) return first;\n let index = 0;\n while (index * 2 + 1 < items.length) {\n let child = index * 2 + 1;\n if (child + 1 < items.length && this.compare(items[child + 1]!, items[child]!) < 0) {\n child += 1;\n }\n if (this.compare(last, items[child]!) <= 0) break;\n items[index] = items[child]!;\n index = child;\n }\n items[index] = last;\n return first;\n }\n}\n\nexport class EventIdPool {\n #highest = 0;\n #released: number[] = [];\n #head = 0;\n\n constructor(readonly maximum = 0xffff_ffff) {}\n\n allocated(id: number): boolean {\n return id <= this.#highest;\n }\n\n take(): number | undefined {\n if (this.#head < this.#released.length) {\n const id = this.#released[this.#head++]!;\n if (this.#head >= 1024 && this.#head * 2 >= this.#released.length) {\n this.#released = this.#released.slice(this.#head);\n this.#head = 0;\n }\n return id;\n }\n if (this.#highest === this.maximum) return undefined;\n this.#highest += 1;\n return this.#highest;\n }\n\n release(id: number): void {\n this.#released.push(id);\n }\n}\n","import { evaluateFloatInstruction, evaluateScalarInstruction, SCALAR_TYPES } from '@mica-js/ir';\nimport type { RuntimeScalar, ScalarType, Value } from '@mica-js/ir';\n\nexport function scalarType(value: unknown): value is ScalarType {\n return typeof value === 'string' && (SCALAR_TYPES as readonly string[]).includes(value);\n}\n\nexport function captureArgs(\n types: readonly ScalarType[],\n args: readonly RuntimeScalar[],\n): readonly RuntimeScalar[] {\n if (!Array.isArray(args) || args.length !== types.length) {\n throw new TypeError(`Expected ${types.length} scalar arguments`);\n }\n return Object.freeze(\n types.map((type, index) => {\n const input = { type } as Value;\n const node = {\n op: 'select',\n operands: [\n { kind: 'ssa' as const, value: { type: 'bool' } as Value<'bool'> },\n { kind: 'ssa' as const, value: input },\n { kind: 'ssa' as const, value: input },\n ],\n results: [input],\n };\n const value = args[index]!;\n const result =\n type === 'f32' || type === 'f64'\n ? evaluateFloatInstruction(node, [true, value, value])\n : evaluateScalarInstruction(node, [true, value, value] as readonly (boolean | number)[]);\n return typeof result === 'object'\n ? Object.freeze({ type: result.type, bits: result.bits })\n : result;\n }),\n );\n}\n\nexport function synchronous(fn: unknown): fn is (...args: never[]) => unknown {\n return typeof fn === 'function' && Object.prototype.toString.call(fn) === '[object Function]';\n}\n\nexport function returnedSynchronously(value: unknown): boolean {\n if (value === undefined) return true;\n if ((typeof value === 'object' && value !== null) || typeof value === 'function') {\n if (typeof (value as { then?: unknown }).then === 'function') {\n void Promise.resolve(value).catch(() => undefined);\n }\n }\n return false;\n}\n","import type { RuntimeScalar } from '@mica-js/ir';\nimport { SchedulerError } from './errors';\nimport type { SchedulerErrorCode } from './errors';\nimport { EventIdPool, MinHeap } from './queue';\nimport { captureArgs, returnedSynchronously, scalarType, synchronous } from './values';\nimport type {\n Scheduler,\n SchedulerExecutionContext,\n SchedulerInstance,\n SchedulerInstanceDefinition,\n SchedulerOptions,\n SchedulerRunOptions,\n SchedulerRunResult,\n SchedulerTarget,\n} from './types';\nimport { MAX_TIME_PS, timePs } from './time';\nimport type { TimePs } from './time';\n\ninterface InstanceState {\n readonly handle: SchedulerInstance;\n readonly targets: ReadonlyMap<SchedulerTarget, SchedulerTarget>;\n readonly execute: SchedulerInstanceDefinition['executor']['execute'];\n readonly receiver: SchedulerInstanceDefinition['executor'];\n readonly ids: EventIdPool;\n readonly active: Map<number, Work>;\n destroyRequested: boolean;\n destroyed: boolean;\n}\n\ninterface Work {\n readonly instance: InstanceState;\n readonly target: SchedulerTarget;\n readonly args: readonly RuntimeScalar[];\n readonly time: TimePs;\n readonly round: bigint;\n readonly sequence: bigint;\n readonly id: number;\n status: 'pending' | 'running' | 'cancelled' | 'completed' | 'failed';\n}\n\nfunction compare(left: Work, right: Work): number {\n if (left.time !== right.time) return left.time < right.time ? -1 : 1;\n if (left.target.kind !== right.target.kind) return left.target.kind === 'control' ? -1 : 1;\n if (left.round !== right.round) return left.round < right.round ? -1 : 1;\n return left.sequence < right.sequence ? -1 : left.sequence === right.sequence ? 0 : 1;\n}\n\nfunction limit(value: number | undefined, fallback: number, name: string): number {\n const result = value === undefined ? fallback : value;\n if (!Number.isSafeInteger(result) || result < 0) {\n throw new SchedulerError(\n 'invalid-options',\n `${name}=${String(result)} must be a non-negative safe integer`,\n { timePs: 0 },\n );\n }\n return result;\n}\n\nexport function createScheduler(options: SchedulerOptions = {}): Scheduler {\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw new SchedulerError('invalid-options', 'Expected scheduler options', { timePs: 0 });\n }\n return new DeterministicScheduler(\n limit(options.maxStepsPerEntry, 1_000_000, 'maxStepsPerEntry'),\n limit(options.maxEntriesPerTime, 1_000_000, 'maxEntriesPerTime'),\n );\n}\n\nclass DeterministicScheduler implements Scheduler {\n readonly #queue = new MinHeap<Work>(compare);\n readonly #instances = new Map<SchedulerInstance, InstanceState>();\n readonly #identities = new Set<string>();\n readonly #destruction = new Set<InstanceState>();\n readonly #maxSteps: number;\n readonly #maxEntries: number;\n #now = timePs(0);\n #state: Scheduler['state'] = 'paused';\n #error: SchedulerError | undefined;\n #sequence = 0n;\n #ordinaryRound = 0n;\n #controlRound = 0n;\n #ordinaryStarted = false;\n #controlStarted = false;\n #entries = 0;\n #steps = 0;\n #current: Work | undefined;\n #pauseRequested = false;\n\n constructor(maxSteps: number, maxEntries: number) {\n this.#maxSteps = maxSteps;\n this.#maxEntries = maxEntries;\n Object.freeze(this);\n }\n\n get now(): TimePs {\n return this.#now;\n }\n get state(): Scheduler['state'] {\n return this.#state;\n }\n get error(): SchedulerError | undefined {\n return this.#error;\n }\n\n addInstance(definition: SchedulerInstanceDefinition): SchedulerInstance {\n return this.#boundary(() => {\n if (definition === null || typeof definition !== 'object') {\n throw this.#problem('invalid-instance', 'Expected instance definition');\n }\n const { instanceId, targets, executor } = definition;\n if (\n typeof instanceId !== 'string' ||\n instanceId.length === 0 ||\n this.#identities.has(instanceId)\n ) {\n throw this.#problem(\n 'invalid-instance',\n `instanceId=${String(instanceId)} must be nonempty and never reused`,\n );\n }\n if (!Array.isArray(targets))\n throw this.#problem('invalid-target', 'Expected target declarations');\n const captured = new Map<SchedulerTarget, SchedulerTarget>();\n for (const target of targets) {\n if (target === null || typeof target !== 'object' || captured.has(target)) {\n throw this.#problem('invalid-target', 'Expected distinct target declaration objects');\n }\n const { name, kind, params } = target;\n if (\n typeof name !== 'string' ||\n name.length === 0 ||\n (kind !== 'event' && kind !== 'control') ||\n !Array.isArray(params) ||\n !Array.from(params).every(scalarType)\n ) {\n throw this.#problem(\n 'invalid-target',\n 'Target requires name, event/control kind, and scalar params',\n );\n }\n const snapshot = Object.freeze({ name, kind, params: Object.freeze([...params]) });\n captured.set(target, snapshot);\n captured.set(snapshot, snapshot);\n }\n if (executor === null || typeof executor !== 'object' || !synchronous(executor.execute)) {\n throw this.#problem(\n 'executor-contract',\n 'Executor.execute must be a synchronous non-generator method',\n );\n }\n const execute = executor.execute;\n const handle: SchedulerInstance = Object.freeze({\n instanceId,\n at: (target: SchedulerTarget, deadline: number, args: readonly RuntimeScalar[]) =>\n this.#boundary(() => this.#at(this.#instance(handle), target, deadline, args)),\n cancel: (id: number) => this.#boundary(() => this.#cancel(this.#instance(handle), id)),\n });\n const instance: InstanceState = {\n handle,\n targets: captured,\n execute,\n receiver: executor,\n ids: new EventIdPool(),\n active: new Map(),\n destroyRequested: false,\n destroyed: false,\n };\n this.#identities.add(instanceId);\n this.#instances.set(handle, instance);\n return handle;\n });\n }\n\n enqueueControl(\n handle: SchedulerInstance,\n target: SchedulerTarget,\n args: readonly RuntimeScalar[],\n ): void {\n this.#boundary(() => {\n const instance = this.#instance(handle);\n const captured = this.#target(instance, target, 'control');\n const inputs = this.#arguments(captured, args);\n this.#queue.push({\n instance,\n target: captured,\n args: inputs,\n time: this.#now,\n round: this.#controlStarted ? this.#controlRound + 1n : 0n,\n sequence: this.#sequence++,\n id: 0,\n status: 'pending',\n });\n });\n }\n\n destroyInstance(handle: SchedulerInstance): void {\n // Cleanup is not a resume: a faulted scheduler must still release a live instance's\n // queued work and backend references. start/step/cancel keep rejecting while faulted.\n const instance = this.#instances.get(handle);\n if (instance === undefined || instance.destroyed || instance.destroyRequested) {\n if (this.#error !== undefined) {\n throw this.#problem(\n 'scheduler-faulted',\n 'Scheduler faulted; rebuild instead of resuming',\n this.#error,\n );\n }\n throw this.#problem('invalid-instance', 'Instance is foreign, destroyed, or stopping');\n }\n instance.destroyRequested = true;\n this.#destruction.add(instance);\n if (this.#current === undefined) this.#flushDestruction();\n }\n\n start(options: SchedulerRunOptions = {}): SchedulerRunResult {\n return this.#boundary(() => {\n if (this.#state === 'running')\n throw this.#problem(\n 'reentrant-execution',\n 'Cannot recursively start or step the scheduler',\n );\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw this.#problem('invalid-options', 'Expected run options');\n }\n const until = options.until === undefined ? undefined : this.#deadline(options.until);\n const maxEntries = limit(options.maxEntries, Number.MAX_SAFE_INTEGER, 'maxEntries');\n this.#state = 'running';\n this.#pauseRequested = false;\n let executed = 0;\n const result = (reason: SchedulerRunResult['reason']): SchedulerRunResult =>\n Object.freeze({ timePs: this.#now, executed, reason });\n try {\n for (;;) {\n if (this.#pauseRequested) return result('paused');\n if (executed >= maxEntries) return result('entry-limit');\n const work = this.#next();\n if (work === undefined || (until !== undefined && work.time > until)) {\n if (until !== undefined) {\n this.#setTime(until);\n return result('until');\n }\n return result('empty');\n }\n this.#setTime(work.time);\n this.#execute(work);\n executed += 1;\n }\n } finally {\n if (this.#error === undefined) this.#state = 'paused';\n }\n });\n }\n\n pause(): void {\n if (this.#state === 'running') this.#pauseRequested = true;\n }\n\n step(): SchedulerRunResult {\n return this.start({ maxEntries: 1 });\n }\n\n #at(\n instance: InstanceState,\n target: SchedulerTarget,\n deadline: number,\n args: readonly RuntimeScalar[],\n ): number {\n const captured = this.#target(instance, target, 'event');\n const time = this.#deadline(deadline);\n const inputs = this.#arguments(captured, args);\n const id = instance.ids.take();\n if (id === undefined)\n throw this.#problem('event-id-exhausted', 'All nonzero u32 event IDs are occupied');\n const work: Work = {\n instance,\n target: captured,\n args: inputs,\n time,\n round: time === this.#now && this.#ordinaryStarted ? this.#ordinaryRound + 1n : 0n,\n sequence: this.#sequence++,\n id,\n status: 'pending',\n };\n instance.active.set(id, work);\n this.#queue.push(work);\n return id;\n }\n\n #cancel(instance: InstanceState, id: number): void {\n if (\n typeof id !== 'number' ||\n !Number.isInteger(id) ||\n id < 0 ||\n id > 0xffff_ffff ||\n !instance.ids.allocated(id)\n ) {\n throw this.#problem(\n 'invalid-event-id',\n `eventId=${String(id)} must be 0 or a previously allocated u32 in this instance`,\n );\n }\n if (id === 0) return;\n const work = instance.active.get(id);\n if (work === undefined || work.status !== 'pending') return;\n work.status = 'cancelled';\n instance.active.delete(id);\n instance.ids.release(id);\n }\n\n #target(\n instance: InstanceState,\n target: SchedulerTarget,\n kind: SchedulerTarget['kind'],\n ): SchedulerTarget {\n const captured = instance.targets.get(target);\n if (captured === undefined || captured.kind !== kind) {\n throw this.#problem('invalid-target', `Expected this instance's registered ${kind} target`);\n }\n return captured;\n }\n\n #arguments(target: SchedulerTarget, args: readonly RuntimeScalar[]): readonly RuntimeScalar[] {\n try {\n return captureArgs(target.params, args);\n } catch (cause) {\n throw this.#problem(\n 'invalid-argument',\n `Arguments for ${target.name} must match its scalar signature`,\n cause,\n );\n }\n }\n\n #instance(handle: SchedulerInstance): InstanceState {\n const instance = this.#instances.get(handle);\n if (instance === undefined || instance.destroyed || instance.destroyRequested) {\n throw this.#problem('invalid-instance', 'Instance is foreign, destroyed, or stopping');\n }\n return instance;\n }\n\n #deadline(value: number): TimePs {\n const deadline = timePs(value);\n if (deadline < this.#now) {\n throw new RangeError(\n `deadline=${deadline} ps must be in [${this.#now}, ${MAX_TIME_PS}] ps (not in the past)`,\n );\n }\n return deadline;\n }\n\n #next(): Work | undefined {\n for (;;) {\n const work = this.#queue.peek();\n if (work === undefined) return undefined;\n if (work.status === 'pending' && !work.instance.destroyed) return work;\n this.#queue.pop();\n }\n }\n\n #setTime(time: TimePs): void {\n if (time === this.#now) return;\n this.#now = time;\n this.#entries = 0;\n this.#ordinaryRound = 0n;\n this.#controlRound = 0n;\n this.#ordinaryStarted = false;\n this.#controlStarted = false;\n }\n\n #execute(work: Work): void {\n this.#current = work;\n this.#steps = 0;\n try {\n if (this.#entries >= this.#maxEntries) {\n throw this.#problem(\n 'time-budget-exhausted',\n `Exceeded ${this.#maxEntries} entries at ${this.#now} ps`,\n );\n }\n if (this.#maxSteps === 0)\n throw this.#problem('entry-budget-exhausted', 'Entry reference step budget is 0');\n this.#queue.pop();\n work.status = 'running';\n this.#entries += 1;\n if (work.target.kind === 'event') {\n this.#ordinaryRound = work.round;\n this.#ordinaryStarted = true;\n } else {\n this.#controlRound = work.round;\n this.#controlStarted = true;\n }\n const remainingSteps = () => this.#maxSteps - this.#steps;\n const context: SchedulerExecutionContext = Object.freeze({\n instanceId: work.instance.handle.instanceId,\n timePs: this.#now,\n phase: work.target.kind,\n eventId: work.id,\n get remainingSteps() {\n return remainingSteps();\n },\n consumeSteps: (count = 1) =>\n this.#boundary(() => {\n if (this.#current !== work || work.status !== 'running') {\n throw this.#problem(\n 'executor-contract',\n 'Execution context is only valid during its entry',\n );\n }\n if (!Number.isSafeInteger(count) || count < 0) {\n throw this.#problem(\n 'executor-contract',\n 'Step count must be a non-negative safe integer',\n );\n }\n if (count > this.#maxSteps - this.#steps) {\n throw this.#problem(\n 'entry-budget-exhausted',\n `Exceeded ${this.#maxSteps} reference steps`,\n );\n }\n this.#steps += count;\n }),\n });\n const returned: unknown = work.instance.execute.call(\n work.instance.receiver,\n work.target,\n work.args,\n context,\n );\n if (!returnedSynchronously(returned))\n throw this.#problem(\n 'executor-contract',\n 'Executor must return synchronously with no result',\n );\n if (this.#error !== undefined) throw this.#error;\n work.status = 'completed';\n if (work.id !== 0) {\n work.instance.active.delete(work.id);\n work.instance.ids.release(work.id);\n }\n } catch (cause) {\n if (work.status === 'running') work.status = 'failed';\n this.#fault(cause);\n throw this.#error;\n } finally {\n this.#current = undefined;\n this.#flushDestruction();\n }\n }\n\n #flushDestruction(): void {\n for (const instance of this.#destruction) {\n for (const work of instance.active.values()) {\n if (work.status === 'pending') work.status = 'cancelled';\n }\n instance.active.clear();\n instance.destroyed = true;\n this.#instances.delete(instance.handle);\n }\n this.#destruction.clear();\n // Purge cancelled and destroyed-instance records now; control work has no ID and is\n // not in `active`, so the destroyed flag is the authoritative filter. Otherwise a\n // queue that is never driven again would keep targets, executors, and interpreter\n // or topology state reachable.\n this.#queue.retain((work) => work.status === 'pending' && !work.instance.destroyed);\n }\n\n #problem(code: SchedulerErrorCode, message: string, cause?: unknown): SchedulerError {\n const current = this.#current;\n return new SchedulerError(code, message, {\n timePs: this.#now,\n // Boundary failures outside an entry must not inherit the previous entry's count.\n steps: current === undefined ? 0 : this.#steps,\n entriesAtTime: this.#entries,\n cause,\n ...(current === undefined\n ? {}\n : {\n instanceId: current.instance.handle.instanceId,\n targetName: current.target.name,\n phase: current.target.kind,\n eventId: current.id,\n }),\n });\n }\n\n #fault(cause: unknown): void {\n if (cause === this.#error && this.#error !== undefined) return;\n const previous = this.#error;\n const code =\n previous?.code ?? (cause instanceof SchedulerError ? cause.code : 'execution-failed');\n const message =\n previous?.message ?? (cause instanceof Error ? cause.message : 'Entry execution failed');\n this.#error = this.#problem(code, message, cause);\n this.#state = 'faulted';\n }\n\n #boundary<T>(action: () => T): T {\n if (this.#error !== undefined)\n throw this.#problem(\n 'scheduler-faulted',\n 'Scheduler faulted; rebuild instead of resuming',\n this.#error,\n );\n try {\n return action();\n } catch (cause) {\n if (this.#current !== undefined) this.#fault(cause);\n throw cause;\n }\n }\n}\n","import { createIRInterpreter } from '@mica-js/ir';\nimport type {\n EntryRef,\n IRModule,\n IRStorage,\n IRValidationOptions,\n LifecycleRef,\n RuntimeScalar,\n} from '@mica-js/ir';\nimport { SchedulerError } from './errors';\nimport type {\n Scheduler,\n SchedulerExecutionContext,\n SchedulerInstance,\n SchedulerTarget,\n} from './types';\n\nexport interface IRSchedulerInstanceDefinition {\n readonly instanceId: string;\n readonly module: IRModule;\n readonly validation: IRValidationOptions;\n}\n\nexport interface IRSchedulerInstance {\n readonly instance: SchedulerInstance;\n readonly storage: IRStorage;\n at(target: EntryRef, deadline: number, args: readonly RuntimeScalar[]): number;\n cancel(id: number): void;\n enqueueControl(target: LifecycleRef, args: readonly RuntimeScalar[]): void;\n}\n\nconst unknownTarget: SchedulerTarget = Object.freeze({\n name: 'unregistered',\n kind: 'event',\n params: [],\n});\n\nexport function createIRSchedulerInstance(\n scheduler: Scheduler,\n definition: IRSchedulerInstanceDefinition,\n): IRSchedulerInstance {\n if (definition === null || typeof definition !== 'object') {\n throw new SchedulerError('invalid-instance', 'Expected IR instance definition', {\n timePs: scheduler.now,\n });\n }\n const { instanceId, module, validation } = definition;\n const captured = {\n memories: module.memories,\n functions: module.functions,\n domainDeclarations: module.domainDeclarations,\n instructions: module.instructions,\n } as IRModule;\n const targets = new Map<EntryRef | LifecycleRef, SchedulerTarget>();\n const entries = new Map<string, EntryRef | LifecycleRef>();\n for (const fn of captured.functions) {\n if (fn.category !== 'entry' && fn.category !== 'lifecycle') continue;\n const target: SchedulerTarget = Object.freeze({\n name: fn.name,\n kind: fn.category === 'entry' ? 'event' : 'control',\n params: Object.freeze([...fn.params]),\n });\n targets.set(fn.ref as EntryRef | LifecycleRef, target);\n entries.set(fn.name, fn.ref as EntryRef | LifecycleRef);\n }\n let active: SchedulerExecutionContext | undefined;\n const context = (): SchedulerExecutionContext => {\n if (active === undefined) {\n throw new SchedulerError(\n 'executor-contract',\n 'IR kernel bridge requires an active scheduler entry',\n { timePs: scheduler.now },\n );\n }\n return active;\n };\n const interpreter = createIRInterpreter(captured, {\n validation,\n maxSteps: Number.MAX_SAFE_INTEGER,\n eventHost: {\n now: () => context().timePs,\n at: (target, deadline, args) => {\n context();\n return instance.at(targets.get(target) ?? unknownTarget, deadline, args);\n },\n cancel: (id) => {\n context();\n instance.cancel(id);\n },\n },\n stepObserver: { beforeStep: () => context().consumeSteps() },\n });\n const instance = scheduler.addInstance({\n instanceId,\n targets: [...targets.values()],\n executor: {\n execute(target, args, executionContext) {\n active = executionContext;\n try {\n interpreter.execute(entries.get(target.name)!, args, {\n instanceId: executionContext.instanceId,\n virtualTime: executionContext.timePs,\n });\n } finally {\n active = undefined;\n }\n },\n },\n });\n return Object.freeze({\n instance,\n storage: interpreter.storage,\n at: (target: EntryRef, deadline: number, args: readonly RuntimeScalar[]) =>\n instance.at(targets.get(target) ?? unknownTarget, deadline, args),\n cancel: (id: number) => instance.cancel(id),\n enqueueControl: (target: LifecycleRef, args: readonly RuntimeScalar[]) =>\n scheduler.enqueueControl(instance, targets.get(target) ?? unknownTarget, args),\n });\n}\n","export function invalidType(path: string, value: unknown, constraint: string): never {\n let display: string;\n try {\n display = String(value);\n } catch {\n display = '<unprintable>';\n }\n throw new TypeError(`${path}: ${display} must ${constraint}`);\n}\n\nexport function checkIdentity(value: unknown, path: string): asserts value is string {\n if (typeof value !== 'string' || value.length === 0) {\n invalidType(path, value, 'be a nonempty string');\n }\n}\n\nexport function checkFinite(value: unknown, path: string): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n invalidType(path, value, 'be a finite number');\n }\n}\n\nexport function checkRange(value: number, min: number, max: number, path: string): void {\n if (value < min || value > max) {\n throw new RangeError(`${path}: ${value} must be within [${min}, ${max}]`);\n }\n}\n\nexport function checkInteger(value: unknown, min: number, max: number, path: string): void {\n checkFinite(value, path);\n if (!Number.isInteger(value)) invalidType(path, value, 'be an integer');\n checkRange(value, min, max, path);\n}\n\nexport function checkSupply(value: unknown): asserts value is number {\n checkFinite(value, 'supplyVoltage');\n if (value < 0) {\n throw new RangeError(`supplyVoltage: ${value} must be nonnegative`);\n }\n}\n\nexport function checkRecord(\n value: unknown,\n path: string,\n fields: readonly string[],\n): asserts value is Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n invalidType(path, value, 'be an object');\n }\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string' || !fields.includes(key)) {\n invalidType(`${path}.${String(key)}`, Reflect.get(value, key), 'be a supported field');\n }\n }\n}\n\nexport function checkBoolean(value: unknown, path: string): asserts value is boolean {\n if (typeof value !== 'boolean') invalidType(path, value, 'be a boolean');\n}\n\nexport function checkChoice<T extends string>(\n value: unknown,\n choices: readonly T[],\n path: string,\n): T {\n if (typeof value !== 'string' || !choices.includes(value as T)) {\n invalidType(path, value, `be one of ${choices.join(', ')}`);\n }\n return value as T;\n}\n","import type {\n ElectricalContribution,\n ElectricalNetworkInput,\n ElectricalNetworkResult,\n ElectricalPinInput,\n} from './types';\nimport {\n checkBoolean,\n checkChoice,\n checkFinite,\n checkIdentity,\n checkRange,\n checkRecord,\n invalidType,\n} from './validation';\n\nfunction compareText(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction compareSources(\n left: Pick<ElectricalPinInput, 'instanceId' | 'pinName'>,\n right: Pick<ElectricalPinInput, 'instanceId' | 'pinName'>,\n): number {\n return compareText(left.instanceId, right.instanceId) || compareText(left.pinName, right.pinName);\n}\n\nconst PIN_FIELDS = [\n 'instanceId',\n 'pinName',\n 'powerReady',\n 'mode',\n 'outputEnabled',\n 'pull',\n 'digitalIntent',\n 'voltageIntent',\n 'model',\n] as const;\nconst MODEL_FIELDS = ['kind', 'minVoltage', 'maxVoltage', 'lowVoltage', 'highVoltage'] as const;\nconst PIN_MODES = ['high-z', 'push-pull', 'open-drain', 'analog'] as const;\nconst PULLS = ['none', 'up', 'down'] as const;\nconst VOLTAGE_MODELS = ['ideal-voltage'] as const;\n\nfunction snapshotModel(value: unknown, path: string): ElectricalPinInput['model'] {\n checkRecord(value, path, MODEL_FIELDS);\n const kind = checkChoice(value.kind, VOLTAGE_MODELS, `${path}.kind`);\n const minVoltage = value.minVoltage;\n const maxVoltage = value.maxVoltage;\n const lowVoltage = value.lowVoltage;\n const highVoltage = value.highVoltage;\n checkFinite(minVoltage, `${path}.minVoltage`);\n checkFinite(maxVoltage, `${path}.maxVoltage`);\n if (minVoltage > maxVoltage) {\n throw new RangeError(`${path}.minVoltage: ${minVoltage} must be <= maxVoltage ${maxVoltage}`);\n }\n checkFinite(lowVoltage, `${path}.lowVoltage`);\n checkFinite(highVoltage, `${path}.highVoltage`);\n checkRange(lowVoltage, minVoltage, maxVoltage, `${path}.lowVoltage`);\n checkRange(highVoltage, minVoltage, maxVoltage, `${path}.highVoltage`);\n if (lowVoltage > highVoltage) {\n throw new RangeError(`${path}.lowVoltage: ${lowVoltage} must be <= highVoltage ${highVoltage}`);\n }\n return Object.freeze({ kind, minVoltage, maxVoltage, lowVoltage, highVoltage });\n}\n\n/** Internal value capture shared with the topology layer; not exported from the package root. */\nexport function snapshotElectricalPin(value: unknown, path: string): ElectricalPinInput {\n checkRecord(value, path, PIN_FIELDS);\n // Read every field exactly once; the frozen snapshot below is the only value\n // later evaluation sees, including for models supplied through getters or prototypes.\n const instanceId = value.instanceId;\n const pinName = value.pinName;\n const powerReady = value.powerReady;\n const outputEnabled = value.outputEnabled;\n const mode = checkChoice(value.mode, PIN_MODES, `${path}.mode`);\n const pull = checkChoice(value.pull, PULLS, `${path}.pull`);\n checkIdentity(instanceId, `${path}.instanceId`);\n checkIdentity(pinName, `${path}.pinName`);\n checkBoolean(powerReady, `${path}.powerReady`);\n checkBoolean(outputEnabled, `${path}.outputEnabled`);\n const model = snapshotModel(value.model, `${path}.model`);\n let digitalIntent: boolean | undefined;\n if ('digitalIntent' in value) {\n const candidate = value.digitalIntent;\n checkBoolean(candidate, `${path}.digitalIntent`);\n digitalIntent = candidate;\n }\n let voltageIntent: number | undefined;\n if ('voltageIntent' in value) {\n const candidate = value.voltageIntent;\n checkFinite(candidate, `${path}.voltageIntent`);\n checkRange(candidate, model.minVoltage, model.maxVoltage, `${path}.voltageIntent`);\n voltageIntent = candidate;\n }\n return Object.freeze({\n instanceId,\n pinName,\n powerReady,\n mode,\n outputEnabled,\n pull,\n ...(digitalIntent === undefined ? {} : { digitalIntent }),\n ...(voltageIntent === undefined ? {} : { voltageIntent }),\n model,\n });\n}\n\nfunction snapshotNetwork(input: ElectricalNetworkInput): ElectricalNetworkInput {\n checkRecord(input, 'network', ['networkId', 'pins']);\n checkIdentity(input.networkId, 'network.networkId');\n if (!Array.isArray(input.pins)) invalidType('network.pins', input.pins, 'be an array');\n const sources = new Map<string, Set<string>>();\n const pins: ElectricalPinInput[] = [];\n for (let index = 0; index < input.pins.length; index += 1) {\n const path = `network.pins[${index}]`;\n const pin = snapshotElectricalPin(input.pins[index], path);\n const names = sources.get(pin.instanceId) ?? new Set<string>();\n if (names.has(pin.pinName)) {\n invalidType(`${path}.pinName`, pin.pinName, `be unique within instance ${pin.instanceId}`);\n }\n names.add(pin.pinName);\n sources.set(pin.instanceId, names);\n pins.push(pin);\n }\n return Object.freeze({\n networkId: input.networkId,\n pins: Object.freeze(pins.sort(compareSources)),\n });\n}\n\nfunction snapshotContributions(\n contributions: readonly ElectricalContribution[],\n): readonly ElectricalContribution[] {\n return Object.freeze(\n contributions\n .map((contribution) =>\n Object.freeze({\n instanceId: contribution.instanceId,\n pinName: contribution.pinName,\n kind: contribution.kind,\n strength: contribution.strength,\n voltage: contribution.voltage,\n }),\n )\n .sort((left, right) => compareSources(left, right) || compareText(left.kind, right.kind)),\n );\n}\n\nexport class ElectricalConflictError extends Error {\n override readonly name = 'ElectricalConflictError' as const;\n readonly network: ElectricalNetworkInput;\n readonly contributions: readonly ElectricalContribution[];\n\n constructor(network: ElectricalNetworkInput, contributions: readonly ElectricalContribution[]) {\n super(`Network ${network.networkId}: highest-priority voltage spread must be <= 0.001 V`);\n this.network = snapshotNetwork(network);\n this.contributions = snapshotContributions(contributions);\n Object.freeze(this);\n }\n}\n\nfunction activeVoltage(pin: ElectricalPinInput): number | undefined {\n if (!pin.outputEnabled) return undefined;\n switch (pin.mode) {\n case 'high-z':\n return undefined;\n case 'push-pull':\n return pin.digitalIntent === undefined\n ? undefined\n : pin.digitalIntent\n ? pin.model.highVoltage\n : pin.model.lowVoltage;\n case 'open-drain':\n return pin.digitalIntent === false ? pin.model.lowVoltage : undefined;\n case 'analog':\n return pin.voltageIntent;\n }\n}\n\nexport function resolveElectricalNetwork(input: ElectricalNetworkInput): ElectricalNetworkResult {\n // Validate the complete snapshot before releasing or selecting any contribution.\n const network = snapshotNetwork(input);\n const contributions: ElectricalContribution[] = [];\n for (const pin of network.pins) {\n if (!pin.powerReady) continue;\n const source = { instanceId: pin.instanceId, pinName: pin.pinName };\n const voltage = activeVoltage(pin);\n if (voltage !== undefined) {\n contributions.push({ ...source, kind: 'drive', strength: 'strong', voltage });\n }\n if (pin.pull !== 'none') {\n contributions.push({\n ...source,\n kind: 'pull',\n strength: 'weak',\n voltage: pin.pull === 'up' ? pin.model.highVoltage : pin.model.lowVoltage,\n });\n }\n }\n const snapshot = snapshotContributions(contributions);\n if (snapshot.length === 0) {\n return Object.freeze({ state: 'floating', digitalFallback: false, contributions: snapshot });\n }\n const strength = snapshot.some((contribution) => contribution.strength === 'strong')\n ? 'strong'\n : 'weak';\n let min = Infinity;\n let max = -Infinity;\n for (const contribution of snapshot) {\n if (contribution.strength !== strength) continue;\n min = Math.min(min, contribution.voltage);\n max = Math.max(max, contribution.voltage);\n }\n if (max - min > 0.001) throw new ElectricalConflictError(network, snapshot);\n return Object.freeze({ state: 'driven', voltage: min, strength, contributions: snapshot });\n}\n","import type { FloatingInput, FloatingInputSample } from './types';\nimport { checkBoolean, checkIdentity, checkInteger, checkSupply } from './validation';\n\nfunction hash32(text: string): number {\n let hash = 0x811c9dc5;\n for (const byte of new TextEncoder().encode(text)) {\n hash = Math.imul(hash ^ byte, 0x01000193) >>> 0;\n }\n return hash;\n}\n\nfunction xorshift32(state: number): number {\n state ^= state << 13;\n state ^= state >>> 17;\n state ^= state << 5;\n return state >>> 0;\n}\n\nfunction mix32(value: number): number {\n value = Math.imul(value ^ (value >>> 16), 0x7feb352d);\n value = Math.imul(value ^ (value >>> 15), 0x846ca68b);\n return (value ^ (value >>> 16)) >>> 0;\n}\n\nexport function createFloatingInput(\n seed: number,\n instanceId: string,\n pinName: string,\n): FloatingInput {\n checkInteger(seed, 0, 0xffffffff, 'seed');\n checkIdentity(instanceId, 'instanceId');\n checkIdentity(pinName, 'pinName');\n let floatingCount = 0;\n let episodeSeed = 0;\n let initialVoltage: number | undefined;\n let hasEpisode = false;\n\n function beginFloating(supplyVoltage?: number): void {\n if (supplyVoltage !== undefined) checkSupply(supplyVoltage);\n floatingCount = (floatingCount + 1) >>> 0;\n episodeSeed =\n hash32(JSON.stringify(['mica-floating-v2', seed, instanceId, pinName, floatingCount])) || 1;\n initialVoltage =\n supplyVoltage === undefined\n ? undefined\n : (xorshift32(episodeSeed) / 0x100000000) * supplyVoltage;\n hasEpisode = true;\n }\n\n function sample(supplyVoltage: number, timePs: number, enabled = true): FloatingInputSample {\n checkBoolean(enabled, 'enabled');\n if (!enabled) return Object.freeze({ state: 'disabled' });\n checkSupply(supplyVoltage);\n checkInteger(timePs, 0, 7_200_000_000_000_000, 'timePs');\n if (!hasEpisode) throw new Error('Call beginFloating before sampling');\n // Recovery must call sample at its resolution point, not at a later business read.\n if (initialVoltage === undefined) {\n initialVoltage = (xorshift32(episodeSeed) / 0x100000000) * supplyVoltage;\n }\n const low = timePs >>> 0;\n const high = Math.floor(timePs / 0x100000000);\n const randomAtTime = mix32(mix32(episodeSeed ^ low) ^ high) / 0x100000000;\n const noise = (randomAtTime * 2 - 1) * 0.1;\n return Object.freeze({\n state: 'ready',\n voltage: Math.min(supplyVoltage, Math.max(0, initialVoltage + noise)),\n });\n }\n\n return Object.freeze({ beginFloating, sample });\n}\n","import type {\n ElectricalNetworkResult,\n ElectricalPinInput,\n FloatingInput,\n} from '../electrical/types';\nimport { resolveElectricalNetwork, snapshotElectricalPin } from '../electrical/network';\nimport {\n checkBoolean,\n checkChoice,\n checkIdentity,\n checkInteger,\n checkRecord,\n invalidType,\n} from '../electrical/validation';\nimport { createFloatingInput } from '../electrical/floating-input';\nimport type { Scheduler, SchedulerInstance, SchedulerTarget } from '../scheduler/types';\nimport type {\n ConnectionState,\n TopologyConnectionPatch,\n TopologyDefinition,\n TopologyNetwork,\n TopologyOptions,\n TopologyPinRef,\n TopologyRuntime,\n} from './types';\n\nconst PIN_KINDS = ['signal', 'power', 'gnd'] as const;\nconst CONNECTION_STATES = ['open', 'closed'] as const;\n\ninterface CapturedPin {\n readonly instanceId: string;\n readonly pinName: string;\n readonly kind: TopologyPinDeclarationKind;\n readonly key: string;\n readonly ref: TopologyPinRef;\n}\n\ntype TopologyPinDeclarationKind = (typeof PIN_KINDS)[number];\n\ninterface CapturedWire {\n readonly wireId: string;\n readonly pins: readonly CapturedPin[];\n readonly globalGnd: boolean;\n}\n\ninterface CapturedConnection {\n readonly instanceId: string;\n readonly connectionId: string;\n readonly pinA: CapturedPin;\n readonly pinB: CapturedPin;\n readonly initial: ConnectionState;\n readonly key: string;\n}\n\ninterface CapturedDefinition {\n readonly pins: readonly CapturedPin[];\n readonly pinsByKey: ReadonlyMap<string, CapturedPin>;\n readonly instances: ReadonlySet<string>;\n readonly wires: readonly CapturedWire[];\n readonly connections: readonly CapturedConnection[];\n readonly connectionsByKey: ReadonlyMap<string, CapturedConnection>;\n}\n\ninterface CapturedFloating {\n readonly seed: number;\n readonly supplyVoltage: (pin: TopologyPinRef) => number | undefined;\n readonly samplingEnabled: (pin: TopologyPinRef) => boolean;\n}\n\ninterface CapturedPinState {\n readonly key: string;\n readonly state: ElectricalPinInput;\n}\n\ninterface CapturedPatch {\n readonly instanceId: string;\n readonly entries: readonly { readonly key: string; readonly state: ConnectionState }[];\n}\n\ntype Command =\n | { readonly kind: 'patch'; readonly patch: CapturedPatch }\n | { readonly kind: 'pins'; readonly updates: readonly CapturedPinState[] }\n | { readonly kind: 'refresh'; readonly pins: readonly CapturedPin[] | undefined };\n\ninterface Component {\n readonly networkId: string;\n readonly pins: readonly CapturedPin[];\n readonly groundReady: boolean;\n}\n\ninterface FloatingTrack {\n readonly input: FloatingInput;\n physical: 'unknown' | 'driven' | 'floating';\n pendingInitialization: boolean;\n}\n\nfunction compareText(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction comparePins(left: TopologyPinRef, right: TopologyPinRef): number {\n return compareText(left.instanceId, right.instanceId) || compareText(left.pinName, right.pinName);\n}\n\nfunction pinKey(instanceId: string, pinName: string): string {\n return JSON.stringify([instanceId, pinName]);\n}\n\nfunction connectionKey(instanceId: string, connectionId: string): string {\n return JSON.stringify([instanceId, connectionId]);\n}\n\n/**\n * Escapes the two characters that carry structure in a network ID. Unlike\n * `encodeURIComponent`, this accepts every JavaScript string, including lone surrogates.\n */\nfunction escapeNetworkIdentity(value: string): string {\n return value.replaceAll('%', '%25').replaceAll('/', '%2F');\n}\n\nfunction capturePinReference(\n value: unknown,\n path: string,\n pinsByKey: ReadonlyMap<string, CapturedPin>,\n): CapturedPin {\n checkRecord(value, path, ['instanceId', 'pinName']);\n const instanceId = value.instanceId;\n const pinName = value.pinName;\n checkIdentity(instanceId, `${path}.instanceId`);\n checkIdentity(pinName, `${path}.pinName`);\n const declared = pinsByKey.get(pinKey(instanceId, pinName));\n if (declared === undefined) {\n throw new RangeError(\n `${path}: (${JSON.stringify(instanceId)}, ${JSON.stringify(pinName)}) must reference a declared pin`,\n );\n }\n return declared;\n}\n\nfunction captureDefinition(value: unknown): CapturedDefinition {\n checkRecord(value, 'definition', ['pins', 'wires', 'connections']);\n const rawPins = value.pins;\n if (!Array.isArray(rawPins)) invalidType('definition.pins', rawPins, 'be an array');\n const pins: CapturedPin[] = [];\n const pinsByKey = new Map<string, CapturedPin>();\n const instances = new Set<string>();\n for (let index = 0; index < rawPins.length; index += 1) {\n const path = `definition.pins[${index}]`;\n const entry = rawPins[index];\n checkRecord(entry, path, ['instanceId', 'pinName', 'kind']);\n const instanceId = entry.instanceId;\n const pinName = entry.pinName;\n checkIdentity(instanceId, `${path}.instanceId`);\n checkIdentity(pinName, `${path}.pinName`);\n const kind = checkChoice(entry.kind, PIN_KINDS, `${path}.kind`);\n const key = pinKey(instanceId, pinName);\n if (pinsByKey.has(key)) {\n invalidType(\n `${path}.pinName`,\n pinName,\n `be unique for instance ${JSON.stringify(instanceId)}`,\n );\n }\n const ref = Object.freeze({ instanceId, pinName });\n const pin = Object.freeze({ instanceId, pinName, kind, key, ref });\n pinsByKey.set(key, pin);\n pins.push(pin);\n instances.add(instanceId);\n }\n\n const rawWires = value.wires;\n if (!Array.isArray(rawWires)) invalidType('definition.wires', rawWires, 'be an array');\n const wires: CapturedWire[] = [];\n const wireIds = new Set<string>();\n for (let index = 0; index < rawWires.length; index += 1) {\n const path = `definition.wires[${index}]`;\n const entry = rawWires[index];\n checkRecord(entry, path, ['wireId', 'pins', 'globalGnd']);\n const wireId = entry.wireId;\n checkIdentity(wireId, `${path}.wireId`);\n if (wireIds.has(wireId)) {\n invalidType(`${path}.wireId`, wireId, 'be unique among external wires');\n }\n wireIds.add(wireId);\n const rawWirePins = entry.pins;\n if (!Array.isArray(rawWirePins)) {\n invalidType(`${path}.pins`, rawWirePins, 'be an array');\n }\n if (rawWirePins.length === 0) {\n throw new RangeError(`${path}.pins: expected at least one pin`);\n }\n const wirePins: CapturedPin[] = [];\n const wirePinKeys = new Set<string>();\n for (let pinIndex = 0; pinIndex < rawWirePins.length; pinIndex += 1) {\n const pin = capturePinReference(\n rawWirePins[pinIndex],\n `${path}.pins[${pinIndex}]`,\n pinsByKey,\n );\n if (wirePinKeys.has(pin.key)) {\n invalidType(\n `${path}.pins[${pinIndex}].pinName`,\n pin.pinName,\n `be unique within wire ${JSON.stringify(wireId)}`,\n );\n }\n wirePinKeys.add(pin.key);\n wirePins.push(pin);\n }\n let globalGnd = false;\n if ('globalGnd' in entry) {\n checkBoolean(entry.globalGnd, `${path}.globalGnd`);\n globalGnd = entry.globalGnd;\n }\n wires.push(Object.freeze({ wireId, pins: Object.freeze(wirePins), globalGnd }));\n }\n\n const rawConnections = value.connections;\n if (!Array.isArray(rawConnections)) {\n invalidType('definition.connections', rawConnections, 'be an array');\n }\n const connections: CapturedConnection[] = [];\n const connectionsByKey = new Map<string, CapturedConnection>();\n for (let index = 0; index < rawConnections.length; index += 1) {\n const path = `definition.connections[${index}]`;\n const entry = rawConnections[index];\n checkRecord(entry, path, ['instanceId', 'connectionId', 'pins', 'initial']);\n const instanceId = entry.instanceId;\n const connectionId = entry.connectionId;\n checkIdentity(instanceId, `${path}.instanceId`);\n checkIdentity(connectionId, `${path}.connectionId`);\n if (!instances.has(instanceId)) {\n throw new RangeError(\n `${path}.instanceId: ${JSON.stringify(instanceId)} must reference a declared instance`,\n );\n }\n const key = connectionKey(instanceId, connectionId);\n if (connectionsByKey.has(key)) {\n invalidType(\n `${path}.connectionId`,\n connectionId,\n `be unique for instance ${JSON.stringify(instanceId)}`,\n );\n }\n const rawEndpoints = entry.pins;\n if (!Array.isArray(rawEndpoints) || rawEndpoints.length !== 2) {\n invalidType(`${path}.pins`, rawEndpoints, 'be an array of exactly two pin names');\n }\n const first = rawEndpoints[0];\n const second = rawEndpoints[1];\n checkIdentity(first, `${path}.pins[0]`);\n checkIdentity(second, `${path}.pins[1]`);\n if (first === second) {\n invalidType(`${path}.pins[1]`, second, `differ from ${JSON.stringify(first)}`);\n }\n const pinA = pinsByKey.get(pinKey(instanceId, first));\n if (pinA === undefined) {\n throw new RangeError(\n `${path}.pins[0]: ${JSON.stringify(first)} must reference a pin declared by instance ${JSON.stringify(instanceId)}`,\n );\n }\n const pinB = pinsByKey.get(pinKey(instanceId, second));\n if (pinB === undefined) {\n throw new RangeError(\n `${path}.pins[1]: ${JSON.stringify(second)} must reference a pin declared by instance ${JSON.stringify(instanceId)}`,\n );\n }\n let initial: ConnectionState = 'open';\n if ('initial' in entry) {\n initial = checkChoice(entry.initial, CONNECTION_STATES, `${path}.initial`);\n }\n const connection = Object.freeze({\n instanceId,\n connectionId,\n pinA,\n pinB,\n initial,\n key,\n });\n connectionsByKey.set(key, connection);\n connections.push(connection);\n }\n connections.sort(\n (left, right) =>\n compareText(left.instanceId, right.instanceId) ||\n compareText(left.connectionId, right.connectionId),\n );\n\n return Object.freeze({\n pins: Object.freeze(pins),\n pinsByKey,\n instances,\n wires: Object.freeze(wires),\n connections: Object.freeze(connections),\n connectionsByKey,\n });\n}\n\n/**\n * Internal single-read snapshot shared with the power layer; not exported from the package root.\n * Passing this frozen value to `createTopologyRuntime` cannot observe later input mutation.\n */\nexport function captureTopologyDefinition(value: unknown): TopologyDefinition {\n const captured = captureDefinition(value);\n return Object.freeze({\n pins: Object.freeze(\n captured.pins.map((pin) =>\n Object.freeze({\n instanceId: pin.instanceId,\n pinName: pin.pinName,\n kind: pin.kind,\n }),\n ),\n ),\n wires: Object.freeze(\n captured.wires.map((wire) =>\n Object.freeze({\n wireId: wire.wireId,\n pins: Object.freeze(wire.pins.map((pin) => pin.ref)),\n globalGnd: wire.globalGnd,\n }),\n ),\n ),\n connections: Object.freeze(\n captured.connections.map((connection) =>\n Object.freeze({\n instanceId: connection.instanceId,\n connectionId: connection.connectionId,\n pins: Object.freeze([connection.pinA.pinName, connection.pinB.pinName] as const),\n initial: connection.initial,\n }),\n ),\n ),\n });\n}\n\nfunction capturePatch(value: unknown, definition: CapturedDefinition): CapturedPatch {\n checkRecord(value, 'patch', ['instanceId', 'connections']);\n const instanceId = value.instanceId;\n checkIdentity(instanceId, 'patch.instanceId');\n if (!definition.instances.has(instanceId)) {\n throw new RangeError(\n `patch.instanceId: ${JSON.stringify(instanceId)} must reference a declared instance`,\n );\n }\n const rawConnections = value.connections;\n if (!Array.isArray(rawConnections)) {\n invalidType('patch.connections', rawConnections, 'be an array');\n }\n if (rawConnections.length === 0) {\n throw new RangeError('patch.connections: expected at least one connection update');\n }\n const seen = new Set<string>();\n const entries: { readonly key: string; readonly state: ConnectionState }[] = [];\n for (let index = 0; index < rawConnections.length; index += 1) {\n const path = `patch.connections[${index}]`;\n const entry = rawConnections[index];\n checkRecord(entry, path, ['connectionId', 'state']);\n const connectionId = entry.connectionId;\n checkIdentity(connectionId, `${path}.connectionId`);\n const state = checkChoice(entry.state, CONNECTION_STATES, `${path}.state`);\n const key = connectionKey(instanceId, connectionId);\n if (!definition.connectionsByKey.has(key)) {\n throw new RangeError(\n `${path}.connectionId: ${JSON.stringify(connectionId)} must reference a connection declared by instance ${JSON.stringify(instanceId)}`,\n );\n }\n if (seen.has(key)) {\n invalidType(\n `${path}.connectionId`,\n connectionId,\n `be unique within patch for instance ${JSON.stringify(instanceId)}`,\n );\n }\n seen.add(key);\n entries.push(Object.freeze({ key, state }));\n }\n return Object.freeze({ instanceId, entries: Object.freeze(entries) });\n}\n\nfunction capturePinState(\n value: unknown,\n path: string,\n definition: CapturedDefinition,\n): CapturedPinState {\n const state = snapshotElectricalPin(value, path);\n const key = pinKey(state.instanceId, state.pinName);\n if (!definition.pinsByKey.has(key)) {\n throw new RangeError(\n `${path}: (${JSON.stringify(state.instanceId)}, ${JSON.stringify(state.pinName)}) must reference a declared pin`,\n );\n }\n return Object.freeze({ key, state });\n}\n\nfunction captureFloating(options: Record<string, unknown>): CapturedFloating | undefined {\n if (!('floating' in options)) return undefined;\n const value = options.floating;\n checkRecord(value, 'options.floating', ['seed', 'supplyVoltage', 'samplingEnabled']);\n const seed = value.seed;\n checkInteger(seed, 0, 0xffffffff, 'options.floating.seed');\n const supplyVoltage = value.supplyVoltage;\n if (typeof supplyVoltage !== 'function') {\n invalidType('options.floating.supplyVoltage', supplyVoltage, 'be a function');\n }\n let samplingEnabled: (pin: TopologyPinRef) => boolean = () => true;\n if ('samplingEnabled' in value) {\n const candidate = value.samplingEnabled;\n if (typeof candidate !== 'function') {\n invalidType('options.floating.samplingEnabled', candidate, 'be a function');\n }\n samplingEnabled = candidate as (pin: TopologyPinRef) => boolean;\n }\n return Object.freeze({\n seed: seed as number,\n supplyVoltage: supplyVoltage as (pin: TopologyPinRef) => number | undefined,\n samplingEnabled,\n });\n}\n\nfunction initialConnectionStates(definition: CapturedDefinition): Map<string, ConnectionState> {\n const states = new Map<string, ConnectionState>();\n for (const connection of definition.connections) {\n states.set(connection.key, connection.initial);\n }\n return states;\n}\n\nfunction buildComponents(\n definition: CapturedDefinition,\n connectionStates: ReadonlyMap<string, ConnectionState>,\n): readonly Component[] {\n const orderedPins = [...definition.pins].sort(comparePins);\n const indices = new Map<string, number>();\n orderedPins.forEach((pin, index) => indices.set(pin.key, index));\n const parent = orderedPins.map((_, index) => index);\n\n const find = (node: number): number => {\n let root = node;\n while (parent[root] !== root) {\n const next = parent[root] as number;\n parent[root] = parent[next] as number;\n root = next;\n }\n return root;\n };\n const union = (left: number, right: number): void => {\n const leftRoot = find(left);\n const rightRoot = find(right);\n if (leftRoot !== rightRoot) parent[rightRoot] = leftRoot;\n };\n\n for (const wire of definition.wires) {\n const first = wire.pins[0];\n if (first === undefined) continue;\n const firstIndex = indices.get(first.key);\n if (firstIndex === undefined) continue;\n for (let index = 1; index < wire.pins.length; index += 1) {\n const pin = wire.pins[index];\n const pinIndex = pin === undefined ? undefined : indices.get(pin.key);\n if (pinIndex !== undefined) union(firstIndex, pinIndex);\n }\n }\n for (const connection of definition.connections) {\n if (connectionStates.get(connection.key) !== 'closed') continue;\n const left = indices.get(connection.pinA.key);\n const right = indices.get(connection.pinB.key);\n if (left !== undefined && right !== undefined) union(left, right);\n }\n\n const groups = new Map<number, CapturedPin[]>();\n for (const pin of orderedPins) {\n const index = indices.get(pin.key);\n if (index === undefined) continue;\n const root = find(index);\n const group = groups.get(root);\n if (group === undefined) groups.set(root, [pin]);\n else group.push(pin);\n }\n\n const groundedRoots = new Set<number>();\n for (const wire of definition.wires) {\n if (!wire.globalGnd) continue;\n const first = wire.pins[0];\n const firstIndex = first === undefined ? undefined : indices.get(first.key);\n if (firstIndex !== undefined) groundedRoots.add(find(firstIndex));\n }\n\n const components: Component[] = [];\n for (const [root, pins] of groups) {\n const canonical = pins[0];\n if (canonical === undefined) continue;\n components.push(\n Object.freeze({\n networkId: `net:${escapeNetworkIdentity(canonical.instanceId)}/${escapeNetworkIdentity(canonical.pinName)}`,\n pins: Object.freeze(pins),\n groundReady: pins.some((pin) => pin.kind === 'gnd') && groundedRoots.has(root),\n }),\n );\n }\n components.sort((left, right) => compareText(left.networkId, right.networkId));\n return Object.freeze(components);\n}\n\nfunction indexComponents(components: readonly Component[]): Map<string, Component> {\n const byPin = new Map<string, Component>();\n for (const component of components) {\n for (const pin of component.pins) byPin.set(pin.key, component);\n }\n return byPin;\n}\n\nfunction resolveComponent(\n component: Component,\n pinStates: ReadonlyMap<string, ElectricalPinInput>,\n): ElectricalNetworkResult {\n const pins = component.pins.map((pin) => {\n const state = pinStates.get(pin.key);\n if (state === undefined) {\n throw new Error(\n `Invariant: missing committed pin state for (${pin.instanceId}, ${pin.pinName})`,\n );\n }\n return state;\n });\n return resolveElectricalNetwork({ networkId: component.networkId, pins });\n}\n\nfunction readySupply(options: CapturedFloating, pin: TopologyPinRef): number | undefined {\n if (!options.samplingEnabled(pin)) return undefined;\n return options.supplyVoltage(pin);\n}\n\nclass TopologyRuntimeImpl implements TopologyRuntime {\n readonly #scheduler: Scheduler;\n readonly #definition: CapturedDefinition;\n readonly #floatingOptions: CapturedFloating | undefined;\n readonly #target: SchedulerTarget;\n readonly #instance: SchedulerInstance;\n #connectionStates: Map<string, ConnectionState>;\n #pinStates: Map<string, ElectricalPinInput>;\n #components: readonly Component[];\n #componentByPin: Map<string, Component>;\n #results: Map<string, ElectricalNetworkResult>;\n readonly #floating = new Map<string, FloatingTrack>();\n readonly #commands: Command[] = [];\n #destroyed = false;\n\n constructor(\n scheduler: Scheduler,\n definitionInput: TopologyDefinition,\n optionsInput: TopologyOptions,\n ) {\n const definition = captureDefinition(definitionInput);\n checkRecord(optionsInput, 'options', ['instanceId', 'pinStates', 'floating']);\n const instanceId = optionsInput.instanceId;\n checkIdentity(instanceId, 'options.instanceId');\n const rawPinStates = optionsInput.pinStates;\n if (!Array.isArray(rawPinStates)) {\n invalidType('options.pinStates', rawPinStates, 'be an array');\n }\n const pinStates = new Map<string, ElectricalPinInput>();\n for (let index = 0; index < rawPinStates.length; index += 1) {\n const path = `options.pinStates[${index}]`;\n const captured = capturePinState(rawPinStates[index], path, definition);\n if (pinStates.has(captured.key)) {\n invalidType(\n `${path}.pinName`,\n captured.state.pinName,\n 'be unique among initial pin states',\n );\n }\n pinStates.set(captured.key, captured.state);\n }\n for (const pin of definition.pins) {\n if (!pinStates.has(pin.key)) {\n throw new RangeError(\n `options.pinStates: missing state for (${JSON.stringify(pin.instanceId)}, ${JSON.stringify(pin.pinName)})`,\n );\n }\n }\n const floatingOptions = captureFloating(optionsInput as Record<string, unknown>);\n\n const connectionStates = initialConnectionStates(definition);\n const components = buildComponents(definition, connectionStates);\n const results = new Map<string, ElectricalNetworkResult>();\n for (const component of components) {\n results.set(component.networkId, resolveComponent(component, pinStates));\n }\n\n this.#scheduler = scheduler;\n this.#definition = definition;\n this.#floatingOptions = floatingOptions;\n this.#connectionStates = connectionStates;\n this.#pinStates = pinStates;\n this.#components = components;\n this.#componentByPin = indexComponents(components);\n this.#results = results;\n this.#updateFloating(components, results);\n this.#target = Object.freeze({\n name: 'topology.commit',\n kind: 'control',\n params: Object.freeze([]),\n });\n this.#instance = scheduler.addInstance({\n instanceId,\n targets: [this.#target],\n executor: { execute: () => this.#runNextCommand() },\n });\n Object.freeze(this);\n }\n\n get instance(): SchedulerInstance {\n return this.#instance;\n }\n\n submit(patch: TopologyConnectionPatch): void {\n this.#enqueue({ kind: 'patch', patch: capturePatch(patch, this.#definition) });\n }\n\n updatePinStates(states: readonly ElectricalPinInput[]): void {\n if (!Array.isArray(states)) invalidType('states', states, 'be an array');\n if (states.length === 0) return;\n const updates: CapturedPinState[] = [];\n const seen = new Set<string>();\n for (let index = 0; index < states.length; index += 1) {\n const captured = capturePinState(states[index], `states[${index}]`, this.#definition);\n if (seen.has(captured.key)) {\n invalidType(\n `states[${index}].pinName`,\n captured.state.pinName,\n 'be unique within one pin-state update',\n );\n }\n seen.add(captured.key);\n updates.push(captured);\n }\n this.#enqueue({ kind: 'pins', updates: Object.freeze(updates) });\n }\n\n refresh(pins?: readonly TopologyPinRef[]): void {\n if (pins === undefined) {\n this.#enqueue({ kind: 'refresh', pins: undefined });\n return;\n }\n if (!Array.isArray(pins)) invalidType('pins', pins, 'be an array');\n if (pins.length === 0) return;\n const captured: CapturedPin[] = [];\n const seen = new Set<string>();\n for (let index = 0; index < pins.length; index += 1) {\n const pin = capturePinReference(pins[index], `pins[${index}]`, this.#definition.pinsByKey);\n if (seen.has(pin.key)) continue;\n seen.add(pin.key);\n captured.push(pin);\n }\n this.#enqueue({ kind: 'refresh', pins: Object.freeze(captured) });\n }\n\n connectionState(instanceId: string, connectionId: string): ConnectionState {\n checkIdentity(instanceId, 'instanceId');\n checkIdentity(connectionId, 'connectionId');\n const state = this.#connectionStates.get(connectionKey(instanceId, connectionId));\n if (state === undefined) {\n throw new RangeError(\n `(${JSON.stringify(instanceId)}, ${JSON.stringify(connectionId)}) must reference a declared connection`,\n );\n }\n return state;\n }\n\n networks(): readonly TopologyNetwork[] {\n return Object.freeze(this.#components.map((component) => this.#snapshot(component)));\n }\n\n networkOf(pin: TopologyPinRef): TopologyNetwork | undefined {\n const captured = capturePinReference(pin, 'pin', this.#definition.pinsByKey);\n const component = this.#componentByPin.get(captured.key);\n return component === undefined ? undefined : this.#snapshot(component);\n }\n\n floatingInput(pin: TopologyPinRef): FloatingInput | undefined {\n const captured = capturePinReference(pin, 'pin', this.#definition.pinsByKey);\n if (this.#floatingOptions === undefined) return undefined;\n return this.#track(captured).input;\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n this.#commands.length = 0;\n this.#scheduler.destroyInstance(this.#instance);\n }\n\n #enqueue(command: Command): void {\n this.#commands.push(command);\n try {\n this.#scheduler.enqueueControl(this.#instance, this.#target, []);\n } catch (cause) {\n this.#commands.pop();\n throw cause;\n }\n }\n\n #runNextCommand(): void {\n const command = this.#commands.shift();\n if (command === undefined) {\n throw new Error('Topology control entry has no pending command');\n }\n switch (command.kind) {\n case 'patch':\n this.#applyPatch(command.patch);\n return;\n case 'pins':\n this.#applyPinStates(command.updates);\n return;\n case 'refresh':\n this.#applyRefresh(command.pins);\n return;\n }\n }\n\n #applyPatch(patch: CapturedPatch): void {\n let nextStates: Map<string, ConnectionState> | undefined;\n const changed = new Set<string>();\n for (const entry of patch.entries) {\n const current = this.#connectionStates.get(entry.key);\n if (current === undefined) {\n throw new Error('Invariant: patch references an unknown connection state');\n }\n if (current === entry.state) continue;\n if (nextStates === undefined) nextStates = new Map(this.#connectionStates);\n nextStates.set(entry.key, entry.state);\n const connection = this.#definition.connectionsByKey.get(entry.key);\n if (connection === undefined) {\n throw new Error('Invariant: patch references an unknown connection declaration');\n }\n changed.add(connection.pinA.key);\n changed.add(connection.pinB.key);\n }\n if (nextStates === undefined) return;\n\n const nextComponents = buildComponents(this.#definition, nextStates);\n const nextByPin = indexComponents(nextComponents);\n const affected = new Set<string>();\n for (const key of changed) {\n const before = this.#componentByPin.get(key);\n const after = nextByPin.get(key);\n if (before !== undefined) affected.add(before.networkId);\n if (after !== undefined) affected.add(after.networkId);\n }\n const targets = nextComponents.filter((component) => affected.has(component.networkId));\n\n let nextResults: Map<string, ElectricalNetworkResult>;\n try {\n nextResults = this.#resolve(targets, this.#pinStates);\n } catch (cause) {\n // The committed topology survives the failed electrical resolution.\n this.#connectionStates = nextStates;\n this.#components = nextComponents;\n this.#componentByPin = nextByPin;\n this.#pruneResults(nextComponents);\n this.#clearResults(targets);\n throw cause;\n }\n this.#connectionStates = nextStates;\n this.#components = nextComponents;\n this.#componentByPin = nextByPin;\n this.#pruneResults(nextComponents);\n for (const [networkId, result] of nextResults) this.#results.set(networkId, result);\n this.#updateFloating(targets, nextResults);\n }\n\n #applyPinStates(updates: readonly CapturedPinState[]): void {\n const nextStates = new Map(this.#pinStates);\n const updated = new Set<string>();\n for (const update of updates) {\n nextStates.set(update.key, update.state);\n updated.add(update.key);\n }\n const targets = this.#components.filter((component) =>\n component.pins.some((pin) => updated.has(pin.key)),\n );\n let nextResults: Map<string, ElectricalNetworkResult>;\n try {\n nextResults = this.#resolve(targets, nextStates);\n } catch (cause) {\n this.#pinStates = nextStates;\n this.#clearResults(targets);\n throw cause;\n }\n this.#pinStates = nextStates;\n for (const [networkId, result] of nextResults) this.#results.set(networkId, result);\n this.#updateFloating(targets, nextResults);\n }\n\n #applyRefresh(pins: readonly CapturedPin[] | undefined): void {\n let targets: readonly Component[];\n if (pins === undefined) {\n targets = this.#components;\n } else {\n const keys = new Set(pins.map((pin) => pin.key));\n targets = this.#components.filter((component) =>\n component.pins.some((pin) => keys.has(pin.key)),\n );\n }\n let nextResults: Map<string, ElectricalNetworkResult>;\n try {\n nextResults = this.#resolve(targets, this.#pinStates);\n } catch (cause) {\n this.#clearResults(targets);\n throw cause;\n }\n for (const [networkId, result] of nextResults) this.#results.set(networkId, result);\n this.#updateFloating(targets, nextResults);\n }\n\n #resolve(\n targets: readonly Component[],\n pinStates: ReadonlyMap<string, ElectricalPinInput>,\n ): Map<string, ElectricalNetworkResult> {\n const results = new Map<string, ElectricalNetworkResult>();\n for (const component of targets) {\n results.set(component.networkId, resolveComponent(component, pinStates));\n }\n return results;\n }\n\n #clearResults(targets: readonly Component[]): void {\n for (const component of targets) this.#results.delete(component.networkId);\n }\n\n #pruneResults(components: readonly Component[]): void {\n const ids = new Set(components.map((component) => component.networkId));\n for (const networkId of [...this.#results.keys()]) {\n if (!ids.has(networkId)) this.#results.delete(networkId);\n }\n }\n\n #updateFloating(\n targets: readonly Component[],\n results: ReadonlyMap<string, ElectricalNetworkResult>,\n ): void {\n const options = this.#floatingOptions;\n if (options === undefined) return;\n const now = this.#scheduler.now;\n for (const component of targets) {\n const result = results.get(component.networkId);\n if (result === undefined) continue;\n const floating = result.state === 'floating';\n for (const pin of component.pins) {\n const track = this.#track(pin);\n if (!floating) {\n track.physical = 'driven';\n track.pendingInitialization = false;\n continue;\n }\n if (track.physical !== 'floating') {\n const supply = readySupply(options, pin.ref);\n if (supply === undefined) {\n track.input.beginFloating();\n track.pendingInitialization = true;\n } else {\n track.input.beginFloating(supply);\n track.pendingInitialization = false;\n }\n track.physical = 'floating';\n } else if (track.pendingInitialization) {\n const supply = readySupply(options, pin.ref);\n if (supply !== undefined) {\n // The recovery resolution point initializes V0; the value itself is not an observation.\n track.input.sample(supply, now, true);\n track.pendingInitialization = false;\n }\n }\n }\n }\n }\n\n #track(pin: CapturedPin): FloatingTrack {\n let track = this.#floating.get(pin.key);\n if (track === undefined) {\n const options = this.#floatingOptions;\n if (options === undefined) {\n throw new Error('Invariant: floating track requested without floating options');\n }\n track = {\n input: createFloatingInput(options.seed, pin.instanceId, pin.pinName),\n physical: 'unknown',\n pendingInitialization: false,\n };\n this.#floating.set(pin.key, track);\n }\n return track;\n }\n\n #snapshot(component: Component): TopologyNetwork {\n return Object.freeze({\n networkId: component.networkId,\n pins: Object.freeze(component.pins.map((pin) => pin.ref)),\n groundReady: component.groundReady,\n result: this.#results.get(component.networkId),\n });\n }\n}\n\nexport function createTopologyRuntime(\n scheduler: Scheduler,\n definition: TopologyDefinition,\n options: TopologyOptions,\n): TopologyRuntime {\n return new TopologyRuntimeImpl(scheduler, definition, options);\n}\n","import { snapshotElectricalPin } from '../electrical/network';\nimport {\n checkChoice,\n checkFinite,\n checkIdentity,\n checkInteger,\n checkRecord,\n invalidType,\n} from '../electrical/validation';\nimport type { ElectricalPinInput } from '../electrical/types';\nimport type { TopologyDefinition, TopologyPinRef } from '../topology/types';\nimport { captureTopologyDefinition } from '../topology/runtime';\nimport type {\n PowerDomainObserver,\n PowerFloatingOptions,\n PowerInputMode,\n PowerLevels,\n} from './types';\n\nconst INPUT_MODES = ['two-state', 'three-state'] as const;\nconst DOMAIN_FIELDS = ['supply', 'ground', 'voltage', 'dependsOn'] as const;\nconst VOLTAGE_FIELDS = ['turnOn', 'turnOff'] as const;\nconst BINDING_FIELDS = ['powerDomain', 'levels'] as const;\nconst LEVEL_FIELDS = ['low', 'high'] as const;\nconst DEVICE_FIELDS = ['instanceId', 'powerDomains', 'pins'] as const;\nconst DEFINITION_FIELDS = ['topology', 'devices'] as const;\nconst OPTION_FIELDS = [\n 'instanceId',\n 'topologyInstanceId',\n 'pinStates',\n 'floating',\n 'inputMode',\n 'maxPropagationRounds',\n 'observer',\n] as const;\nconst FLOATING_FIELDS = ['seed'] as const;\n\nconst DEFAULT_MAX_PROPAGATION_ROUNDS = 10_000;\n\ntype PinKind = 'signal' | 'power' | 'gnd';\n\nexport interface CapturedDomain {\n readonly instanceId: string;\n readonly domainId: string;\n readonly key: string;\n readonly supply: TopologyPinRef;\n readonly ground: TopologyPinRef;\n readonly turnOn: number;\n readonly turnOff: number;\n readonly dependsOn: readonly CapturedDomain[];\n readonly depth: number;\n}\n\nexport interface CapturedPin {\n readonly ref: TopologyPinRef;\n readonly key: string;\n readonly kind: PinKind;\n readonly domain: CapturedDomain | undefined;\n readonly levels: PowerLevels | undefined;\n}\n\nexport interface CapturedDevice {\n readonly instanceId: string;\n readonly domains: readonly CapturedDomain[];\n readonly domainsById: ReadonlyMap<string, CapturedDomain>;\n}\n\nexport interface CapturedPowerDefinition {\n readonly topology: TopologyDefinition;\n readonly devices: readonly CapturedDevice[];\n readonly devicesById: ReadonlyMap<string, CapturedDevice>;\n readonly domainsInOrder: readonly CapturedDomain[];\n readonly domainsByKey: ReadonlyMap<string, CapturedDomain>;\n readonly pins: readonly CapturedPin[];\n readonly pinsByKey: ReadonlyMap<string, CapturedPin>;\n readonly instances: ReadonlySet<string>;\n}\n\nexport interface CapturedObserver {\n readonly receiver: PowerDomainObserver;\n readonly notify: PowerDomainObserver['onPowerDomainChange'];\n}\n\nexport interface CapturedPowerOptions {\n readonly instanceId: string;\n readonly topologyInstanceId: string;\n readonly intents: ReadonlyMap<string, ElectricalPinInput>;\n readonly initialStates: readonly ElectricalPinInput[];\n readonly floating: PowerFloatingOptions | undefined;\n readonly inputMode: PowerInputMode;\n readonly maxPropagationRounds: number;\n readonly observer: CapturedObserver | undefined;\n}\n\ninterface InterimDomain {\n readonly instanceId: string;\n readonly domainId: string;\n readonly supply: TopologyPinRef;\n readonly ground: TopologyPinRef;\n readonly turnOn: number;\n readonly turnOff: number;\n readonly dependsOnIds: readonly string[];\n}\n\nfunction compareText(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction compareRefs(left: TopologyPinRef, right: TopologyPinRef): number {\n return compareText(left.instanceId, right.instanceId) || compareText(left.pinName, right.pinName);\n}\n\nexport function pinKey(instanceId: string, pinName: string): string {\n return JSON.stringify([instanceId, pinName]);\n}\n\nexport function domainKey(instanceId: string, domainId: string): string {\n return JSON.stringify([instanceId, domainId]);\n}\n\nfunction captureEntries(value: unknown, path: string): readonly [string, unknown][] {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n invalidType(path, value, 'be an object');\n }\n const entries: [string, unknown][] = [];\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string') {\n invalidType(`${path}.${String(key)}`, Reflect.get(value, key), 'use a string key');\n }\n if (key.length === 0) {\n throw new RangeError(`${path}: map keys must be nonempty strings`);\n }\n entries.push([key, Reflect.get(value, key)]);\n }\n entries.sort(([left], [right]) => compareText(left, right));\n return Object.freeze(entries);\n}\n\nfunction captureLevels(value: unknown, path: string): PowerLevels {\n checkRecord(value, path, LEVEL_FIELDS);\n const low = value.low;\n const high = value.high;\n checkFinite(low, `${path}.low`);\n checkFinite(high, `${path}.high`);\n if (low < 0 || low > 1) {\n throw new RangeError(`${path}.low: ${low} must be within [0, 1]`);\n }\n if (high < 0 || high > 1) {\n throw new RangeError(`${path}.high: ${high} must be within [0, 1]`);\n }\n if (low >= high) {\n throw new RangeError(`${path}.low: ${low} must be less than high ${high}`);\n }\n return Object.freeze({ low, high });\n}\n\nfunction captureVoltage(value: unknown, path: string): { turnOn: number; turnOff: number } {\n checkRecord(value, path, VOLTAGE_FIELDS);\n const turnOn = value.turnOn;\n const turnOff = value.turnOff;\n checkFinite(turnOn, `${path}.turnOn`);\n checkFinite(turnOff, `${path}.turnOff`);\n if (turnOff < 0) {\n throw new RangeError(`${path}.turnOff: ${turnOff} must be nonnegative`);\n }\n if (turnOn <= turnOff) {\n throw new RangeError(`${path}.turnOn: ${turnOn} must be greater than turnOff ${turnOff}`);\n }\n return Object.freeze({ turnOn, turnOff });\n}\n\nfunction resolveDeclaredPin(\n value: unknown,\n path: string,\n instanceId: string,\n declared: ReadonlyMap<string, { readonly ref: TopologyPinRef; readonly kind: PinKind }>,\n kind: PinKind,\n): TopologyPinRef {\n checkIdentity(value, path);\n const key = pinKey(instanceId, value);\n const pin = declared.get(key);\n if (pin === undefined) {\n throw new RangeError(\n `${path}: ${JSON.stringify(value)} must reference a pin declared by instance ${JSON.stringify(instanceId)}`,\n );\n }\n if (pin.kind !== kind) {\n throw new RangeError(\n `${path}: pin ${JSON.stringify(value)} must have kind ${JSON.stringify(kind)}`,\n );\n }\n return pin.ref;\n}\n\nfunction captureDomains(\n deviceValue: Record<string, unknown>,\n path: string,\n instanceId: string,\n declared: ReadonlyMap<string, { readonly ref: TopologyPinRef; readonly kind: PinKind }>,\n): readonly CapturedDomain[] {\n const rawDomains = deviceValue.powerDomains;\n const entries = captureEntries(rawDomains, `${path}.powerDomains`);\n const interim = new Map<string, InterimDomain>();\n for (const [domainId, declaration] of entries) {\n const domainPath = `${path}.powerDomains.${domainId}`;\n checkRecord(declaration, domainPath, DOMAIN_FIELDS);\n const supply = resolveDeclaredPin(\n declaration.supply,\n `${domainPath}.supply`,\n instanceId,\n declared,\n 'power',\n );\n const ground = resolveDeclaredPin(\n declaration.ground,\n `${domainPath}.ground`,\n instanceId,\n declared,\n 'gnd',\n );\n const { turnOn, turnOff } = captureVoltage(declaration.voltage, `${domainPath}.voltage`);\n let dependsOnIds: readonly string[] = Object.freeze([]);\n if ('dependsOn' in declaration) {\n const rawDependsOn = declaration.dependsOn;\n if (!Array.isArray(rawDependsOn)) {\n invalidType(`${domainPath}.dependsOn`, rawDependsOn, 'be an array');\n }\n const seen = new Set<string>();\n for (let index = 0; index < rawDependsOn.length; index += 1) {\n const dependency = rawDependsOn[index];\n checkIdentity(dependency, `${domainPath}.dependsOn[${index}]`);\n if (dependency === domainId) {\n throw new RangeError(`${domainPath}.dependsOn: domain must not depend on itself`);\n }\n if (seen.has(dependency)) {\n invalidType(\n `${domainPath}.dependsOn[${index}]`,\n dependency,\n 'be unique within the dependency set',\n );\n }\n seen.add(dependency);\n }\n dependsOnIds = Object.freeze([...seen].sort(compareText));\n }\n interim.set(\n domainId,\n Object.freeze({\n instanceId,\n domainId,\n supply,\n ground,\n turnOn,\n turnOff,\n dependsOnIds,\n }),\n );\n }\n\n for (const [domainId, domain] of interim) {\n for (const dependency of domain.dependsOnIds) {\n if (!interim.has(dependency)) {\n throw new RangeError(\n `${path}.powerDomains.${domainId}.dependsOn: ${JSON.stringify(dependency)} must reference a domain declared by the same device`,\n );\n }\n }\n }\n\n const indegree = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n for (const [domainId, domain] of interim) {\n indegree.set(domainId, domain.dependsOnIds.length);\n for (const dependency of domain.dependsOnIds) {\n const list = dependents.get(dependency);\n if (list === undefined) dependents.set(dependency, [domainId]);\n else list.push(domainId);\n }\n }\n const ready = [...indegree.keys()].filter((domainId) => indegree.get(domainId) === 0);\n const order: string[] = [];\n while (ready.length > 0) {\n ready.sort(compareText);\n const domainId = ready.shift() as string;\n order.push(domainId);\n for (const dependent of dependents.get(domainId) ?? []) {\n const next = (indegree.get(dependent) as number) - 1;\n indegree.set(dependent, next);\n if (next === 0) ready.push(dependent);\n }\n }\n if (order.length !== interim.size) {\n const remaining = [...interim.keys()].filter((domainId) => !order.includes(domainId));\n throw new RangeError(\n `${path}.powerDomains.dependsOn: dependency graph must be acyclic; cycle involves ${remaining\n .sort(compareText)\n .map((domainId) => JSON.stringify(domainId))\n .join(', ')}`,\n );\n }\n\n const domainsById = new Map<string, CapturedDomain>();\n const domains: CapturedDomain[] = [];\n for (const domainId of order) {\n const domain = interim.get(domainId) as InterimDomain;\n const dependsOn = Object.freeze(\n domain.dependsOnIds.map((dependency) => domainsById.get(dependency) as CapturedDomain),\n );\n let depth = 0;\n for (const dependency of dependsOn) depth = Math.max(depth, dependency.depth + 1);\n const captured = Object.freeze({\n instanceId: domain.instanceId,\n domainId: domain.domainId,\n key: domainKey(domain.instanceId, domain.domainId),\n supply: domain.supply,\n ground: domain.ground,\n turnOn: domain.turnOn,\n turnOff: domain.turnOff,\n dependsOn,\n depth,\n });\n domainsById.set(domainId, captured);\n domains.push(captured);\n }\n return Object.freeze(domains);\n}\n\nfunction capturePinBindings(\n deviceValue: Record<string, unknown>,\n path: string,\n instanceId: string,\n domainsById: ReadonlyMap<string, CapturedDomain>,\n declared: ReadonlyMap<string, { readonly ref: TopologyPinRef; readonly kind: PinKind }>,\n): ReadonlyMap<\n string,\n { readonly domain: CapturedDomain; readonly levels: PowerLevels | undefined }\n> {\n const result = new Map<\n string,\n { readonly domain: CapturedDomain; readonly levels: PowerLevels | undefined }\n >();\n if (!('pins' in deviceValue)) return result;\n const entries = captureEntries(deviceValue.pins, `${path}.pins`);\n for (const [pinName, binding] of entries) {\n const bindingPath = `${path}.pins.${pinName}`;\n checkRecord(binding, bindingPath, BINDING_FIELDS);\n const key = pinKey(instanceId, pinName);\n const pin = declared.get(key);\n if (pin === undefined) {\n throw new RangeError(\n `${bindingPath}: ${JSON.stringify(pinName)} must reference a pin declared by instance ${JSON.stringify(instanceId)}`,\n );\n }\n if (pin.kind !== 'signal') {\n throw new RangeError(`${bindingPath}: powerDomain is only supported on kind 'signal' pins`);\n }\n let domain: CapturedDomain | undefined;\n if ('powerDomain' in binding) {\n const domainId = binding.powerDomain;\n checkIdentity(domainId, `${bindingPath}.powerDomain`);\n domain = domainsById.get(domainId);\n if (domain === undefined) {\n throw new RangeError(\n `${bindingPath}.powerDomain: ${JSON.stringify(domainId)} must reference a domain declared by the same device`,\n );\n }\n }\n let levels: PowerLevels | undefined;\n if ('levels' in binding) {\n if (domain === undefined) {\n throw new RangeError(`${bindingPath}.levels requires a powerDomain binding`);\n }\n levels = captureLevels(binding.levels, `${bindingPath}.levels`);\n }\n if (domain !== undefined) result.set(key, Object.freeze({ domain, levels }));\n }\n return result;\n}\n\nexport function capturePowerDefinition(value: unknown): CapturedPowerDefinition {\n checkRecord(value, 'definition', DEFINITION_FIELDS);\n const topology = captureTopologyDefinition(value.topology);\n const declared = new Map<string, { readonly ref: TopologyPinRef; readonly kind: PinKind }>();\n const instances = new Set<string>();\n for (const pin of topology.pins) {\n const ref = Object.freeze({ instanceId: pin.instanceId, pinName: pin.pinName });\n declared.set(pinKey(pin.instanceId, pin.pinName), Object.freeze({ ref, kind: pin.kind }));\n instances.add(pin.instanceId);\n }\n\n const rawDevices = value.devices;\n if (!Array.isArray(rawDevices)) invalidType('definition.devices', rawDevices, 'be an array');\n const devices: CapturedDevice[] = [];\n const devicesById = new Map<string, CapturedDevice>();\n const bindingsByKey = new Map<\n string,\n { readonly domain: CapturedDomain; readonly levels: PowerLevels | undefined }\n >();\n for (let index = 0; index < rawDevices.length; index += 1) {\n const path = `definition.devices[${index}]`;\n const deviceValue = rawDevices[index];\n checkRecord(deviceValue, path, DEVICE_FIELDS);\n const instanceId = deviceValue.instanceId;\n checkIdentity(instanceId, `${path}.instanceId`);\n if (devicesById.has(instanceId)) {\n invalidType(`${path}.instanceId`, instanceId, 'be unique among power device definitions');\n }\n if (!instances.has(instanceId)) {\n throw new RangeError(\n `${path}.instanceId: ${JSON.stringify(instanceId)} must reference a declared topology instance`,\n );\n }\n const domains = captureDomains(deviceValue, path, instanceId, declared);\n const domainsById = new Map(domains.map((domain) => [domain.domainId, domain] as const));\n const device = Object.freeze({ instanceId, domains, domainsById });\n devices.push(device);\n devicesById.set(instanceId, device);\n const bindings = capturePinBindings(deviceValue, path, instanceId, domainsById, declared);\n for (const [key, binding] of bindings) bindingsByKey.set(key, binding);\n }\n devices.sort((left, right) => compareText(left.instanceId, right.instanceId));\n\n const domainsInOrder: CapturedDomain[] = [];\n for (const device of devices) domainsInOrder.push(...device.domains);\n const domainsByKey = new Map(domainsInOrder.map((domain) => [domain.key, domain] as const));\n\n const pins: CapturedPin[] = [];\n for (const [key, pin] of declared) {\n const binding = bindingsByKey.get(key);\n pins.push(\n Object.freeze({\n ref: pin.ref,\n key,\n kind: pin.kind,\n domain: binding?.domain,\n levels: binding?.levels,\n }),\n );\n }\n pins.sort((left, right) => compareRefs(left.ref, right.ref));\n const pinsByKey = new Map(pins.map((pin) => [pin.key, pin] as const));\n\n return Object.freeze({\n topology,\n devices: Object.freeze(devices),\n devicesById,\n domainsInOrder: Object.freeze(domainsInOrder),\n domainsByKey,\n pins: Object.freeze(pins),\n pinsByKey,\n instances,\n });\n}\n\nexport function captureObserver(value: unknown, path: string): CapturedObserver {\n if (value === null || (typeof value !== 'object' && typeof value !== 'function')) {\n invalidType(path, value, 'be an object');\n }\n const notify = Reflect.get(value, 'onPowerDomainChange');\n if (typeof notify !== 'function') {\n invalidType(`${path}.onPowerDomainChange`, notify, 'be a function');\n }\n return Object.freeze({\n receiver: value as PowerDomainObserver,\n notify: notify as PowerDomainObserver['onPowerDomainChange'],\n });\n}\n\nfunction captureLimit(value: unknown, fallback: number, path: string): number {\n if (value === undefined) return fallback;\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n invalidType(path, value, 'be a finite number');\n }\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new RangeError(`${path}: ${value} must be a non-negative safe integer`);\n }\n return value;\n}\n\nexport function capturePowerOptions(\n value: unknown,\n definition: CapturedPowerDefinition,\n): CapturedPowerOptions {\n checkRecord(value, 'options', OPTION_FIELDS);\n const instanceId = value.instanceId;\n checkIdentity(instanceId, 'options.instanceId');\n let topologyInstanceId = `${instanceId}:topology`;\n if ('topologyInstanceId' in value) {\n const candidate = value.topologyInstanceId;\n checkIdentity(candidate, 'options.topologyInstanceId');\n topologyInstanceId = candidate;\n }\n if (topologyInstanceId === instanceId) {\n throw new RangeError('options.topologyInstanceId must differ from options.instanceId');\n }\n\n const rawStates = value.pinStates;\n if (!Array.isArray(rawStates)) invalidType('options.pinStates', rawStates, 'be an array');\n const intents = new Map<string, ElectricalPinInput>();\n for (let index = 0; index < rawStates.length; index += 1) {\n const path = `options.pinStates[${index}]`;\n const state = snapshotElectricalPin(rawStates[index], path);\n const key = pinKey(state.instanceId, state.pinName);\n if (!definition.pinsByKey.has(key)) {\n throw new RangeError(\n `${path}: (${JSON.stringify(state.instanceId)}, ${JSON.stringify(state.pinName)}) must reference a declared pin`,\n );\n }\n if (intents.has(key)) {\n invalidType(\n `${path}.pinName`,\n state.pinName,\n `be unique within instance ${JSON.stringify(state.instanceId)}`,\n );\n }\n intents.set(key, state);\n }\n const initialStates: ElectricalPinInput[] = [];\n for (const pin of definition.pins) {\n const intent = intents.get(pin.key);\n if (intent === undefined) {\n throw new RangeError(\n `options.pinStates: missing state for (${JSON.stringify(pin.ref.instanceId)}, ${JSON.stringify(pin.ref.pinName)})`,\n );\n }\n initialStates.push(\n pin.domain === undefined ? intent : Object.freeze({ ...intent, powerReady: false }),\n );\n }\n\n let floating: PowerFloatingOptions | undefined;\n if ('floating' in value) {\n const rawFloating = value.floating;\n checkRecord(rawFloating, 'options.floating', FLOATING_FIELDS);\n const seed = rawFloating.seed;\n checkInteger(seed, 0, 0xffffffff, 'options.floating.seed');\n floating = Object.freeze({ seed: seed as number });\n }\n\n let inputMode: PowerInputMode = 'three-state';\n if ('inputMode' in value) {\n inputMode = checkChoice(value.inputMode, INPUT_MODES, 'options.inputMode');\n }\n const maxPropagationRounds = captureLimit(\n value.maxPropagationRounds,\n DEFAULT_MAX_PROPAGATION_ROUNDS,\n 'options.maxPropagationRounds',\n );\n let observer: CapturedObserver | undefined;\n if ('observer' in value) {\n observer = captureObserver(value.observer, 'options.observer');\n }\n\n return Object.freeze({\n instanceId,\n topologyInstanceId,\n intents,\n initialStates: Object.freeze(initialStates),\n floating,\n inputMode,\n maxPropagationRounds,\n observer,\n });\n}\n","import type { ElectricalPinInput, FloatingInput } from '../electrical/types';\nimport { snapshotElectricalPin } from '../electrical/network';\nimport { checkIdentity, checkRecord, invalidType } from '../electrical/validation';\nimport type { Scheduler, SchedulerInstance, SchedulerTarget } from '../scheduler/types';\nimport type { TimePs } from '../scheduler/time';\nimport { createTopologyRuntime } from '../topology/runtime';\nimport type {\n ConnectionState,\n TopologyConnectionPatch,\n TopologyNetwork,\n TopologyPinRef,\n TopologyRuntime,\n} from '../topology/types';\nimport type {\n PowerDefinition,\n PowerDigitalSample,\n PowerDomainChange,\n PowerDomainObserver,\n PowerDomainSnapshot,\n PowerDomainState,\n PowerDownReason,\n PowerInputMode,\n PowerOptions,\n PowerPinGate,\n PowerPinGateReason,\n PowerRuntime,\n PowerVoltageSample,\n} from './types';\nimport {\n captureObserver,\n capturePowerDefinition,\n capturePowerOptions,\n domainKey,\n pinKey,\n type CapturedDomain,\n type CapturedObserver,\n type CapturedPin,\n type CapturedPowerDefinition,\n} from './validation';\n\nconst NO_OPENED: readonly string[] = Object.freeze([]);\nconst NO_REASONS: readonly PowerDownReason[] = Object.freeze([]);\nconst GATED_DIGITAL: PowerDigitalSample = Object.freeze({\n value: 0,\n ready: false,\n source: 'gated',\n});\nconst GATED_VOLTAGE: PowerVoltageSample = Object.freeze({\n voltage: 0,\n ready: false,\n source: 'gated',\n});\n\ntype Command =\n | {\n readonly kind: 'propagate';\n readonly epoch: number;\n readonly opened: readonly string[];\n }\n | { readonly kind: 'notify' };\n\nfunction compareText(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction compareSnapshots(left: PowerDomainSnapshot, right: PowerDomainSnapshot): number {\n return (\n compareText(left.instanceId, right.instanceId) || compareText(left.domainId, right.domainId)\n );\n}\n\nfunction nextState(\n voltage: number | null,\n groundReady: boolean,\n dependenciesReady: boolean,\n previous: PowerDomainState,\n turnOn: number,\n turnOff: number,\n): PowerDomainState {\n if (!groundReady || voltage === null || !dependenciesReady) return 'off';\n if (voltage <= turnOff) return 'off';\n if (voltage >= turnOn) return 'on';\n return previous;\n}\n\nfunction downReasons(\n domain: CapturedDomain,\n snapshot: PowerDomainSnapshot,\n): readonly PowerDownReason[] {\n const reasons: PowerDownReason[] = [];\n if (!snapshot.groundReady) reasons.push('ground-not-ready');\n else if (snapshot.voltage === null) reasons.push('supply-indeterminate');\n if (!snapshot.dependenciesReady) reasons.push('dependency-off');\n if (snapshot.groundReady && snapshot.voltage !== null && snapshot.voltage <= domain.turnOff) {\n reasons.push('below-turn-off');\n }\n return Object.freeze(reasons);\n}\n\nfunction sortChanges(\n changes: readonly PowerDomainChange[],\n domainsByKey: ReadonlyMap<string, CapturedDomain>,\n): readonly PowerDomainChange[] {\n const depth = (change: PowerDomainChange): number =>\n domainsByKey.get(domainKey(change.instanceId, change.domainId))?.depth ?? 0;\n const down = changes\n .filter((change) => change.state === 'off')\n .sort(\n (left, right) =>\n compareText(left.instanceId, right.instanceId) ||\n depth(right) - depth(left) ||\n compareText(left.domainId, right.domainId),\n );\n const up = changes\n .filter((change) => change.state === 'on')\n .sort(\n (left, right) =>\n compareText(left.instanceId, right.instanceId) ||\n depth(left) - depth(right) ||\n compareText(left.domainId, right.domainId),\n );\n return Object.freeze([...down, ...up]);\n}\n\nfunction sortStates(\n states: ReadonlyMap<string, ElectricalPinInput>,\n): readonly ElectricalPinInput[] {\n return Object.freeze(\n [...states.entries()]\n .sort(([left], [right]) => compareText(left, right))\n .map(([, state]) => state),\n );\n}\n\nexport class PowerFeedbackError extends Error {\n override readonly name = 'PowerFeedbackError' as const;\n readonly timePs: TimePs;\n readonly rounds: number;\n readonly maxRounds: number;\n readonly domains: readonly PowerDomainSnapshot[];\n\n constructor(\n timePs: TimePs,\n rounds: number,\n maxRounds: number,\n domains: readonly PowerDomainSnapshot[],\n ) {\n super(`Power propagation exceeded ${maxRounds} rounds at ${timePs} ps`);\n this.timePs = timePs;\n this.rounds = rounds;\n this.maxRounds = maxRounds;\n this.domains = Object.freeze(domains.map((domain) => Object.freeze({ ...domain })));\n Object.freeze(this);\n }\n}\n\nclass PowerRuntimeImpl implements PowerRuntime {\n readonly #scheduler: Scheduler;\n readonly #definition: CapturedPowerDefinition;\n readonly #topology: TopologyRuntime;\n readonly #target: SchedulerTarget;\n readonly #instance: SchedulerInstance;\n readonly #inputMode: PowerInputMode;\n readonly #maxPropagationRounds: number;\n readonly #signalPins: readonly CapturedPin[];\n readonly #intents: Map<string, ElectricalPinInput>;\n readonly #effective: Map<string, ElectricalPinInput>;\n readonly #submittedGate: Map<string, boolean>;\n readonly #notified = new Map<string, PowerDomainState>();\n readonly #pendingOpen = new Set<string>();\n readonly #digital = new Map<string, PowerDigitalSample>();\n readonly #memory = new Map<string, 0 | 1>();\n readonly #dirty = new Set<string>();\n readonly #commands: Command[] = [];\n #domains = new Map<string, PowerDomainSnapshot>();\n #observer: CapturedObserver | undefined;\n #topologyReady = false;\n #destroyed = false;\n #budgetTime: TimePs | undefined;\n #rounds = 0;\n #topologyEpoch = 0;\n #appliedEpoch = 0;\n\n constructor(scheduler: Scheduler, definitionInput: unknown, optionsInput: unknown) {\n const definition = capturePowerDefinition(definitionInput);\n const options = capturePowerOptions(optionsInput, definition);\n this.#scheduler = scheduler;\n this.#definition = definition;\n this.#inputMode = options.inputMode;\n this.#maxPropagationRounds = options.maxPropagationRounds;\n this.#observer = options.observer;\n this.#intents = new Map(options.intents);\n this.#effective = new Map(\n options.initialStates.map((state) => [pinKey(state.instanceId, state.pinName), state]),\n );\n this.#submittedGate = new Map(\n options.initialStates.map((state) => [\n pinKey(state.instanceId, state.pinName),\n state.powerReady,\n ]),\n );\n this.#signalPins = Object.freeze(definition.pins.filter((pin) => pin.kind === 'signal'));\n for (const pin of this.#signalPins) this.#memory.set(pin.key, 0);\n for (const domain of definition.domainsInOrder) this.#notified.set(domain.key, 'off');\n\n this.#target = Object.freeze({\n name: 'power.propagate',\n kind: 'control',\n params: Object.freeze([]),\n });\n let instance: SchedulerInstance | undefined;\n let topology: TopologyRuntime | undefined;\n try {\n // Reserve the power identity first: a duplicate id must not create a topology orphan.\n instance = scheduler.addInstance({\n instanceId: options.instanceId,\n targets: [this.#target],\n executor: { execute: () => this.#runNextCommand() },\n });\n this.#instance = instance;\n topology = createTopologyRuntime(scheduler, definition.topology, {\n instanceId: options.topologyInstanceId,\n pinStates: options.initialStates,\n ...(options.floating === undefined\n ? {}\n : {\n floating: {\n seed: options.floating.seed,\n supplyVoltage: (pin: TopologyPinRef) => this.#floatingSupply(pin),\n samplingEnabled: (pin: TopologyPinRef) => this.#floatingSamplingEnabled(pin),\n },\n }),\n });\n this.#topology = topology;\n this.#domains = this.#computeDomains();\n for (const domain of definition.domainsInOrder) {\n if (this.#domains.get(domain.key)?.state === 'on') this.#pendingOpen.add(domain.key);\n }\n this.#topologyReady = true;\n this.#interpretPins();\n this.#enqueuePropagate(0, NO_OPENED);\n } catch (cause) {\n if (topology !== undefined) {\n try {\n topology.destroy();\n } catch {\n // Preserve the construction failure; the orphan cleanup is best effort.\n }\n }\n if (instance !== undefined) {\n try {\n scheduler.destroyInstance(instance);\n } catch {\n // Preserve the construction failure; the orphan cleanup is best effort.\n }\n }\n throw cause;\n }\n Object.freeze(this);\n }\n\n get instance(): SchedulerInstance {\n return this.#instance;\n }\n\n get inputMode(): PowerInputMode {\n return this.#inputMode;\n }\n\n submit(patch: TopologyConnectionPatch): void {\n this.#assertAlive();\n this.#topology.submit(patch);\n this.#topologyEpoch += 1;\n this.#enqueuePropagate(this.#topologyEpoch, NO_OPENED);\n }\n\n updatePinStates(states: readonly ElectricalPinInput[]): void {\n this.#assertAlive();\n if (!Array.isArray(states)) invalidType('states', states, 'be an array');\n if (states.length === 0) return;\n const updates: { readonly key: string; readonly state: ElectricalPinInput }[] = [];\n const seen = new Set<string>();\n for (let index = 0; index < states.length; index += 1) {\n const state = snapshotElectricalPin(states[index], `states[${index}]`);\n const key = pinKey(state.instanceId, state.pinName);\n if (!this.#definition.pinsByKey.has(key)) {\n throw new RangeError(\n `states[${index}]: (${JSON.stringify(state.instanceId)}, ${JSON.stringify(state.pinName)}) must reference a declared pin`,\n );\n }\n if (seen.has(key)) {\n invalidType(\n `states[${index}].pinName`,\n state.pinName,\n `be unique within instance ${JSON.stringify(state.instanceId)}`,\n );\n }\n seen.add(key);\n updates.push(Object.freeze({ key, state }));\n }\n for (const update of updates) {\n this.#intents.set(update.key, update.state);\n this.#dirty.add(update.key);\n }\n this.#enqueuePropagate(this.#topologyEpoch, NO_OPENED);\n }\n\n refresh(pins?: readonly TopologyPinRef[]): void {\n this.#assertAlive();\n if (pins !== undefined) {\n if (!Array.isArray(pins)) invalidType('pins', pins, 'be an array');\n if (pins.length === 0) return;\n }\n this.#topology.refresh(pins);\n this.#topologyEpoch += 1;\n this.#enqueuePropagate(this.#topologyEpoch, NO_OPENED);\n }\n\n connectionState(instanceId: string, connectionId: string): ConnectionState {\n return this.#topology.connectionState(instanceId, connectionId);\n }\n\n networks(): readonly TopologyNetwork[] {\n return this.#topology.networks();\n }\n\n networkOf(pin: TopologyPinRef): TopologyNetwork | undefined {\n return this.#topology.networkOf(pin);\n }\n\n floatingInput(pin: TopologyPinRef): FloatingInput | undefined {\n return this.#topology.floatingInput(pin);\n }\n\n domain(instanceId: string, domainId: string): PowerDomainSnapshot {\n checkIdentity(instanceId, 'instanceId');\n checkIdentity(domainId, 'domainId');\n const key = domainKey(instanceId, domainId);\n if (!this.#definition.domainsByKey.has(key)) {\n throw new RangeError(\n `(${JSON.stringify(instanceId)}, ${JSON.stringify(domainId)}) must reference a declared power domain`,\n );\n }\n return this.#domains.get(key) as PowerDomainSnapshot;\n }\n\n domains(instanceId?: string): readonly PowerDomainSnapshot[] {\n const snapshot = this.#snapshots();\n if (instanceId === undefined) return snapshot;\n checkIdentity(instanceId, 'instanceId');\n if (!this.#definition.instances.has(instanceId)) {\n throw new RangeError(\n `${JSON.stringify(instanceId)} must reference a declared topology instance`,\n );\n }\n return Object.freeze(snapshot.filter((domain) => domain.instanceId === instanceId));\n }\n\n pinGate(pin: TopologyPinRef): PowerPinGate {\n const captured = this.#signalPin(pin, 'pin');\n const gate = this.#gateFor(captured);\n return Object.freeze({\n instanceId: captured.ref.instanceId,\n pinName: captured.ref.pinName,\n domainId: gate.domainId,\n ready: gate.ready,\n reason: gate.reason,\n });\n }\n\n pinIntent(pin: TopologyPinRef): ElectricalPinInput {\n const captured = this.#resolvePin(pin, 'pin');\n return this.#intents.get(captured.key) as ElectricalPinInput;\n }\n\n sampleDigital(pin: TopologyPinRef): PowerDigitalSample {\n const captured = this.#signalPin(pin, 'pin');\n const sample = this.#digital.get(captured.key);\n if (sample === undefined) {\n throw new Error(\n `Invariant: missing digital interpretation for (${JSON.stringify(captured.ref.instanceId)}, ${JSON.stringify(captured.ref.pinName)})`,\n );\n }\n return sample;\n }\n\n sampleVoltage(pin: TopologyPinRef): PowerVoltageSample {\n const captured = this.#signalPin(pin, 'pin');\n if (!this.#gateFor(captured).ready) return GATED_VOLTAGE;\n const network = this.#topology.networkOf(captured.ref);\n const result = network?.result;\n if (result === undefined) {\n throw new Error(\n `Invariant: network result missing for (${JSON.stringify(captured.ref.instanceId)}, ${JSON.stringify(captured.ref.pinName)})`,\n );\n }\n if (result.state === 'driven') {\n return Object.freeze({ voltage: result.voltage, ready: true, source: 'sampled' });\n }\n const floating = this.#topology.floatingInput(captured.ref);\n if (floating === undefined) {\n throw new Error(\n `Floating voltage sampling for (${JSON.stringify(captured.ref.instanceId)}, ${JSON.stringify(captured.ref.pinName)}) requires PowerOptions.floating`,\n );\n }\n const supply = this.#floatingSupply(captured.ref);\n if (supply === undefined) {\n throw new RangeError(\n `Floating voltage sampling for (${JSON.stringify(captured.ref.instanceId)}, ${JSON.stringify(captured.ref.pinName)}) requires a nonnegative supply`,\n );\n }\n const sample = floating.sample(supply, this.#scheduler.now, true);\n if (sample.state !== 'ready') {\n throw new Error(\n `Invariant: enabled floating sampling returned disabled for (${JSON.stringify(captured.ref.instanceId)}, ${JSON.stringify(captured.ref.pinName)})`,\n );\n }\n return Object.freeze({ voltage: sample.voltage, ready: true, source: 'floating' });\n }\n\n observe(observer: PowerDomainObserver | undefined): void {\n this.#assertAlive();\n this.#observer = observer === undefined ? undefined : captureObserver(observer, 'observer');\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n this.#observer = undefined;\n this.#commands.length = 0;\n this.#topology.destroy();\n this.#scheduler.destroyInstance(this.#instance);\n }\n\n #assertAlive(): void {\n if (this.#destroyed) throw new Error('Power runtime is destroyed');\n }\n\n #enqueue(command: Command): void {\n this.#commands.push(command);\n try {\n this.#scheduler.enqueueControl(this.#instance, this.#target, []);\n } catch (cause) {\n this.#commands.pop();\n throw cause;\n }\n }\n\n #enqueuePropagate(epoch: number, opened: readonly string[]): void {\n this.#enqueue(Object.freeze({ kind: 'propagate', epoch, opened }));\n }\n\n #runNextCommand(): void {\n const command = this.#commands.shift();\n if (command === undefined) {\n throw new Error('Power control entry has no pending command');\n }\n if (command.kind === 'notify') {\n this.#notify();\n return;\n }\n this.#propagate(command.epoch, command.opened);\n }\n\n #propagate(epoch: number, opened: readonly string[]): void {\n const now = this.#scheduler.now;\n if (this.#budgetTime !== now) {\n this.#budgetTime = now;\n this.#rounds = 0;\n }\n this.#rounds += 1;\n if (this.#rounds > this.#maxPropagationRounds) {\n throw new PowerFeedbackError(\n now,\n this.#rounds,\n this.#maxPropagationRounds,\n this.#snapshots(),\n );\n }\n if (epoch > this.#appliedEpoch) this.#appliedEpoch = epoch;\n if (this.#appliedEpoch < this.#topologyEpoch) {\n // A newer topology commit is queued after this entry; wait before reading its state.\n this.#enqueuePropagate(this.#topologyEpoch, opened);\n return;\n }\n for (const key of opened) this.#pendingOpen.delete(key);\n\n this.#domains = this.#computeDomains();\n const updates = this.#desiredUpdates();\n if (updates.off.size > 0) {\n this.#submitUpdates(updates.off, false);\n this.#enqueuePropagate(this.#topologyEpoch, NO_OPENED);\n return;\n }\n if (this.#hasNotificationChange()) {\n this.#enqueue(Object.freeze({ kind: 'notify' }));\n return;\n }\n if (updates.on.size > 0) {\n const openedDomains = this.#submitUpdates(updates.on, true);\n this.#enqueuePropagate(this.#topologyEpoch, openedDomains);\n return;\n }\n this.#interpretPins();\n }\n\n #notify(): void {\n if (this.#appliedEpoch < this.#topologyEpoch) {\n this.#enqueuePropagate(this.#topologyEpoch, NO_OPENED);\n return;\n }\n let updates = this.#desiredUpdates();\n if (updates.off.size > 0) {\n this.#submitUpdates(updates.off, false);\n this.#enqueuePropagate(this.#topologyEpoch, NO_OPENED);\n return;\n }\n\n const changes = this.#notificationChanges();\n const opened = new Set<string>();\n for (const change of changes) {\n const key = domainKey(change.instanceId, change.domainId);\n if (change.state === 'on') {\n // The observer must see the gate as opening until this notification returns.\n this.#pendingOpen.add(key);\n opened.add(key);\n } else {\n this.#pendingOpen.delete(key);\n }\n }\n if (changes.length > 0) {\n this.#interpretPins();\n const ordered = sortChanges(changes, this.#definition.domainsByKey);\n if (this.#observer !== undefined) {\n this.#observer.notify.call(this.#observer.receiver, ordered, this.#snapshots());\n }\n for (const change of changes) {\n this.#notified.set(domainKey(change.instanceId, change.domainId), change.state);\n }\n }\n\n // Recompute after the observer so intents submitted during the callback win.\n updates = this.#desiredUpdates();\n if (updates.off.size > 0) this.#submitUpdates(updates.off, false);\n if (updates.on.size > 0) {\n for (const key of this.#submitUpdates(updates.on, true)) opened.add(key);\n }\n if (opened.size > 0 || updates.on.size > 0 || updates.off.size > 0) {\n this.#enqueuePropagate(this.#topologyEpoch, Object.freeze([...opened].sort(compareText)));\n return;\n }\n this.#interpretPins();\n }\n\n #notificationChanges(): readonly PowerDomainChange[] {\n const changes: PowerDomainChange[] = [];\n const now = this.#scheduler.now;\n for (const domain of this.#definition.domainsInOrder) {\n const previous = this.#notified.get(domain.key) ?? 'off';\n const snapshot = this.#domains.get(domain.key) as PowerDomainSnapshot;\n if (snapshot.state === previous) continue;\n changes.push(\n Object.freeze({\n ...snapshot,\n timePs: now,\n previousState: previous,\n reasons: snapshot.state === 'off' ? downReasons(domain, snapshot) : NO_REASONS,\n }),\n );\n }\n return changes;\n }\n\n #hasNotificationChange(): boolean {\n for (const domain of this.#definition.domainsInOrder) {\n const previous = this.#notified.get(domain.key) ?? 'off';\n if ((this.#domains.get(domain.key) as PowerDomainSnapshot).state !== previous) return true;\n }\n return false;\n }\n\n #desiredUpdates(): {\n readonly off: ReadonlyMap<string, ElectricalPinInput>;\n readonly on: ReadonlyMap<string, ElectricalPinInput>;\n } {\n const off = new Map<string, ElectricalPinInput>();\n const on = new Map<string, ElectricalPinInput>();\n for (const pin of this.#definition.pins) {\n const intent = this.#intents.get(pin.key) as ElectricalPinInput;\n const desired =\n pin.domain === undefined\n ? intent.powerReady\n : this.#domains.get(pin.domain.key)?.state === 'on';\n if (!this.#dirty.has(pin.key) && this.#submittedGate.get(pin.key) === desired) continue;\n const state =\n pin.domain === undefined ? intent : Object.freeze({ ...intent, powerReady: desired });\n if (desired) on.set(pin.key, state);\n else off.set(pin.key, state);\n }\n return { off, on };\n }\n\n #submitUpdates(\n updates: ReadonlyMap<string, ElectricalPinInput>,\n desired: boolean,\n ): readonly string[] {\n if (updates.size === 0) return NO_OPENED;\n const opened = new Set<string>();\n for (const [key, state] of updates) {\n const pin = this.#definition.pinsByKey.get(key) as CapturedPin;\n const wasSubmitted = this.#submittedGate.get(key) === true;\n this.#effective.set(key, state);\n this.#submittedGate.set(key, desired);\n this.#dirty.delete(key);\n if (pin.domain === undefined) continue;\n if (desired) {\n if (!wasSubmitted) {\n this.#pendingOpen.add(pin.domain.key);\n opened.add(pin.domain.key);\n }\n } else {\n this.#pendingOpen.delete(pin.domain.key);\n }\n }\n this.#topology.updatePinStates(sortStates(updates));\n this.#topologyEpoch += 1;\n return Object.freeze([...opened].sort(compareText));\n }\n\n #computeDomains(): Map<string, PowerDomainSnapshot> {\n const next = new Map<string, PowerDomainSnapshot>();\n for (const domain of this.#definition.domainsInOrder) {\n const groundNetwork = this.#topology.networkOf(domain.ground);\n const supplyNetwork = this.#topology.networkOf(domain.supply);\n const groundReady = groundNetwork?.groundReady === true;\n const supply = supplyNetwork?.result;\n const voltage = groundReady && supply?.state === 'driven' ? supply.voltage : null;\n const dependenciesReady = domain.dependsOn.every(\n (dependency) => next.get(dependency.key)?.state === 'on',\n );\n const previous = this.#domains.get(domain.key)?.state ?? 'off';\n const state = nextState(\n voltage,\n groundReady,\n dependenciesReady,\n previous,\n domain.turnOn,\n domain.turnOff,\n );\n next.set(\n domain.key,\n Object.freeze({\n instanceId: domain.instanceId,\n domainId: domain.domainId,\n state,\n voltage,\n groundReady,\n dependenciesReady,\n }),\n );\n }\n return next;\n }\n\n #snapshots(): readonly PowerDomainSnapshot[] {\n return Object.freeze([...this.#domains.values()].sort(compareSnapshots));\n }\n\n #interpretPins(): void {\n for (const pin of this.#signalPins) this.#interpretPin(pin);\n }\n\n #interpretPin(pin: CapturedPin): void {\n const gate = this.#gateFor(pin);\n if (!gate.ready) {\n this.#digital.set(pin.key, GATED_DIGITAL);\n return;\n }\n const network = this.#topology.networkOf(pin.ref);\n const result = network?.result;\n if (result === undefined) {\n throw new Error(\n `Invariant: network result missing for (${JSON.stringify(pin.ref.instanceId)}, ${JSON.stringify(pin.ref.pinName)})`,\n );\n }\n if (result.state === 'floating') {\n this.#digital.set(pin.key, Object.freeze({ value: 0, ready: true, source: 'floating' }));\n return;\n }\n let low: number;\n let high: number;\n if (pin.levels !== undefined) {\n const domain = pin.domain === undefined ? undefined : this.#domains.get(pin.domain.key);\n if (domain === undefined || domain.voltage === null) {\n throw new Error(`Invariant: missing domain voltage for (${JSON.stringify(pin.key)})`);\n }\n low = pin.levels.low * domain.voltage;\n high = pin.levels.high * domain.voltage;\n } else {\n const effective = this.#effective.get(pin.key);\n if (effective === undefined) {\n throw new Error(`Invariant: missing effective pin state for (${JSON.stringify(pin.key)})`);\n }\n low = effective.model.lowVoltage;\n high = effective.model.highVoltage;\n }\n const voltage = result.voltage;\n let value: 0 | 1;\n let source: PowerDigitalSample['source'];\n if (voltage <= low) {\n value = 0;\n source = 'sampled';\n } else if (voltage >= high) {\n value = 1;\n source = 'sampled';\n } else if (this.#inputMode === 'three-state') {\n value = this.#memory.get(pin.key) ?? 0;\n source = 'threshold-range';\n } else {\n value = 0;\n source = 'sampled';\n }\n if (source === 'sampled') this.#memory.set(pin.key, value);\n this.#digital.set(pin.key, Object.freeze({ value, ready: true, source }));\n }\n\n #gateFor(pin: CapturedPin): {\n readonly domainId: string | null;\n readonly ready: boolean;\n readonly reason: PowerPinGateReason;\n } {\n if (pin.domain === undefined) {\n return { domainId: null, ready: true, reason: 'no-domain' };\n }\n const snapshot = this.#domains.get(pin.domain.key);\n if (snapshot === undefined || snapshot.state === 'off') {\n return { domainId: pin.domain.domainId, ready: false, reason: 'domain-off' };\n }\n if (this.#pendingOpen.has(pin.domain.key)) {\n return { domainId: pin.domain.domainId, ready: false, reason: 'opening' };\n }\n return { domainId: pin.domain.domainId, ready: true, reason: 'powered' };\n }\n\n #resolvePin(value: unknown, path: string): CapturedPin {\n checkRecord(value, path, ['instanceId', 'pinName']);\n const instanceId = value.instanceId;\n const pinName = value.pinName;\n checkIdentity(instanceId, `${path}.instanceId`);\n checkIdentity(pinName, `${path}.pinName`);\n const captured = this.#definition.pinsByKey.get(pinKey(instanceId, pinName));\n if (captured === undefined) {\n throw new RangeError(\n `${path}: (${JSON.stringify(instanceId)}, ${JSON.stringify(pinName)}) must reference a declared pin`,\n );\n }\n return captured;\n }\n\n #signalPin(value: unknown, path: string): CapturedPin {\n const pin = this.#resolvePin(value, path);\n if (pin.kind !== 'signal') {\n throw new RangeError(\n `${path}: (${JSON.stringify(pin.ref.instanceId)}, ${JSON.stringify(pin.ref.pinName)}) must be a kind 'signal' pin`,\n );\n }\n return pin;\n }\n\n #floatingSupply(pin: TopologyPinRef): number | undefined {\n const captured = this.#definition.pinsByKey.get(pinKey(pin.instanceId, pin.pinName));\n if (captured === undefined) return undefined;\n if (captured.domain !== undefined) {\n if (!this.#topologyReady) return undefined;\n const snapshot = this.#domains.get(captured.domain.key);\n if (snapshot === undefined || snapshot.state !== 'on') return undefined;\n return snapshot.voltage ?? undefined;\n }\n const effective = this.#effective.get(captured.key);\n if (effective === undefined) return undefined;\n const maxVoltage = effective.model.maxVoltage;\n return maxVoltage >= 0 ? maxVoltage : undefined;\n }\n\n #floatingSamplingEnabled(pin: TopologyPinRef): boolean {\n const captured = this.#definition.pinsByKey.get(pinKey(pin.instanceId, pin.pinName));\n if (captured === undefined) return false;\n if (captured.domain === undefined) return true;\n if (!this.#topologyReady) return false;\n return this.#domains.get(captured.domain.key)?.state === 'on';\n }\n}\n\nexport function createPowerRuntime(\n scheduler: Scheduler,\n definition: PowerDefinition,\n options: PowerOptions,\n): PowerRuntime {\n return new PowerRuntimeImpl(scheduler, definition, options);\n}\n","export const MICA_CORE_VERSION = '0.0.0';\n\nexport { MAX_TIME_PS, timePs, toTimePs, addTime, subtractTime } from './scheduler/time';\nexport type { TimePs, TimeUnit } from './scheduler/time';\nexport { createScheduler } from './scheduler/runtime';\nexport { createIRSchedulerInstance } from './scheduler/ir-adapter';\nexport type { IRSchedulerInstance, IRSchedulerInstanceDefinition } from './scheduler/ir-adapter';\nexport { SchedulerError } from './scheduler/errors';\nexport type { SchedulerErrorCode } from './scheduler/errors';\nexport type {\n Scheduler,\n SchedulerExecutionContext,\n SchedulerExecutor,\n SchedulerInstance,\n SchedulerInstanceDefinition,\n SchedulerOptions,\n SchedulerRunOptions,\n SchedulerRunResult,\n SchedulerTarget,\n} from './scheduler/types';\n\nexport type {\n ElectricalPinInput,\n ElectricalNetworkInput,\n ElectricalContribution,\n ElectricalNetworkResult,\n FloatingInputSample,\n FloatingInput,\n} from './electrical/types';\nexport { ElectricalConflictError, resolveElectricalNetwork } from './electrical/network';\nexport { createFloatingInput } from './electrical/floating-input';\n\nexport { createTopologyRuntime } from './topology/runtime';\nexport type {\n ConnectionState,\n TopologyConnectionDeclaration,\n TopologyConnectionPatch,\n TopologyConnectionUpdate,\n TopologyDefinition,\n TopologyExternalWire,\n TopologyFloatingOptions,\n TopologyNetwork,\n TopologyOptions,\n TopologyPinDeclaration,\n TopologyPinRef,\n TopologyRuntime,\n} from './topology/types';\n\nexport { createPowerRuntime, PowerFeedbackError } from './power/runtime';\nexport type {\n PowerDefinition,\n PowerDeviceDefinition,\n PowerDigitalSample,\n PowerDigitalSource,\n PowerDomainChange,\n PowerDomainDeclaration,\n PowerDomainObserver,\n PowerDomainSnapshot,\n PowerDomainState,\n PowerDownReason,\n PowerFloatingOptions,\n PowerInputMode,\n PowerLevels,\n PowerOptions,\n PowerPinBinding,\n PowerPinGate,\n PowerPinGateReason,\n PowerRuntime,\n PowerVoltageSample,\n PowerVoltageSource,\n} from './power/types';\n"],"mappings":"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"}
@@ -75,7 +75,7 @@ export declare function defaultNetName(role: SymbolRole): string | undefined;
75
75
  *
76
76
  * @throws {SchematicError} when a device cannot be resolved or a net has conflicting labels.
77
77
  */
78
- export declare function deriveSchematicTopology(document: SchematicDocument, options?: TopologyOptions): SchematicTopology;
78
+ export declare function deriveSchematicTopology(document: SchematicDocument, options?: SchematicTopologyOptions): SchematicTopology;
79
79
 
80
80
  /**
81
81
  * Picks the reference designator of a newly placed component. Hosts replace this when their
@@ -185,7 +185,7 @@ export declare interface Diagnostic {
185
185
  readonly related?: readonly DiagnosticRelated[];
186
186
  }
187
187
 
188
- export declare type DiagnosticCode = 'json/invalid' | 'json/not-object' | 'schema/unsupported-version' | 'schema/missing-field' | 'schema/invalid-type' | 'schema/invalid-value' | 'schema/unknown-field' | 'id/duplicate' | 'device/invalid-reference' | 'device/unresolved' | 'device/invalid-package' | 'device/duplicate-package' | 'device/reserved-namespace' | 'device/duplicate-device' | 'device/invalid-description' | 'device/unknown-pin' | 'device/no-symbol' | 'wire/invalid-points' | 'wire/not-orthogonal' | 'junction/unknown-wire' | 'junction/duplicate-wire' | 'junction/off-wire' | 'symbol/missing-net' | 'symbol/unsupported-field' | 'symbol/designator-duplicate' | 'net/naming-conflict' | 'canvas/unknown-symbol' | 'edit/unknown-entity' | 'edit/invalid-command';
188
+ export declare type DiagnosticCode = 'json/invalid' | 'json/not-object' | 'schema/unsupported-version' | 'schema/missing-field' | 'schema/invalid-type' | 'schema/invalid-value' | 'schema/unknown-field' | 'id/duplicate' | 'device/invalid-reference' | 'device/unresolved' | 'device/invalid-package' | 'device/duplicate-package' | 'device/reserved-namespace' | 'device/duplicate-device' | 'device/invalid-description' | 'device/unknown-pin' | 'device/no-symbol' | 'wire/invalid-points' | 'wire/not-orthogonal' | 'junction/unknown-wire' | 'junction/duplicate-wire' | 'junction/off-wire' | 'symbol/missing-net' | 'symbol/unsupported-field' | 'symbol/designator-duplicate' | 'net/naming-conflict' | 'canvas/unknown-symbol' | 'canvas/unknown-widget' | 'canvas/unknown-property' | 'canvas/unknown-port' | 'canvas/unknown-schematic' | 'canvas/unknown-target-port' | 'topic/type-mismatch' | 'type/unknown' | 'edit/unknown-entity' | 'edit/invalid-command';
189
189
 
190
190
  export declare interface DiagnosticEntity {
191
191
  readonly kind: 'symbol' | 'wire' | 'junction';
@@ -298,7 +298,7 @@ export declare interface LoadedSchematic {
298
298
  /** Parses a schematic and derives its topology. @throws {SchematicError} on any contract violation. */
299
299
  export declare function loadSchematic(source: string | SchematicDocument, options?: LoadSchematicOptions): LoadedSchematic;
300
300
 
301
- export declare type LoadSchematicOptions = TopologyOptions;
301
+ export declare type LoadSchematicOptions = SchematicTopologyOptions;
302
302
 
303
303
  /**
304
304
  * Merges the two collinear wires meeting at `junctionId` into one wire and removes the junction.
@@ -401,6 +401,7 @@ export declare function planJunctionRelease(document: SchematicDocument, wireId:
401
401
  */
402
402
  export declare function planSegmentDrag(document: SchematicDocument, wireId: string, segment: number, delta: Point, options?: SegmentDragOptions): readonly Point[] | undefined;
403
403
 
404
+ /** 2D point shared by the `.sch` and `.cnv` contracts. */
404
405
  export declare interface Point {
405
406
  readonly x: number;
406
407
  readonly y: number;
@@ -633,7 +634,7 @@ export declare interface SchematicDocument {
633
634
  readonly sheet: SchematicSheet;
634
635
  }
635
636
 
636
- export declare interface SchematicEditOptions extends TopologyOptions {
637
+ export declare interface SchematicEditOptions extends SchematicTopologyOptions {
637
638
  readonly createId?: ElementIdFactory;
638
639
  /** How to handle junctions that stop lying on a wire after its geometry changes. */
639
640
  readonly onJunctionConflict?: 'reject' | 'remove';
@@ -779,6 +780,12 @@ export declare interface SchematicTopology {
779
780
  readonly bounds: Rect | undefined;
780
781
  }
781
782
 
783
+ export declare interface SchematicTopologyOptions {
784
+ readonly devices?: DeviceSymbolProvider;
785
+ /** Coordinate comparison tolerance in page units; defaults to exact matching. */
786
+ readonly tolerance?: number;
787
+ }
788
+
782
789
  export declare type SchematicVersion = typeof SCHEMATIC_VERSION;
783
790
 
784
791
  export declare interface SchematicWire {
@@ -891,12 +898,6 @@ export declare function textDeviceContent(symbol: {
891
898
  readonly properties?: Readonly<Record<string, unknown>>;
892
899
  }): string;
893
900
 
894
- export declare interface TopologyOptions {
895
- readonly devices?: DeviceSymbolProvider;
896
- /** Coordinate comparison tolerance in page units; defaults to exact matching. */
897
- readonly tolerance?: number;
898
- }
899
-
900
901
  export declare interface WireEditOptions {
901
902
  readonly tolerance?: number;
902
903
  readonly createId?: ElementIdFactory;
@@ -1,5 +1,5 @@
1
- import { _ as ASSET_MODES, a as readArrayField, b as isAssetMode, c as readObjectField, d as readStringField, f as report, g as throwIfErrors, h as SchematicError, i as isRecord, l as readPoint, m as parseInput, n as forbidUnknownFields, o as readIntegerField, p as toPointer, r as hasErrors, s as readNumberField, t as checkDuplicateIds, u as readProperties, v as assetPathError, x as isAssetReference, y as base64Error } from "../validate-COqYIMQg.js";
2
- //#region src/schematic/format/types.ts
1
+ import { _ as ASSET_MODES, a as readArrayField, b as isAssetMode, c as readObjectField, d as readStringField, f as report, g as throwIfErrors, h as SchematicError, i as isRecord, l as readPoint, m as parseInput, n as forbidUnknownFields, o as readIntegerField, p as toPointer, r as hasErrors, s as readNumberField, t as checkDuplicateIds, u as readProperties, v as assetPathError, x as isAssetReference, y as base64Error } from "../validate-DuALfDe0.js";
2
+ //#region src/format/types.ts
3
3
  /**
4
4
  * Schema version of the `.sch` contract (see x-botlab/mica-js#6).
5
5
  *
@@ -659,7 +659,7 @@ function symbolBounds(placement, outline, pins) {
659
659
  };
660
660
  }
661
661
  //#endregion
662
- //#region src/schematic/topology/derive.ts
662
+ //#region src/schematic/netlist/derive.ts
663
663
  /**
664
664
  * Derives nets from wires, explicit junctions and symbol connection points (#6).
665
665
  *