Fresh current-source Windows 2.9.0 review candidate; final-package/platform checks pending
Package applicability is under review; follow the stated version and platform limits.
Choose the source and its units
Use the first terminal pair for output voltage V(out+)-V(out-) and positive output current from out+ to out-. Voltage control uses V(cp)-V(cn); current control uses the positive sensing-branch current from cp to cn.
| Source | Control and output equation | Gain units |
|---|---|---|
| E (VCVS) | Vout = gain * Vcontrol | Dimensionless V/V |
| G (VCCS, transconductance) | Iout = gm * Vcontrol | Siemens A/V |
| F (CCCS) | Iout = gain * Icontrol | Dimensionless A/A |
| H (CCVS, transresistance) | Vout = r * Icontrol | Ohms V/A |
Connect current control as a sensing port
The F/H form here is name out+ out- cp cn gain. It takes two node names, rather than the name of a separate sensing voltage source. The control port is an ideal zero-voltage branch inserted between cp and cn, not a non-invasive measurement of any existing branch.
Keep those terminals electrically distinct: 0 and GND are the same ground. Insert each sensor in the intended current path; connecting one directly across an ideal voltage source can impose an incompatible zero voltage. Do not put two ideal sensors across the same port and assume a unique current split.
In this fixture, RF and RH feed separate FC/HC sensing ports from IN through 100 ohms. FC and HC are held at zero volts, so each control current is Vin/100 ohms. E/G voltage controls add no ideal input current. The F/H feed currents are real circuit loading, even though the sensing voltage is zero.

Prepare the complete teaching inputs
Extract all files into one writable folder and keep controlled-network.cir beside all four root decks. Use a compatible licensed Windows JoSIM®-Pro 2.9.0 runtime. The Python 3 helper needs only the standard library. Set $Python, $JoSIM and $Licence to full paths; select the issued JoSIM®-Pro licence, distinct from an InductEx® key.
The circuit uses ideal gains and 100-ohm loads. It supplies no saturation, bandwidth limit, compliance limit or measured-device calibration. The 1–3 GHz result is a numerical sign/gain check for that ideal model, not a physical amplifier qualification.
Run and inspect the saved network in the GUI
- Open controlled-network.cir to inspect E/G/F/H terminal order, feed resistors and gain units. This file is an include; open a root deck to run an analysis.
- Open controlled-tran.cir and use Run simulation. It ramps Vin from -0.1 V to 0.2 V over 1 ns at 5 ps steps and output cadence, producing 201 samples and nine voltage/current signals.
- Inspect V(IN), V(EO), V(GO), V(FO) and V(HO). Show those voltage panels to compare signs; current panels remain available. The illustration uses mV and ns, while the exported numerical CSV uses V, A and s.
- Save the intended source before rerunning. After an error, wait for the failed task and dialog to finish; correct the first diagnostic and run a separate current output generation. Explicitly reopen the saved root after restarting.

Check loaded voltages and branch-current signs
At Vin=0.2 V, E gives +0.6 V and I(E1)=-6 mA through the 100-ohm load. G drives +2 mA from GO to ground, so its loaded voltage is -0.2 V. F drives +4 mA from FO to ground, giving -0.4 V. H gives +0.6 V and I(H1)=-6 mA. A positive current-source gain therefore need not give a positive loaded node voltage.
Reversing cp/cn reverses the corresponding control sign; a negative gain also reverses the output relation. The independent checks exercise each change separately in AC and transient copies. They retain source and output orientation rather than taking absolute values.
Interpret the complex AC reference
Open controlled-ac.cir and run it separately. The DC bias is 0.2 V; the peak AC source is 1 V at 30 degrees. Three frequencies are 1, 2 and 3 GHz. The phasor convention is peak exp(+j*omega*t). E and H output phasors equal 3 times the input; loaded G and F voltages equal -1 and -2 times it.
The selected E/G panels show 3 V at 30 degrees and 1 V at -150 degrees. Negative gain changes phase by 180 degrees; a magnitude alone hides that sign. The actual typed AC file retains all nine complex voltage/current signals. Opening that file later is inspection, not another solve.

