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)
| File | Size | Uploaded | |
|---|---|---|---|
| toyc-0.2.4.tar.gz | 41.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|