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}} + + + +
+ + +
+ +
+ {{> logo}} +
{{&doc.wordmark}}{{&doc.wordmark_sub}}
+
{{&doc.tag}}
+
{{&doc.ref}}
+
+ +
+ +
+
+
{{&hero.eyebrow}}
+

{{&hero.heading}}

+

{{&hero.body}}

+
+
+
+ {{hero.photo_alt}} +
{{&hero.photo_caption}}
+
+
+ +
+ {{#features}} +
+
{{&kicker}}
+

{{&title}}

+

{{&body}}

+
+ {{/features}} +
+ +
+ {{#pricing}}{{> secthead}}{{> table}}{{> footnote}}{{/pricing}} +
+ +
+ {{#faq}} + {{> secthead}} +
+ {{#items}} +
+

{{&q}}

+

{{&a}}

+
+ {{/items}} +
+ {{/faq}} +
+ +
+ +
+
+
{{&institutions.label}}
+
+ {{#institutions.items}}{{&.}} + {{/institutions.items}} +
+
+
PAGE01
+
+ +
+ + +
+ +
+ {{> logo}} +
{{&doc.wordmark}}{{&doc.ref}}
+
{{&doc.page2_title}}
+
+ +
+ +
+ {{#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}}{{/columns}} + {{/headless}} + + {{#rows}} + {{#cells}}{{/cells}} + {{/rows}} + +
{{&label}}
{{&v}}