diff --git a/docs/product/.gitignore b/docs/product/.gitignore
new file mode 100644
index 0000000..01ccb0b
--- /dev/null
+++ b/docs/product/.gitignore
@@ -0,0 +1,4 @@
+# Build outputs — regenerate with build.py
+tt-datasheet.html
+tt-datasheet.pdf
+.tt-datasheet.chrome.html
diff --git a/docs/product/assets/OFL.txt b/docs/product/assets/OFL.txt
new file mode 100644
index 0000000..8597481
--- /dev/null
+++ b/docs/product/assets/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2020 The Archivo Project Authors (https://github.com/Omnibus-Type/Archivo)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/docs/product/assets/README.md b/docs/product/assets/README.md
new file mode 100644
index 0000000..cf38efc
--- /dev/null
+++ b/docs/product/assets/README.md
@@ -0,0 +1,13 @@
+# Datasheet assets
+
+Both files are embedded as data URIs by `build.py`, so the generated HTML is
+self-contained. Swap either one by dropping in a replacement and updating the
+`assets:` block in `datasheet.yaml`.
+
+| File | Source | Licence |
+| ---- | ------ | ------- |
+| `archivo.woff2` | [Archivo](https://github.com/Omnibus-Type/Archivo) via Google Fonts, latin subset, variable weight 100–900 | SIL Open Font License 1.1 — see `OFL.txt` |
+| `demoboard.jpg` | Tiny Tapeout ETR demoboard quickstart guide, downscaled to 1000px | © 2024 Pat Deegan, psychogenic.com — **not** covered by this repo's Apache-2.0 licence |
+
+The demoboard photo is credited in the datasheet caption. Confirm redistribution
+is agreed with the copyright holder before publishing the datasheet externally.
diff --git a/docs/product/assets/archivo.woff2 b/docs/product/assets/archivo.woff2
new file mode 100644
index 0000000..a31bef9
Binary files /dev/null and b/docs/product/assets/archivo.woff2 differ
diff --git a/docs/product/assets/demoboard.jpg b/docs/product/assets/demoboard.jpg
new file mode 100644
index 0000000..12e7581
Binary files /dev/null and b/docs/product/assets/demoboard.jpg differ
diff --git a/docs/product/build.py b/docs/product/build.py
new file mode 100644
index 0000000..3f7b9fd
--- /dev/null
+++ b/docs/product/build.py
@@ -0,0 +1,257 @@
+#!/usr/bin/env python3
+"""Build the two-page Tiny Tapeout product datasheet.
+
+All copy, numbers and colours live in datasheet.yaml. This script renders them
+through datasheet.html.mustache, inlining the font and photo as data URIs so the
+result is a single self-contained file that prints to two A4 pages.
+
+ python3 docs/product/build.py # write tt-datasheet.html
+ python3 docs/product/build.py --pdf # also render tt-datasheet.pdf
+
+The sheets are a fixed 297mm tall with overflow hidden, so copy that grows too
+long is silently clipped rather than spilling onto a third page. Every build
+therefore measures the rendered sheets in headless Chrome and fails if anything
+overflows. Pass --no-check to skip that (or set CHROME if it isn't found).
+
+Requires chevron and pyyaml, both already pinned in requirements.txt.
+"""
+
+import argparse
+import base64
+import logging
+import os
+import re
+import shutil
+import subprocess
+import sys
+from pathlib import Path
+
+import chevron
+import yaml
+
+HERE = Path(__file__).parent
+
+# `style` tokens in datasheet.yaml -> CSS classes in the template.
+STYLE_CLASSES = {
+ "name": "t-name",
+ "mono": "t-mono",
+ "num": "t-num",
+ "price": "t-price",
+ "dim": "t-dim",
+ "center": "t-center",
+}
+
+# Tables are rendered through partials/table.mustache and need preparing first.
+TABLE_KEYS = ["pricing", "process", "ratings", "gpio", "analog", "ordering"]
+
+EM_DASH = "—"
+
+CHROME_CANDIDATES = [
+ os.environ.get("CHROME"),
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
+ "google-chrome",
+ "chromium",
+]
+
+
+def cell_classes(style: str, value: str) -> str:
+ """Map a column's style tokens to CSS classes for one cell."""
+ classes = []
+ for token in style.split():
+ try:
+ classes.append(STYLE_CLASSES[token])
+ except KeyError:
+ raise SystemExit(
+ f"unknown style '{token}' — expected one of {', '.join(STYLE_CLASSES)}"
+ )
+ # A lone em dash means "not applicable"; grey it out wherever it appears.
+ if value.strip() == EM_DASH and "t-dim" not in classes:
+ classes.append("t-dim")
+ return " ".join(classes)
+
+
+def prepare_table(name: str, table: dict) -> None:
+ """Expand a table's columns and rows into what the template expects."""
+ columns = table.get("columns") or []
+ for column in columns:
+ width = column.get("width")
+ column["width_attr"] = f' style="width:{width}"' if width else ""
+ column.setdefault("label", "")
+
+ styles = [column.get("style", "") for column in columns]
+
+ rows = []
+ for index, row in enumerate(table.get("rows") or [], start=1):
+ if len(row) != len(columns):
+ raise SystemExit(
+ f"{name}: row {index} has {len(row)} cells "
+ f"but there are {len(columns)} columns"
+ )
+ rows.append(
+ {
+ "cells": [
+ {"v": value, "cls": cell_classes(style, value)}
+ for style, value in zip(styles, row)
+ ]
+ }
+ )
+
+ table["rows"] = rows
+ table["has_note"] = bool(table.get("note"))
+ table["has_footnote"] = bool(table.get("footnote"))
+
+
+def as_data_uri_payload(path: Path) -> str:
+ if not path.is_file():
+ raise SystemExit(f"missing asset: {path}")
+ return base64.b64encode(path.read_bytes()).decode()
+
+
+def find_chrome() -> str:
+ for candidate in CHROME_CANDIDATES:
+ if candidate and (Path(candidate).is_file() or shutil.which(candidate)):
+ return candidate
+ raise SystemExit(
+ "could not find Chrome — set the CHROME environment variable to its path"
+ )
+
+
+MEASURE_SCRIPT = """
+
pending
+
+"""
+
+
+def run_chrome(*flags: str, page: Path) -> bytes:
+ result = subprocess.run(
+ [
+ find_chrome(),
+ "--headless",
+ "--disable-gpu",
+ "--no-sandbox",
+ *flags,
+ page.resolve().as_uri(),
+ ],
+ check=True,
+ capture_output=True,
+ )
+ return result.stdout
+
+
+def as_document(html_path: Path, extra: str = "") -> Path:
+ """Chrome needs a complete document; the published artifact is wrapped for us."""
+ wrapped = html_path.with_name("." + html_path.stem + ".chrome.html")
+ wrapped.write_text(
+ ""
+ ""
+ + html_path.read_text(encoding="utf-8")
+ + extra
+ + "",
+ encoding="utf-8",
+ )
+ return wrapped
+
+
+def check_fit(html_path: Path) -> bool:
+ """Measure each sheet in Chrome; report how far any of them overflows."""
+ page = as_document(html_path, MEASURE_SCRIPT)
+ try:
+ dom = run_chrome("--virtual-time-budget=5000", "--dump-dom", page=page)
+ finally:
+ page.unlink(missing_ok=True)
+
+ found = re.search(rb'([^<]*)
', dom)
+ if not found or found.group(1) == b"pending":
+ logging.warning("could not measure sheet fit — skipping check")
+ return True
+
+ overflowed = False
+ for entry in found.group(1).decode().split(","):
+ sheet, overflow = entry.split(":")
+ if float(overflow) > 0:
+ overflowed = True
+ logging.error(
+ f"page {sheet} overflows by {overflow}mm — content past the bottom "
+ "of the sheet is CLIPPED, not moved to another page"
+ )
+ else:
+ logging.info(f"page {sheet} fits")
+ if overflowed:
+ logging.error("trim copy in datasheet.yaml, or shorten a table")
+ return not overflowed
+
+
+def render_pdf(html_path: Path, pdf_path: Path) -> None:
+ page = as_document(html_path)
+ try:
+ run_chrome("--no-pdf-header-footer", f"--print-to-pdf={pdf_path}", page=page)
+ finally:
+ page.unlink(missing_ok=True)
+ pages = len(re.findall(rb"/Type\s*/Page[^s]", pdf_path.read_bytes()))
+ logging.info(f"wrote {pdf_path} ({pages} pages)")
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument(
+ "--config", default=HERE / "datasheet.yaml", type=Path, help="content YAML"
+ )
+ parser.add_argument(
+ "--out", default=HERE / "tt-datasheet.html", type=Path, help="output HTML"
+ )
+ parser.add_argument(
+ "--pdf", action="store_true", help="also render a PDF next to the HTML"
+ )
+ parser.add_argument(
+ "--no-check",
+ dest="check",
+ action="store_false",
+ help="skip the headless-Chrome overflow check",
+ )
+ args = parser.parse_args()
+
+ logging.basicConfig(
+ level=logging.INFO, format="%(levelname)-8s %(message)s", stream=sys.stdout
+ )
+
+ with open(args.config, encoding="utf-8") as fh:
+ content = yaml.safe_load(fh)
+
+ for key in TABLE_KEYS:
+ if key not in content:
+ raise SystemExit(f"{args.config}: missing '{key}' section")
+ prepare_table(key, content[key])
+
+ assets = HERE / "assets"
+ content["font_b64"] = as_data_uri_payload(assets / content["assets"]["font"])
+ content["photo_b64"] = as_data_uri_payload(assets / content["assets"]["photo"])
+
+ with open(HERE / "datasheet.html.mustache", encoding="utf-8") as fh:
+ rendered = chevron.render(
+ fh.read(),
+ content,
+ partials_path=str(HERE / "partials"),
+ partials_ext="mustache",
+ )
+
+ args.out.write_text(rendered, encoding="utf-8")
+ logging.info(f"wrote {args.out} ({len(rendered) / 1024:.0f} KB)")
+
+ if args.pdf:
+ render_pdf(args.out, args.out.with_suffix(".pdf"))
+
+ if args.check and not check_fit(args.out):
+ sys.exit(1)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/docs/product/datasheet.html.mustache b/docs/product/datasheet.html.mustache
new file mode 100644
index 0000000..dfc7309
--- /dev/null
+++ b/docs/product/datasheet.html.mustache
@@ -0,0 +1,486 @@
+{{&doc.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{&hero.eyebrow}}
+
{{&hero.heading}}
+
{{&hero.body}}
+
+
+
+
+ {{&hero.photo_caption}}
+
+
+
+
+ {{#features}}
+
+
{{&kicker}}
+
{{&title}}
+
{{&body}}
+
+ {{/features}}
+
+
+
+ {{#pricing}}{{> secthead}}{{> table}}{{> footnote}}{{/pricing}}
+
+
+
+ {{#faq}}
+ {{> secthead}}
+
+ {{#items}}
+
+ {{/items}}
+
+ {{/faq}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{#process}}{{> secthead}}{{> table}}{{> footnote}}{{/process}}
+
+
+
+ {{#ratings}}{{> secthead}}{{> table}}{{> footnote}}{{/ratings}}
+
+
+
+
+
+ {{#gpio}}
+ {{> secthead}}
+ {{> table}}
+
{{&linkline}}
+ {{/gpio}}
+
+
+ {{#analog}}
+ {{> secthead}}
+ {{> table}}
+
{{&linkline}}
+ {{/analog}}
+
+
+
+
+
+ {{#ordering}}{{> secthead}}{{> table}}{{> footnote}}{{/ordering}}
+
+
+
+
+
+
+
+
+
diff --git a/docs/product/datasheet.yaml b/docs/product/datasheet.yaml
new file mode 100644
index 0000000..934ed5b
--- /dev/null
+++ b/docs/product/datasheet.yaml
@@ -0,0 +1,265 @@
+# ---------------------------------------------------------------------------
+# Tiny Tapeout product datasheet — all copy, numbers and colours.
+#
+# Edit this file, then rebuild:
+# python3 docs/product/build.py
+#
+# Notes for editing:
+# - Every text field is rendered as raw HTML, so ,
and
+# work anywhere. Write a literal ampersand as &.
+# - Table `style` tokens set cell formatting, space separated:
+# name bold, no wrapping (first column of most tables)
+# mono bold + tabular figures (dimensions, values, signal names)
+# num tabular figures (aligned digits)
+# price bold red + no wrapping (pricing column)
+# dim greyed out (em dashes, secondary text)
+# center centre aligned
+# - Table rows must have the same number of cells as there are columns.
+# ---------------------------------------------------------------------------
+
+doc:
+ title: Tiny Tapeout — Datasheet
+ wordmark: Tiny Tapeout
+ wordmark_sub: SHARED SILICON ASIC SHUTTLE
+ tag: DATASHEET
+ ref: DOC TT-DS-2026 · REV A
+ page2_title: Electrical & Mechanical Specifications
+
+# Colours and the two page-level type sizes. Everything else scales from these.
+theme:
+ navy: "#040371" # header bars and table header rows
+ red: "#ec3013" # accent: labels, rules, prices
+ ink: "#141414" # body text
+ ink_mid: "#55545f" # secondary text
+ ink_faint: "#86858f" # captions, dashes
+ ground: "#f2f1f4" # zebra stripe on tables
+ rule: "#c9c8d0" # thin rules
+ rule_hard: "#141414" # 2px section rules
+ heading_size: 30pt # page 1 headline
+ body_size: 8.3pt # feature and FAQ body text
+
+assets:
+ # Relative to docs/product/assets/. Swap either file and rebuild.
+ photo: demoboard.jpg
+ font: archivo.woff2
+
+# --------------------------------------------------------------------------
+# PAGE 1
+# --------------------------------------------------------------------------
+
+hero:
+ eyebrow: Shared multi-project chip · SKY130 / SG13G2 / GF180MCU
+ heading: From idea to chip design in minutes
+ body: >-
+ Tiny Tapeout makes it more accessible than ever to get your designs manufactured on a real chip.
+ Submit from a
+ GitHub repository and we handle integration, tapeout, packaging and delivery.
+ photo_alt: Tiny Tapeout ETR demoboard with a QFN-64 packaged ASIC on a breakout board
+ photo_caption: Demoboard with QFN-64 packaged die on breakout carrier.
+
+features:
+ - kicker: 01 · Toolchain
+ title: Local tool install optional
+ body: >-
+ The whole flow can run in GitHub Actions. Push your repository and your design
+ is hardened in the cloud — nothing to install, no licences to buy.
+ - kicker: 02 · Languages
+ title: HDL agnostic
+ body: >-
+ Any language that can produce Verilog RTL. Project templates and CI are
+ supplied for Verilog, with community provided VHDL and Chisel.
+ - kicker: 03 · I/O
+ title: 26 pins, plus analog
+ body: >-
+ Clock, reset, 8 dedicated inputs, 8 dedicated outputs and 8 bidirectional
+ pins — plus up to 6 analog pins where the process allows.
+ - kicker: 04 · Process
+ title: Three PDKs
+ body: >-
+ SkyWater SKY130, IHP sg13g2 and GlobalFoundries gf180mcu. Open-source PDKs
+ running multiple times per year.
+ - kicker: 05 · Hardware
+ title: Demoboard available
+ body: >-
+ An optional RP2350-based demoboard carries your packaged chip and selects
+ any project on the die over USB.
+ - kicker: 06 · Flexibility
+ title: Bring your own flow
+ body: >-
+ Harden with the supplied open-source LibreLane flow, or use your own tools
+ entirely — the minimum submission is GDS + LEF.
+
+pricing:
+ heading: Pricing
+ note: INDICATIVE FROM-PRICES · EUR
+ columns:
+ - {label: Item, width: "27%", style: name}
+ - {label: What it buys you}
+ - {label: From, width: "26%", style: price}
+ rows:
+ - ["1 tile",
+ "Roughly 1,000 standard cells of silicon area. Physical dimensions vary by PDK — see page 2.",
+ "€70"]
+ - ["Analog pin",
+ "Multiplexed analog pad access for mixed signal designs. Minimum project size of 2 tiles applies.",
+ "€100 / pin"]
+ - ["Demoboard PCB",
+ "Optional add-on: your packaged chip, an RP2350 demoboard and a breakout board.",
+ "€100 first 80 boards for individuals are subsidised
€300 academic & industry"]
+ footnote: >-
+ Silicon area and the demoboard are billed separately. Buying area gets
+ your design manufactured on the wafer — on its own it does not get you a
+ physical chip. To hold your chip in your hand, add the demoboard PCB. Confirm
+ current figures at
+ app.tinytapeout.com/calculator.
+
+faq:
+ heading: Frequently asked Questions
+ note: FULL FAQ AT TINYTAPEOUT.COM/FAQ
+ items:
+ - q: How long until I get my chip?
+ a: >-
+ Fabrication takes 6–9 months, then boards are assembled, tested and
+ shipped. Check tinytapeout.com/chips for the schedule..
+ - q: Do I need chip design experience?
+ a: >-
+ No. Getting started documentation on the website and help on the Discord community helps beginners get started.
+ Thousands of past projects are public to learn from.
+ - q: What do I actually receive?
+ a: >-
+ Area alone gets your design onto the wafer. Add the demoboard to receive a
+ packaged chip, an RP2350 demoboard and a breakout board. Bare chips are not available separately.
+ - q: Which processes can I use?
+ a: >-
+ SkyWater SKY130 (130 nm), IHP sg13g2 (130 nm BiCMOS) and GlobalFoundries
+ gf180mcu (180 nm), each on its own shuttle schedule.
+ - q: Is it only open to individuals?
+ a: >-
+ No. Universities, schools and companies run group submissions, and dozens
+ of institutions already teach with Tiny Tapeout.
+ - q: What are the licence terms?
+ a: >-
+ Every design is published publicly under Apache-2.0. The minimum
+ submission is GDS + LEF, produced with any toolchain you like.
+
+institutions:
+ label: Taught and used at
+ items:
+ - Carnegie Mellon University
+ - New York University
+ - UC Santa Cruz
+ - UC San Diego
+ - San Jose State University
+ - Oklahoma State University
+ - Technical University of Denmark
+ - Linköping University
+ - Graz University of Technology
+
+# --------------------------------------------------------------------------
+# PAGE 2
+# --------------------------------------------------------------------------
+
+process:
+ heading: Process & fabrication
+ note: TILE DIMENSIONS PER PDK
+ columns:
+ - {label: PDK, width: "19%", style: name}
+ - {label: Foundry, width: "21%"}
+ - {label: Node, width: "17%", style: num}
+ - {label: 1×1 tile area, width: "25%", style: mono}
+ - {label: Package}
+ rows:
+ - ["SKY130A", "SkyWater", "130 nm", "161.00 × 111.52 µm", "QFN-64"]
+ - ["ihp-sg13g2", "IHP", "130 nm BiCMOS", "202.08 × 154.98 µm", "QFN-64"]
+ - ["gf180mcuD", "GlobalFoundries", "180 nm", "346.64 × 160.72 µm", "QFN-64"]
+ footnote: >-
+ One tile holds approximately 1,000 standard cells. Larger designs are
+ built from multi-tile blocks from 1×2 up to 8×4; the available sizes differ
+ per PDK. Analog projects require a minimum height of 2 tiles.
+
+ratings:
+ heading: Absolute maximum ratings
+ note: DIGITAL I/O
+ columns:
+ - {label: Parameter, width: "40%", style: name}
+ - {label: Min, width: "13%", style: num}
+ - {label: Typ, width: "13%", style: num}
+ - {label: Max, width: "13%", style: num}
+ - {label: Unit}
+ rows:
+ - ["I/O supply voltage", "1.71", "3.30", "5.50", "V"]
+ - ["Input frequency", "—", "—", "66", "MHz"]
+ - ["Output toggle frequency", "—", "—", "33", "MHz"]
+ - ["Output drive strength, source/sink", "—", "4", "—", "mA"]
+ - ["Demoboard clock generator", "1", "—", "66.5 M", "Hz"]
+ - ["Pad-to-tile round-trip latency", "—", "—", "20", "ns"]
+ - ["Clock insertion delay, pad to logic", "—", "—", "10", "ns"]
+ - ["Pin-to-pin latency variance", "—", "—", "2", "ns"]
+ footnote: >-
+ Characterised on SKY130A using the sky130_ef_io_gpiov2_pad cell;
+ ratings differ per PDK. Inputs are not 5 V tolerant despite the supply
+ range. Full per-process figures at
+ tinytapeout.com/specs.
+
+gpio:
+ heading: GPIO pin map
+ columns:
+ - {label: Signal, width: "34%", style: mono}
+ - {label: Width, width: "14%", style: num center}
+ - {label: Direction, width: "22%"}
+ - {label: Function}
+ rows:
+ - ["clk", "1", "Input", "Clock"]
+ - ["rst_n", "1", "Input", "Reset, active low"]
+ - ["ui_in[7:0]", "8", "Input", "General purpose"]
+ - ["uo_out[7:0]", "8", "Output", "General purpose"]
+ - ["uio[7:0]", "8", "Bidirectional", "Per-pin direction control"]
+ linkline: >-
+ 26 I/O PINS TOTAL ·
+ TINYTAPEOUT.COM/SPECS/GPIO
+
+analog:
+ heading: Analog I/O
+ note: OPTIONAL
+ columns:
+ - {label: Parameter, style: name}
+ - {label: Value, width: "34%", style: mono}
+ rows:
+ - ["Analog pins, maximum", "6 · ua[0:5]"]
+ - ["Series resistance, pad to project", "< 500 Ω"]
+ - ["Parasitic capacitance", "< 5 pF"]
+ - ["Current per pin, maximum", "4 mA"]
+ - ["VDPWR digital supply", "1.8 V"]
+ - ["VAPWR analog supply", "3.3 V"]
+ linkline: >-
+ ALLOCATED IN ORDER ·
+ TINYTAPEOUT.COM/SPECS/ANALOG
+
+ordering:
+ heading: Ordering information
+ note: APP.TINYTAPEOUT.COM/CALCULATOR
+ headless: true # no header row on this table
+ columns:
+ - {width: "27%", style: name}
+ - {}
+ rows:
+ - ["Shuttle cadence",
+ "Several shuttles per year across the three processes. Check tinytapeout.com/chips for the schedule"]
+ - ["Lead time",
+ "6–9 months in fabrication, then assembly, test and fulfilment."]
+ - ["Deliverable",
+ "Silicon area only for remote or shared test, or area plus the demoboard kit: packaged chip, RP2350 demoboard and breakout board."]
+ - ["Design tools",
+ "Supplied open-source LibreLane flow running in GitHub Actions, or any toolchain of your own."]
+ - ["Minimum submission",
+ "GDS + LEF in a public repository, licensed Apache-2.0."]
+
+disclaimer:
+ label: Disclaimer
+ body: >-
+ Specifications are indicative and subject to change between shuttles.
+ Electrical characteristics are quoted for the SKY130A process unless stated
+ otherwise — consult tinytapeout.com/specs for the process you intend to use.
+ Pricing is indicative; confirm current figures with the calculator before
+ ordering. Tiny Tapeout devices are educational and prototyping parts, and are
+ not qualified for safety-critical, medical or automotive use.
diff --git a/docs/product/partials/footnote.mustache b/docs/product/partials/footnote.mustache
new file mode 100644
index 0000000..c89a67a
--- /dev/null
+++ b/docs/product/partials/footnote.mustache
@@ -0,0 +1 @@
+{{#has_footnote}}{{&footnote}}
{{/has_footnote}}
diff --git a/docs/product/partials/logo.mustache b/docs/product/partials/logo.mustache
new file mode 100644
index 0000000..ace4e6e
--- /dev/null
+++ b/docs/product/partials/logo.mustache
@@ -0,0 +1,5 @@
+
diff --git a/docs/product/partials/secthead.mustache b/docs/product/partials/secthead.mustache
new file mode 100644
index 0000000..721d9e1
--- /dev/null
+++ b/docs/product/partials/secthead.mustache
@@ -0,0 +1,4 @@
+
+
{{&heading}}
+ {{#has_note}}
{{¬e}}
{{/has_note}}
+
diff --git a/docs/product/partials/table.mustache b/docs/product/partials/table.mustache
new file mode 100644
index 0000000..acf4a3e
--- /dev/null
+++ b/docs/product/partials/table.mustache
@@ -0,0 +1,11 @@
+
+ {{#columns}}{{/columns}}
+ {{^headless}}
+ {{#columns}}| {{&label}} | {{/columns}}
+ {{/headless}}
+
+ {{#rows}}
+ {{#cells}}| {{&v}} | {{/cells}}
+ {{/rows}}
+
+