Keep standalone OP/DC rejection separate from AC bias
controlled-op.cir and controlled-dc.cir are deliberate negative controls. The checked standalone .OP/.DC path rejects controlled sources before publishing a new analysis file. Its diagnostic identifies unsupported device E1. These decks are not successful static examples.
The AC engine uses a separate selected-bias assembly that supports this network. Its successful bias does not establish standalone OP/DC support. Use the supported AC/transient teaching decks and do not infer a missing capability from a different analysis path.
Recognise invalid ports and the zero-F limit
F/H with electrically identical control terminals are rejected, including 0/GND aliases. The incompatible Fname out+ out- VSENSE gain form is also rejected here. Preserve the source-location diagnostic, restore two intended control terminals and rerun the complete saved deck.
KB-SOURCE-001: changing only the supplied F gain to zero gives finite zero F output in AC, but fixed-step VOLTAGE/BDF transient execution rejects nonfinite input. Prior reports are preserved. Restoring the original nonzero teaching gain recovers the supplied reference; no product correction is claimed.
Do not substitute an arbitrary tiny gain for a physically intended zero. A separately derived equivalent circuit must preserve the intended sensing-port topology and loading and needs its own checks. Other source gains or modes do not inherit this particular observed failure.
Check the complete teaching network from the CLI
Run this block in the extracted folder. controlled-review must be new. A zero client exit and passed receipt require three current reference-checked generations and the two specifically expected unsupported OP/DC rejections. Each verdict remains explicit.
The 5 ps and 2.5 ps runs match the ideal memoryless equations at their own coordinates and agree at shared samples. This does not establish time convergence for a circuit containing energy storage or an arbitrary model. The fixture bounds are 1e-12 V for voltage and 1e-12 A for current; they are not general physical tolerances.
The helper isolates its own configuration, checks the actual version and preserves issued licence/input bytes. Raw receipts and logs can contain local paths and licence-holder information; keep them private and review before sharing.
& $Python -B .\run_sources.py --josim $JoSIM --licence $Licence --expected-version 2.9.0 --output-root .\controlled-review
if ($LASTEXITCODE -ne 0) { throw 'The controlled-source check failed; inspect the new private receipt and first diagnostic.' }
$Receipt = Get-Content .\controlled-review\run.json -Raw | ConvertFrom-Json
if ($Receipt.status -ne 'passed' -or $Receipt.results.op.verdict -ne 'expected-unsupported-analysis-rejection' -or $Receipt.results.dc.verdict -ne 'expected-unsupported-analysis-rejection') { throw 'The supported-result or explicit OP/DC rejection contract changed.' }Save controlled-network.cir
* Synthetic ideal controlled-source network; gains use SI units.
E1 EO 0 IN 0 3
RE EO 0 100
G1 GO 0 IN 0 .01
RG GO 0 100
RF IN FC 100
F1 FO 0 FC 0 2
RFO FO 0 100
RH IN HC 100
H1 HO 0 HC 0 300
RHO HO 0 100Save controlled-op.cir
* Ideal E/G/F/H teaching network
.include "controlled-network.cir"
V1 IN 0 DC .2
.OPTION SEED=321 ANALYSIS=VOLTAGE INTEGRATION=BDF
.OP
.ENDSave controlled-dc.cir
* Ideal E/G/F/H teaching network
.include "controlled-network.cir"
V1 IN 0 DC .2
.OPTION SEED=321 ANALYSIS=VOLTAGE INTEGRATION=BDF
.DC V1 -.2 .2 .1
.ENDSave controlled-ac.cir
* Ideal E/G/F/H teaching network
.include "controlled-network.cir"
V1 IN 0 DC .2 AC 1 30
.OPTION SEED=321 ANALYSIS=VOLTAGE INTEGRATION=BDF
.AC LIN 3 1G 3G
.PRINT AC V(IN) V(EO) V(GO) V(FO) V(HO) I(E1) I(G1) I(F1) I(H1)
.ENDSave controlled-tran.cir
* Ideal E/G/F/H teaching network
.include "controlled-network.cir"
V1 IN 0 PWL(0 -.1 1n .2)
.OPTION SEED=321 ANALYSIS=VOLTAGE INTEGRATION=BDF
.TRAN 5p 1n 0 5p
.PRINT V(IN) V(EO) V(GO) V(FO) V(HO) I(E1) I(G1) I(F1) I(H1)
.ENDSave run_sources.py
"""Check the supplied ideal E/G/F/H network with a licensed Windows JoSIM CLI."""
import argparse
import cmath
import csv
import hashlib
import io
import json
import math
import os
from pathlib import Path
import re
import subprocess
import sys
NAMES = ['controlled-network.cir'] + ['controlled-' + m + '.cir' for m in ('op', 'dc', 'ac', 'tran')]
GAINS = {'V(IN)': 1, 'V(EO)': 3, 'V(GO)': -1, 'V(FO)': -2, 'V(HO)': 3,
'I(E1)': -.03, 'I(G1)': .01, 'I(F1)': .02, 'I(H1)': -.03}
def sha(path):
return hashlib.sha256(path.read_bytes()).hexdigest()
def table(path):
text = path.read_text(encoding='utf-8-sig')
metadata = None
if text.startswith('# josim-ac-csv/1 '):
line, text = text.split('\n', 1)
metadata = json.loads(line[len('# josim-ac-csv/1 '):])
rows = list(csv.reader(io.StringIO(text)))
names = rows[0]
data = [[float(x) for x in row] for row in rows[1:] if row]
if (not data or len(names) != len(set(names)) or any(len(row) != len(names)
or not all(math.isfinite(x) for x in row) for row in data)):
raise ValueError('Missing, duplicate, ragged or nonfinite numerical data')
return metadata, names, data
def check_ac(path):
metadata, names, rows = table(path)
expected_names = ['frequency (Hz)']
for signal in GAINS:
unit = 'V' if signal.startswith('V') else 'A'
expected_names += ['Re(' + signal + ') (' + unit + ')', 'Im(' + signal + ') (' + unit + ')']
if names != expected_names or len(rows) != 3 or metadata is None:
raise ValueError('Unexpected AC columns or sample count')
if metadata.get('phasor_convention') != 'peak_exp_positive_j' or str(metadata.get('effective_seed')) != '321':
raise ValueError('Unexpected AC phasor convention or seed')
source = cmath.rect(1, math.pi / 6)
maximum = 0
for index, row in enumerate(rows):
if row[0] != (index + 1) * 1e9:
raise ValueError('Unexpected AC frequency coordinate')
for column, (signal, gain) in enumerate(GAINS.items()):
actual = complex(row[1 + 2 * column], row[2 + 2 * column])
error = abs(actual - gain * source)
maximum = max(maximum, error)
if error > 1e-12:
raise ValueError('AC sign or gain reference failed for ' + signal)
return {'samples': 3, 'signals': 9, 'max_absolute_reference_error': maximum,
'reference': 'Ideal memoryless gains; voltages in V and currents in A'}
def check_transient(path, step):
_, names, rows = table(path)
if names != ['time'] + list(GAINS) or len(rows) != round(1e-9 / step) + 1:
raise ValueError('Unexpected transient columns or sample count')
maximum = 0
for index, row in enumerate(rows):
if abs(row[0] - index * step) > 1e-21:
raise ValueError('Unexpected transient time coordinate')
voltage = -.1 + 3e8 * row[0]
for value, (signal, gain) in zip(row[1:], GAINS.items()):
error = abs(value - gain * voltage)
maximum = max(maximum, error)
if error > 1e-12:
raise ValueError('Transient sign or gain reference failed for ' + signal)
return {'samples': len(rows), 'signals': 9, 'step_s': step,
'max_absolute_reference_error': maximum,
'reference': 'Imposed linear ramp and ideal memoryless gains; V and A'}
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--josim', required=True, type=Path)
parser.add_argument('--licence', required=True, type=Path)
parser.add_argument('--expected-version', required=True)
parser.add_argument('--output-root', required=True, type=Path)
args = parser.parse_args()
source = Path(__file__).resolve().parent
try:
if os.name != 'nt':
raise ValueError('This checked launcher is Windows-specific')
binary = args.josim.resolve(strict=True)
licence = args.licence.resolve(strict=True)
root = args.output_root.resolve()
if not binary.is_file() or not licence.is_file() or root.exists() or any(x in str(licence) for x in '\r\n'):
raise ValueError('Use existing executable/licence files and a new output root')
inputs = {name: sha(source / name) for name in NAMES + ['run_sources.py']}
licence_hash = sha(licence)
root.mkdir(parents=True, exist_ok=False)
except (OSError, ValueError) as error:
print('Preflight refused: ' + str(error), file=sys.stderr)
return 2
receipt = {'status': 'failed', 'inputs': inputs, 'results': {},
'scope': 'Supplied ideal synthetic Windows E/G/F/H network only; no measured-device or arbitrary-topology qualification'}
try:
home = root / 'home'
(home / '.josimpro').mkdir(parents=True)
(home / '.josimpro/config.ini').write_text('[General]\nLicenseLocation=' + str(licence) + '\n', encoding='utf-8')
environment = os.environ.copy()
environment['USERPROFILE'] = str(home)
environment['PATH'] = str(binary.parent) + os.pathsep + environment.get('PATH', '')
for key, suffix in [('APPDATA', 'AppData/Roaming'), ('LOCALAPPDATA', 'AppData/Local')]:
(home / suffix).mkdir(parents=True)
environment[key] = str(home / suffix)
version = subprocess.run([str(binary), '--version'], env=environment, capture_output=True, timeout=15)
(root / 'private-version.log').write_bytes(version.stdout + version.stderr)
found = re.search(r'(?m)^v(\d+\.\d+\.\d+)\s*$', (version.stdout + version.stderr).decode('utf-8', errors='replace'))
if version.returncode or not found or found[1] != args.expected_version:
raise ValueError('The resolved executable does not report the requested version')
receipt['runtime'] = {'version': found[1], 'binary_sha256': sha(binary)}
for mode in ('ac', 'tran', 'half-step', 'op', 'dc'):
directory = root / mode
directory.mkdir()
name = 'controlled-' + ('tran' if mode == 'half-step' else mode) + '.cir'
text = (source / name).read_text(encoding='utf-8')
if mode == 'half-step':
if text.count('.TRAN 5p 1n 0 5p') != 1:
raise ValueError('The supplied teaching transient was changed')
text = text.replace('.TRAN 5p 1n 0 5p', '.TRAN 2.5p 1n 0 2.5p')
deck = directory / name
deck.write_text(text, encoding='utf-8', newline='\n')
(directory / 'controlled-network.cir').write_bytes((source / 'controlled-network.cir').read_bytes())
output = directory / 'result.csv'
run = subprocess.run([str(binary), '-P', '17', '-o', str(output), str(deck)],
cwd=directory, env=environment, capture_output=True, timeout=60)
raw = run.stdout + run.stderr
(directory / 'private-process.log').write_bytes(raw)
if mode in {'op', 'dc'}:
if (run.returncode == 0 or output.exists() or b'controlled/phase sources' not in raw
or b'Unsupported device: E1' not in raw):
raise ValueError('The documented standalone OP/DC rejection changed; review this runtime')
result = {'verdict': 'expected-unsupported-analysis-rejection', 'process_status': run.returncode,
'output_created': False, 'unsupported_device': 'E1'}
else:
if run.returncode or not output.is_file():
raise ValueError(mode + ' did not produce a current successful analysis file')
result = check_ac(output) if mode == 'ac' else check_transient(output, 2.5e-12 if mode == 'half-step' else 5e-12)
result.update(verdict='reference-passed', output_sha256=sha(output))
receipt['results'][mode] = result
receipt['status'] = 'passed'
except (OSError, ValueError, KeyError, subprocess.SubprocessError) as error:
receipt['reason'] = str(error)
finally:
if inputs != {name: sha(source / name) for name in inputs} or sha(licence) != licence_hash:
receipt.update(status='failed', reason='A teaching input or issued licence changed during execution')
(root / 'run.json').write_text(json.dumps(receipt, indent=2) + '\n', encoding='utf-8')
print(json.dumps({'status': receipt['status'], 'results': {m: r['verdict'] for m, r in receipt['results'].items()}}))
return 0 if receipt['status'] == 'passed' else 1
if __name__ == '__main__':
raise SystemExit(main())Check the result
Require new outputs, intended saved source and compatible runtime, finite complete axes and all declared per-signal equations. Treat expected unsupported-analysis rejection and the zero-F issue separately from successful AC/transient data.
If the problem remains
Keep the complete root and adjacent include, exact runtime and first diagnostic privately. Check terminal order, gain units, circuit loading, supported analysis and saved-file identity before changing the model. Solver completion alone does not validate a physical device or a different topology.
Sources and verification details
Recorded inputs/builds only. Complete walkthrough and final-package acceptance remain separate.
VAL-070 · Frozen current-source Windows JoSIM®-Pro 2.9.0 review candidate
28 real CLI/client/reference checks cover complete ideal E/G/F/H inputs, nine complex and transient signals, reversed terminals, negative gains, explicit OP/DC and invalid-port rejection, prior-file preservation and recovery. Zero F gain passes AC but the checked transient fails with nonfinite input (KB-SOURCE-001). Actual browser-downloaded bytes pass nine command/archive comparisons and repeat all 28 independent contract checks.
No product repair, complete GUI article, physical OS picker/pointer, automatic session restoration, arbitrary topology or measured-device accuracy, other platforms or final-package acceptance. A passed review retains expected unsupported-analysis and zero-F transient failures.
VAL-071 · Frozen current-source Windows JoSIM®-Pro 2.9.0 review candidate
23 independent native/source/artifact checks cover two normal app processes, four successful and three failed runs, actual source and selected plot views, unchanged raw arrays after visibility changes, preserved prior reports, recovery, typed AC inspection and explicit reopening.
No product repair, complete GUI article, physical OS picker/pointer, automatic session restoration, arbitrary topology or measured-device accuracy, other platforms or final-package acceptance. An earlier abnormal error-handling attempt is retained without cause attribution; the completed scenario settles the event loop after each expected modal error.
josim-controlled-network
Frozen maintained-source-matched Windows JoSIM®-Pro 2.9.0 candidate, reviewed 4 November 2026
No product repair, complete GUI article, physical OS picker/pointer, automatic session restoration, arbitrary topology or measured-device accuracy, other platforms or final-package acceptance. Raw SI reference checks remain separate from display units.
josim-controlled-transient
Frozen maintained-source-matched Windows JoSIM®-Pro 2.9.0 candidate, reviewed 4 November 2026
No product repair, complete GUI article, physical OS picker/pointer, automatic session restoration, arbitrary topology or measured-device accuracy, other platforms or final-package acceptance. Raw SI reference checks remain separate from display units.
josim-controlled-ac
Frozen maintained-source-matched Windows JoSIM®-Pro 2.9.0 candidate, reviewed 4 November 2026
No product repair, complete GUI article, physical OS picker/pointer, automatic session restoration, arbitrary topology or measured-device accuracy, other platforms or final-package acceptance. Raw SI reference checks remain separate from display units.
- josim-pro:docs/manual_source/sections/syntax.tex · Sources and controlled sources; detailed CCCS, CCVS, VCCS and VCVS forms
- validation:controlled-sources-20261104 · VAL-070/071 complete E/G/F/H reference, analysis-domain limits and native recovery
- 28 independent CLI/client/reference and 23 native/source/artifact checks on a frozen Windows 2.9.0 candidate; maintained-source comparison found no changes in 2,859 selected GUI/core/C API files.
- Standalone OP/DC rejection is explicit; AC has a separate bias path. Zero-F transient failure remains open. The first native AC-view assertion and a later abnormal process exit are retained; neither is passed or attributed to a product repair.
- No product repair, complete GUI article, physical OS picker/pointer, automatic session restoration, arbitrary topology or measured-device accuracy, other platforms or final-package acceptance.
