Skip to main content

toyc

Toy expression compiler (+ - * /, parens, variables) with CPU and Vulkan GPU backends. Both execute the same AST — compare the results.

from toyc import Cpu, GpuVulkan

Cpu.run("1 + 2")          # 3   (ints stay ints)
GpuVulkan.run("1 + 2")    # 3.0 (GPU is float32)

Install

pip install toyc
sudo apt install glslang-tools   # builds the bundled shaders on first run

Python 3.10+. Needs a Vulkan driver.

Usage

Cpu.run("program.toy")                          # file
Cpu.run("program.toy", env={"a": 1})            # variables
Cpu.run("program.toy", silent=True)             # capture, don't print
Cpu.run("out.toyc")                             # compiled file
Compiler.compile("program.toy")                 # write program.toyc

GpuVulkan.run("program.toy", env={"a": 10.0, "b": 5.0})
GpuVulkan.run("program.toy", env=[{...}, {...}])  # auto-batch → [..]
GpuVulkan.run("program.toy", cache=False)         # skip .toyc write
GpuVulkan.run("program.toyc")                     # cached result, no dispatch

run() takes an inline string, a .toy path, or a .toyc path. .toyc caches hold a scalar (single) or a float list (batch).

GPU session

Setup costs ~15–40 ms once; a dispatch ~0.5 ms. One shared session per process, thread-safe, never torn down per call:

GpuVulkan.startup()    # optional warmup; first call does it lazily
GpuVulkan.run(...)
GpuVulkan.shutdown()   # also automatic at process exit

Batch (where the GPU wins)

One expression, many variable sets, one dispatch per chunk:

results = GpuVulkan.run_batch("prog.toy", [{"a": 1.0}, {"a": 2.0}])

Chunking at the recommended batch size is automatic. Singles → CPU (~0.1 ms vs ~1 ms); bulk → GPU (~23× at N=2000 on RX 580).

Timing & bench

timed=True prints a report and returns (result, timing) (seconds):

cpu_val, cpu_t = Cpu.run("program.toy", timed=True)
gpu_raw, gpu_t = GpuVulkan.run("program.toy", timed=True)

toyc.bench needs no loops from you — one equation + knobs, test values auto-generated:

from toyc.bench import bench, batch_bench, summarize, to_csv

rows = bench("a + b * 2", backend="cpu", n=100, repeat=5)
rows = batch_bench("a + b * 2", backend="vulkan", n=2000, repeat=3)
to_csv(rows, "timings.csv")

import pandas as pd                       # your plotting, your deps
pd.DataFrame(rows).groupby("backend")["total"].mean().plot.bar()

Rows carry backend, program, mode, n, repeat, total, total_time_taken, per_eval, check_err + per-stage columns. summarize(rows) collapses to one row per (backend, program).

Semantics (CPU ≡ GPU)

Case Behavior
Value Numerically equal (15 vs 15.0 — GPU is float32, ~1e-6 error)
1/0, 1/(a-a), 0/0 ZeroDivisionError("Division by zero in VM")
Missing variable NameError("Undefined variable: 'q'")

Pipeline: Lexer → Parser → AST → Evaluator/Cpu, or Flattener → compute shader (toyc/gpu/vulkan/comp*.glsl).

License

See LICENSE.

Metadata

Release files for toyc 0.2.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for toyc 0.2.4
File Size Uploaded
toyc-0.2.4.tar.gz 41.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for toyc 0.2.4
File Interpreter ABI Platform
toyc-0.2.4-py3-none-any.whl Python 3 none any Details

Total release size: 87.3 kB

Release files / toyc-0.2.4.tar.gz

Download URL toyc-0.2.4.tar.gz
Size 41.8 kB
Tags Source
SHA-256 checksum
How to use checksums
47280575b85e7b4f5c232c7149724d7d32ec45c068878ebcf121808e68a8a9b9
BLAKE2b-256 checksum
How to use checksums
d55294ff2dd368002a6537ebcd215c74cf6d6b7748aba90ea55d875744a27a53
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.16

Release files / toyc-0.2.4-py3-none-any.whl

Download URL toyc-0.2.4-py3-none-any.whl
Size 45.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
50fbb91fb4510c29dd6201883722fff45e199bafecc9286c1b7a64f04d1849c3
BLAKE2b-256 checksum
How to use checksums
25837feb32e5818a8c9715363fe80297c4372469cfb403102053a6098b2c6acf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.16

Release history Release notifications | RSS feed

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

This release

0.2.4 This release

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.1.4

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page