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.3
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.3.tar.gz | 36.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| toyc-0.2.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 75.7 kB
Release files / toyc-0.2.3.tar.gz
| Download URL | toyc-0.2.3.tar.gz |
|---|---|
| Size | 36.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d09afef02f0212a384dc3297e6fa6feedd481117af2bd1493a496593c40db2dd
|
|
BLAKE2b-256 checksum How to use checksums |
673d9a4c6429231e648fa83b6b027013520d6237a0387ab35e4aa3ea922c23ab
|
| 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.3-py3-none-any.whl
| Download URL | toyc-0.2.3-py3-none-any.whl |
|---|---|
| Size | 39.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
70487ca551c8983c81f2ebd963c0680cc00660a2924ceaa182be86b652032489
|
|
BLAKE2b-256 checksum How to use checksums |
cd2cb2c3f822424552579e9d7353a7227ad0c6275d8b24248ecef1a6cf766d4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|