Skip to main content

SDK + CLI (mrg) for local synth/PnR feedback, sandboxed agents, and running FPGA designs on real silicon.

Project description

Manhattan Reasoning Gym

Python SDK and CLI (mrg) for hardware design: iterate locally with fast synthesis / place-and-route feedback, run untrusted agents in a sandbox, and program real cloud FPGAs — all from one package.

Surface What it does Needs
mrg.build local synth / place-and-route reports (no board) Docker
mrg.Sandbox run an agent in a locked container that promotes to silicon Docker
mrg.cloud program + drive a real ECP5 over the cloud API key

Cloud FPGA access requires an allowlisted API key (mrg login). Local synth/PnR and sandboxing need only Docker — no toolchain to install.

Install

pip install manhattan-reasoning-gym

For local synth/PnR and sandboxing, pull the pinned toolchain image once (the SDK runs it for you — you never install yosys/nextpnr/LiteX):

docker pull ghcr.io/barnard-pl-labs/mrg-sandbox:latest

Local feedback — mrg.build

import manhattan_reasoning_gym as mrg

rep = mrg.build.synth("examples/design.py")   # fast: resource utilization
rep = mrg.build.pnr("examples/design.py")     # full SoC: real Fmax + timing
print(rep.fmax_mhz, rep.timing_met, rep.util.dsp.used)

CLI: mrg synth design.py · mrg pnr design.py [--target-mhz N].

synth is the cheap "is it getting bigger?" signal (core-only util); pnr places & routes the full SoC for the truthful system-clock Fmax and timing.

Sandboxed agents — mrg.Sandbox

Run untrusted agent code in a locked container (--network none, no key) that iterates locally and promotes vetted candidates to silicon:

import manhattan_reasoning_gym as mrg

result = mrg.Sandbox(files=["examples/design.py", "examples/agent.py"]).run("agent.py")
for promo in result.promotions:
    print(promo)

The container never holds a key or touches the network; the promote is a file handoff the trusted host brokers to silicon. No promote gating by default — the agent gates itself; pass guard= for an opt-in host-side check. With no API key, silicon resolves to a no-op backend; set one (and silicon="cloud") for real hardware.

Real silicon — mrg.cloud

import manhattan_reasoning_gym as mrg

app = mrg.cloud.App("my_design", design="examples/design.py")
with app:                    # programs the FPGA on first use, releases on exit
    app.write(0x0, 3)
    print("read:", app.read(0x8))

Or drive it from the CLI: mrg run my_design.py.

Authentication (cloud only)

API requests authenticate with an opaque API key sent as X-API-Key. You obtain one by exchanging a GitHub identity — the orchestrator verifies you against its allowlist and mints a key.

mrg login       # GitHub device flow (or paste a no-scope PAT), then you're set

The key is saved to ~/.config/mrg/credentials.json (mode 0600, keyed by orchestrator URL). Every command resolves the key in this order:

  1. --api-key flag
  2. $MRG_API_KEY
  3. the stored login (mrg login)

mrg logout revokes the key on the server and clears it locally.

Tutorials

Two runnable notebooks in examples/notebooks/:

  • 01_build_and_run — local synth/pnr feedback → program a real FPGA.
  • 02_sandboxing — run an agent in a locked sandbox that promotes to silicon.

The shared examples/design.py is a tiny tunable multiply-accumulate; tweak its WIDTH and watch DSP/Fmax move. examples/agent.py is the sandboxed agent.

CLI reference

mrg login | logout
mrg synth <design.py> [--target-mhz N]      # local synthesis report
mrg pnr   <design.py> [--target-mhz N]      # local full-SoC place & route
mrg run   <file.py> [--fpga-id N] [--no-program]
mrg status [fpga_id]
mrg job | logs | cancel <fpga_id> <job_id>
mrg reset <fpga_id>
mrg read  <fpga_id> <addr> [--count N]
mrg write <fpga_id> <addr> <value>

Development

pip install -e ".[dev]"
ruff check . && pytest -q

License

MIT — see LICENSE.

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

manhattan_reasoning_gym-0.1.0.tar.gz (37.4 kB view details)

Uploaded Source

Built Distribution

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

manhattan_reasoning_gym-0.1.0-py3-none-any.whl (35.5 kB view details)

Uploaded Python 3

File details

Details for the file manhattan_reasoning_gym-0.1.0.tar.gz.

File metadata

  • Download URL: manhattan_reasoning_gym-0.1.0.tar.gz
  • Upload date:
  • Size: 37.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for manhattan_reasoning_gym-0.1.0.tar.gz
Algorithm Hash digest
SHA256 74dab748ea42e0adb552ef825373836415ed47866d0f271a0fe47f903f82d756
MD5 84aef87942df7f20330bddb6a599c2ad
BLAKE2b-256 ff20c67062df4d94894ba4899e9d3086d1b2706feea76095c5ee3c15e0e8261c

See more details on using hashes here.

Provenance

The following attestation bundles were made for manhattan_reasoning_gym-0.1.0.tar.gz:

Publisher: publish.yml on Barnard-PL-Labs/manhattan-reasoning-gym

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file manhattan_reasoning_gym-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for manhattan_reasoning_gym-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6590eb65f26309470665b6e0d1cb2e51ac3813d4c64f40a406a7813266b90ecd
MD5 54d4deef667096199ebbfaae8d884dc0
BLAKE2b-256 b4bfd02159a30fae316c3ef1f9a251be5c6fa49ff7d262e07d18bb5e8747ff57

See more details on using hashes here.

Provenance

The following attestation bundles were made for manhattan_reasoning_gym-0.1.0-py3-none-any.whl:

Publisher: publish.yml on Barnard-PL-Labs/manhattan-reasoning-gym

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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