Skip to main content

Setnex ISA balanced-ternary processor simulator

Project description

setnex-sim

Python simulator for the Setnex ISA — an open balanced ternary instruction set architecture. Implements the full fetch/decode/execute cycle for a 27-trit processor: 27 general-purpose registers, 5 configurable ternary logic modes (LMODE), and fixed-length R/I/J/U/B instructions. Built on tritlib.

Status

v0.3 — fully functional simulator with assembler and CLI toolchain. 46 opcodes implemented, 98% test coverage.

Implemented:

  • Decoder (R, I, J, U, B formats)
  • ALU (ADD, SUB, MUL, DIV, MOD, NEG, TAND, TOR, TNOT, TIMPL, CONS, ACONS, TSHIFT, TCMP, TGET, TSET, TSIGN, TABS, TMIN, TMAX)
  • Configurable ternary logic via LMODE (Kleene, Łukasiewicz, Heyting, RM3, Bochvar)
  • Registers (27 GPR + CSR: PC, LMODE, FLAGS, EPC, ECAUSE, EVEC, STATUS, ESAVE)
  • Sparse word-addressed memory
  • CPU fetch/decode/execute loop with ternary FLAGS (sign, carry)
  • Branches and jumps (BEQ, BNE, BLT, BGT, BLE, BGE, BF, BRT3, JMP, JMPA, CALL)
  • System instructions (CSRR, CSRW, CSRX, ECALL, IRET, TSEL)
  • Text assembler (setnex-asm): .sasm.tern, label resolution, pseudo-instructions
  • Runner (setnex-run): execute .tern files with register initialisation and ternary exit status

Install

pip install setnex-sim

Or from source:

git clone https://codeberg.org/setnex/setnex-sim
cd setnex-sim
pip install -e ".[dev]"

CLI usage

Assembler

setnex-asm program.sasm -o program.tern

Runner

setnex-run program.tern --set a0=5 --print a0

Options:

  • --set REG=VAL — initialise a register before execution (repeatable)
  • --print REG — print a register after HALT (default: a0)
  • --verbose — print all registers and cycle count

Exit status follows the ternary convention via a1 at HALT:

  • a1 < 0 (N) → shell exit 1 (error)
  • a1 = 0 (Z) → shell exit 0 (indeterminate)
  • a1 > 0 (P) → shell exit 0 (success)

Example programs

Three example programs are provided in fixtures/:

sum.sasm : sum of integers 1..N (validates the full pipeline: LI, CMP, BF, ADD, ADDI, JMP):

setnex-asm fixtures/sum.sasm -o sum.tern
setnex-run sum.tern --set a0=5 --print a0
# a0 = 15

count_p.sasm : count P trits in a0 using TGET and BRT3:

setnex-asm fixtures/count_p.sasm -o count_p.tern
setnex-run count_p.tern --set a0=13 --print a0
# a0 = 3  (13 = +++ in balanced ternary — three P trits)

modsum.sasm : sum with sign driven by symmetric Euclidean i mod 3 ∈ {−1, 0, +1}, dispatched natively by BRT3 — a computation that has no natural binary equivalent:

setnex-asm fixtures/modsum.sasm -o modsum.tern
setnex-run modsum.tern --set a0=6 --print a0
# a0 = -2

check_sign.sasm : looks for a zero between a0 and a1, returns a1 = P if found, Z if absent, and a0 the results if a1 == P

setnex-asm fixtures/check_sign.sasm -o check_sign.tern
setnex-run check_sign.tern --set a0=3 a1=7 --print a0 --print a1
# a0 = 3
# a1 = 0
setnex-run check_sign.tern --set a0=-3 a1=7 --print a0 --print a1
# a0 = 0
# a1 = 1

Python API

from setnex_sim.cpu import CPU
from setnex_sim.assembler import encode_R, encode_I

cpu = CPU()
program = [
    encode_I(-24, rd=1, rs1=0, imm=5),   # LI r1, 5
    encode_I(-24, rd=2, rs1=0, imm=3),   # LI r2, 3
    encode_R(-40, rd=3, rs1=1, rs2=2),   # ADD r3, r1, r2
    encode_R(0,   rd=0, rs1=0, rs2=0),   # HALT
]
cpu.load(program)
cpu.run()
print(int(cpu.regs[3]))  # 8

Setnex ISA

The full ISA specification is available at setnex.org and on Codeberg — Apache 2.0, patent-free.

Licence

MIT — Copyright 2026 Eric Tellier

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

setnex_sim-0.3.2.tar.gz (20.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

setnex_sim-0.3.2-py3-none-any.whl (14.2 kB view details)

Uploaded Python 3

File details

Details for the file setnex_sim-0.3.2.tar.gz.

File metadata

  • Download URL: setnex_sim-0.3.2.tar.gz
  • Upload date:
  • Size: 20.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for setnex_sim-0.3.2.tar.gz
Algorithm Hash digest
SHA256 1c0d4f7df532890ca8d87670f40f442bd25db7d2aae39ea343f61d0ad73f61ce
MD5 92729edd9c44d95fdfb1bac3cf1d2e0b
BLAKE2b-256 bc4c1c62d60bbb37cebbe2946969b040a82235e3bb74aa429c328229a1503a46

See more details on using hashes here.

File details

Details for the file setnex_sim-0.3.2-py3-none-any.whl.

File metadata

  • Download URL: setnex_sim-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 14.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for setnex_sim-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c63ac69c5dbec7ca36a060183359a07c8486da16551994ccbdcbb1cd8d1e83f7
MD5 ef80fe9745d5ae211f5fb614f5055492
BLAKE2b-256 9698239449bff61e0fed02cedb8b262fe0b7019b85c0ba42d5972cb96f69ba45

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page