mirror of
https://github.com/TinyTapeout/tt-support-tools.git
synced 2026-11-03 04:36:09 +01:00
continue tweaking
This commit is contained in:
@@ -1,13 +1,19 @@
|
||||
# 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
|
||||
Files here are embedded as data URIs by `build.py`, so the generated HTML is
|
||||
self-contained. Swap any of them 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 |
|
||||
| `supporters/*` | Logos from [tinytapeout.com/credits](https://tinytapeout.com/credits/) | Trademarks of their respective owners |
|
||||
|
||||
The demoboard photo is credited in the datasheet caption. Confirm redistribution
|
||||
is agreed with the copyright holder before publishing the datasheet externally.
|
||||
The demoboard photo carries an embedded copyright of © 2024 Pat Deegan. **Matt
|
||||
has permission from Pat to use it**, so it needs no on-sheet credit — the
|
||||
datasheet caption that previously carried one has been removed. It remains
|
||||
outside this repo's Apache-2.0 licence: don't reuse it elsewhere without asking.
|
||||
|
||||
The supporter logos are only rendered when the `supporters:` block in
|
||||
`datasheet.yaml` is uncommented, which it currently is not.
|
||||
|
||||
+30
-2
@@ -164,12 +164,30 @@ def validate_markup(content: dict) -> None:
|
||||
raise SystemExit("\n".join(f"{p}" for p in problems))
|
||||
|
||||
|
||||
MIME_TYPES = {".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg"}
|
||||
|
||||
|
||||
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 prepare_supporters(supporters: dict, assets: Path) -> None:
|
||||
"""Inline each supporter logo and work out its per-item sizing."""
|
||||
height = supporters.get("logo_height", "8.5mm")
|
||||
for item in supporters.get("items") or []:
|
||||
path = assets / "supporters" / item["file"]
|
||||
suffix = path.suffix.lower()
|
||||
if suffix not in MIME_TYPES:
|
||||
raise SystemExit(f"{path}: expected one of {', '.join(MIME_TYPES)}")
|
||||
item["data_uri"] = (
|
||||
f"data:{MIME_TYPES[suffix]};base64,{as_data_uri_payload(path)}"
|
||||
)
|
||||
scale = item.get("scale", 1)
|
||||
item["style"] = f"height: calc({height} * {scale})"
|
||||
|
||||
|
||||
def find_chrome() -> str:
|
||||
for candidate in CHROME_CANDIDATES:
|
||||
if candidate and (Path(candidate).is_file() or shutil.which(candidate)):
|
||||
@@ -195,6 +213,8 @@ window.addEventListener("load", () => setTimeout(() => {
|
||||
|
||||
|
||||
def run_chrome(*flags: str, page: Path) -> bytes:
|
||||
# Deliberately no --user-data-dir: combined with --print-to-pdf, Chrome
|
||||
# writes the PDF correctly and then never exits.
|
||||
result = subprocess.run(
|
||||
[
|
||||
find_chrome(),
|
||||
@@ -206,6 +226,7 @@ def run_chrome(*flags: str, page: Path) -> bytes:
|
||||
],
|
||||
check=True,
|
||||
capture_output=True,
|
||||
timeout=120,
|
||||
)
|
||||
return result.stdout
|
||||
|
||||
@@ -234,8 +255,13 @@ def check_fit(html_path: Path) -> bool:
|
||||
|
||||
found = re.search(rb'<div id="fit-report">([^<]*)</div>', dom)
|
||||
if not found or found.group(1) == b"pending":
|
||||
logging.warning("could not measure sheet fit — skipping check")
|
||||
return True
|
||||
# Fail closed: reporting success without having measured anything is how
|
||||
# clipped content ships unnoticed.
|
||||
logging.error(
|
||||
"could not measure sheet fit — Chrome returned no report. "
|
||||
"Re-run, or pass --no-check to build without verifying the fit"
|
||||
)
|
||||
return False
|
||||
|
||||
overflowed = False
|
||||
for entry in found.group(1).decode().split(","):
|
||||
@@ -297,6 +323,8 @@ def main() -> None:
|
||||
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"])
|
||||
if "supporters" in content:
|
||||
prepare_supporters(content["supporters"], assets)
|
||||
|
||||
with open(HERE / "datasheet.html.mustache", encoding="utf-8") as fh:
|
||||
rendered = chevron.render(
|
||||
|
||||
@@ -265,6 +265,10 @@ tbody tr:last-child td { border-bottom: 0; }
|
||||
|
||||
.faq > div { border-top: 1px solid var(--rule); padding-top: 1.8mm; }
|
||||
|
||||
/* The first row sits just under the heading's own 2px rule; a second hairline
|
||||
that close reads as a printing error. Keep the padding so rows stay aligned. */
|
||||
.faq > div:nth-child(-n + 2) { border-top: 0; }
|
||||
|
||||
.faq h3 {
|
||||
margin: 0 0 1.2mm;
|
||||
font-size: var(--t-body);
|
||||
@@ -292,6 +296,18 @@ tbody tr:last-child td { border-bottom: 0; }
|
||||
|
||||
.linkline b { color: var(--red); font-weight: 700; }
|
||||
|
||||
/* ---------- supporter logos ---------- */
|
||||
|
||||
.supporters {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 5mm;
|
||||
padding-top: 0.4mm;
|
||||
}
|
||||
|
||||
.supporters img { width: auto; max-width: 32mm; object-fit: contain; display: block; }
|
||||
|
||||
a { color: inherit; text-decoration: none; }
|
||||
a:focus-visible { outline: 2px solid var(--red); outline-offset: 2px; }
|
||||
@media screen { .tnote a, .note a { text-decoration: underline; text-underline-offset: 1.5px; } }
|
||||
@@ -365,7 +381,7 @@ a:focus-visible { outline: 2px solid var(--red); outline-offset: 2px; }
|
||||
{{> logo}}
|
||||
<div class="bar__word">{{&doc.wordmark}}{{#doc.wordmark_sub}}<span>{{&doc.wordmark_sub}}</span>{{/doc.wordmark_sub}}</div>
|
||||
<div class="bar__tag">{{&doc.tag}}</div>
|
||||
<div class="bar__ref">{{&doc.ref}}</div>
|
||||
{{#doc.ref}}<div class="bar__ref">{{&doc.ref}}</div>{{/doc.ref}}
|
||||
</header>
|
||||
|
||||
<div class="body">
|
||||
@@ -378,7 +394,7 @@ a:focus-visible { outline: 2px solid var(--red); outline-offset: 2px; }
|
||||
</div>
|
||||
<figure>
|
||||
<img src="data:image/jpeg;base64,{{&photo_b64}}" alt="{{hero.photo_alt}}">
|
||||
<figcaption>{{&hero.photo_caption}}</figcaption>
|
||||
{{#hero.photo_caption}}<figcaption>{{&hero.photo_caption}}</figcaption>{{/hero.photo_caption}}
|
||||
</figure>
|
||||
</div>
|
||||
|
||||
@@ -430,7 +446,7 @@ a:focus-visible { outline: 2px solid var(--red); outline-offset: 2px; }
|
||||
|
||||
<header class="bar bar--p2">
|
||||
{{> logo}}
|
||||
<div class="bar__word">{{&doc.wordmark}}<span>{{&doc.ref}}</span></div>
|
||||
<div class="bar__word">{{&doc.wordmark}}{{#doc.ref}}<span>{{&doc.ref}}</span>{{/doc.ref}}</div>
|
||||
<div class="bar__title">{{&doc.page2_title}}</div>
|
||||
</header>
|
||||
|
||||
@@ -467,6 +483,17 @@ a:focus-visible { outline: 2px solid var(--red); outline-offset: 2px; }
|
||||
{{#ordering}}{{> secthead}}{{> table}}{{> footnote}}{{/ordering}}
|
||||
</div>
|
||||
|
||||
{{#supporters}}
|
||||
<div class="block">
|
||||
{{> secthead}}
|
||||
<div class="supporters">
|
||||
{{#items}}
|
||||
<img src="{{&data_uri}}" alt="{{name}}" style="{{&style}}">
|
||||
{{/items}}
|
||||
</div>
|
||||
</div>
|
||||
{{/supporters}}
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="foot">
|
||||
|
||||
+51
-31
@@ -26,8 +26,8 @@ doc:
|
||||
wordmark: Tiny Tapeout
|
||||
wordmark_sub: "" # strapline under the wordmark on page 1; blank to hide
|
||||
tag: PRODUCT DATASHEET
|
||||
ref: DOC TT-DS-2026 · REV A
|
||||
page2_title: Electrical & Mechanical Specifications
|
||||
ref: "" # document reference code; blank to hide on both pages
|
||||
page2_title: Electrical Specifications
|
||||
|
||||
# Colours and the two page-level type sizes. Everything else scales from these.
|
||||
theme:
|
||||
@@ -52,19 +52,33 @@ assets:
|
||||
photo: demoboard.jpg
|
||||
font: archivo.woff2
|
||||
|
||||
# Supporter logo strip at the foot of page 2. Currently off — uncomment to
|
||||
# restore it; the logos are still in assets/supporters/. Note it needs about
|
||||
# 16mm, so page 2 will have to give up spacing elsewhere to fit.
|
||||
# supporters:
|
||||
# heading: Supported by
|
||||
# logo_height: 7.5mm
|
||||
# items:
|
||||
# - {name: ChipFoundry, file: chipfoundry.png}
|
||||
# - {name: wafer.space, file: waferspace.png}
|
||||
# - {name: Tillitis, file: tillitis.png}
|
||||
# - {name: WIT, file: WIT.png, scale: 0.82}
|
||||
# - {name: SwissChips, file: swisschips.png, scale: 0.88}
|
||||
# - {name: Texplained, file: texplained.jpg}
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# PAGE 1
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
hero:
|
||||
eyebrow: Shared multi project chip · SKY130 / IHP SG13G2 / GF180MCU
|
||||
heading: From idea to chip design in minutes
|
||||
eyebrow: Multi project chip · SKY130 / IHP SG13G2 / GF180MCU
|
||||
heading: Custom chips from €385
|
||||
body: >-
|
||||
Tiny Tapeout makes it more accessible than ever to get designs manufactured on a real chip.
|
||||
Submit from a
|
||||
GitHub repository and we handle integration, tapeout, packaging and delivery.
|
||||
GitHub repository and we handle tapeout, packaging, development board 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.
|
||||
photo_caption: "" # caption under the hero photo, with a rule above it; blank to hide both
|
||||
|
||||
features:
|
||||
- kicker: 01 · Toolchain
|
||||
@@ -75,8 +89,8 @@ features:
|
||||
- kicker: 02 · Languages
|
||||
title: HDL agnostic
|
||||
body: >-
|
||||
Any language that can produce Verilog. Project templates and CI are
|
||||
supplied for Verilog, with community provided VHDL and Chisel.
|
||||
Any language that can produce Verilog. Official support for Verilog,
|
||||
community provided templates for VHDL and Chisel.
|
||||
- kicker: 03 · I/O
|
||||
title: 26 pins, plus analog
|
||||
body: >-
|
||||
@@ -100,7 +114,7 @@ features:
|
||||
|
||||
pricing:
|
||||
heading: Pricing
|
||||
note: INDICATIVE FROM-PRICES · EUR
|
||||
note: "" # small grey text right of the heading; blank to hide
|
||||
columns:
|
||||
- {label: Item, width: "27%", style: name}
|
||||
- {label: What it buys you}
|
||||
@@ -111,15 +125,19 @@ pricing:
|
||||
"€70"]
|
||||
- ["Analog pin",
|
||||
"Multiplexed analog pad access for mixed signal designs. Minimum project size of 2 tiles applies.",
|
||||
"€100 <span class=\"t-sub\">/ pin</span>"]
|
||||
"€100 <span class=\"t-sub\">/ pin, up to a maximum of 6</span>"]
|
||||
- ["Demoboard PCB",
|
||||
"Optional add-on: packaged chip on an RP2350 powered demoboard.",
|
||||
"€100 <span class=\"t-sub\">first 80 boards for individuals are subsidised</span><br>€300 <span class=\"t-sub\">academic & industry</span>"]
|
||||
"€300"]
|
||||
- ["Postage & packing",
|
||||
"Flat rate worldwide, charged once per order.",
|
||||
"€15"]
|
||||
footnote: >-
|
||||
<b>Silicon area and the demoboard are billed separately.</b> Buying area gets
|
||||
your design manufactured on the chip — on its own it does not get you a
|
||||
physical chip. To receive a physical chip, add the demoboard PCB. Confirm
|
||||
current figures at
|
||||
<b>The €385 headline is one tile (€70) plus a demoboard (€300) plus postage
|
||||
(€15)</b> — the smallest order that puts a physical chip in your hand.
|
||||
Silicon area and the demoboard are billed separately, so buying area alone
|
||||
gets your design manufactured but does not get you a chip. Confirm current
|
||||
figures at
|
||||
<b><a href="https://app.tinytapeout.com/calculator">app.tinytapeout.com/calculator</a></b>.
|
||||
|
||||
faq:
|
||||
@@ -140,15 +158,13 @@ faq:
|
||||
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?
|
||||
SkyWater SKY130, IHP sg13g2 and GlobalFoundries gf180mcu, each on its own shuttle schedule.
|
||||
- q: Why would I only order area?
|
||||
a: >-
|
||||
No. Universities, schools and companies run group submissions, and dozens
|
||||
of institutions already teach with Tiny Tapeout.
|
||||
Share the cost of 1 board between a group submitting multiple projects. Save costs by asking us to remotely test your design.
|
||||
- q: What are the licence terms?
|
||||
a: >-
|
||||
Every design is published publicly under Apache-2.0. The minimum
|
||||
Every design must be published publicly under Apache-2.0. The minimum
|
||||
submission is GDS + LEF, produced with any toolchain you like. For full terms see <a href="https://tinytapeout.com/terms">tinytapeout.com/terms</a>.
|
||||
|
||||
institutions:
|
||||
@@ -163,6 +179,9 @@ institutions:
|
||||
- Technical University of Denmark
|
||||
- Linköping University
|
||||
- Graz University of Technology
|
||||
- IEEE
|
||||
- SwissChips
|
||||
- UK Semiconductor Centre
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# PAGE 2
|
||||
@@ -172,18 +191,20 @@ process:
|
||||
heading: Process & fabrication
|
||||
note: TILE DIMENSIONS PER PDK
|
||||
columns:
|
||||
- {label: PDK, width: "22%", style: name}
|
||||
- {label: Foundry, width: "26%"}
|
||||
- {label: Node, width: "22%", style: num}
|
||||
- {label: 1×1 tile area, style: mono}
|
||||
- {label: PDK, width: "19%", style: name}
|
||||
- {label: Foundry, width: "21%"}
|
||||
- {label: Node, width: "20%", style: num}
|
||||
- {label: 1×1 tile area, width: "24%", style: mono}
|
||||
- {label: Analog support}
|
||||
rows:
|
||||
- ["SKY130A", "SkyWater", "130 nm", "161.00 × 111.52 µm"]
|
||||
- ["ihp-sg13g2", "IHP", "130 nm BiCMOS", "202.08 × 154.98 µm"]
|
||||
- ["gf180mcuD", "GlobalFoundries", "180 nm", "346.64 × 160.72 µm"]
|
||||
- ["SKY130A", "SkyWater", "130 nm", "161.00 × 111.52 µm", "Full"]
|
||||
- ["ihp-sg13g2", "IHP", "130 nm BiCMOS", "202.08 × 154.98 µm", "Partial"]
|
||||
- ["gf180mcuD", "GlobalFoundries", "180 nm", "346.64 × 160.72 µm", "Partial"]
|
||||
footnote: >-
|
||||
One tile holds approximately <b>1,000 standard cells</b>. 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.
|
||||
built from multi-tile blocks, up to <b>8×4</b> on SKY130A and ihp-sg13g2 and
|
||||
up to <b>4×4</b> on gf180mcuD; the sizes available in between differ per PDK.
|
||||
Analog projects require a minimum height of 2 tiles.
|
||||
|
||||
ratings:
|
||||
heading: Absolute maximum ratings
|
||||
@@ -240,7 +261,6 @@ analog:
|
||||
- ["VDPWR digital supply", "1.8 V"]
|
||||
- ["VAPWR analog supply", "3.3 V"]
|
||||
linkline: >-
|
||||
ALLOCATED IN ORDER ·
|
||||
<b><a href="https://tinytapeout.com/specs/analog/">TINYTAPEOUT.COM/SPECS/ANALOG</a></b>
|
||||
|
||||
ordering:
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
<svg class="bar__logo" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Tiny Tapeout logo">
|
||||
<!-- The glyph's bounding box is exactly 0..200 on both axes, so it sits tangent
|
||||
to the viewBox and the curves get shaved at small sizes. The source logo
|
||||
had a black square behind it where that bleed was intentional; on the bar
|
||||
it needs margin instead. -->
|
||||
<svg class="bar__logo" viewBox="-9 -9 218 218" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Tiny Tapeout logo">
|
||||
<g transform="matrix(0.75075075,0,0,0.7513148,-156.00601,-72.426747)" fill="#ffffff">
|
||||
<path d="m 341,96.4 c -44.5,0 -83.9,21.9 -108.1,55.5 -7.9,11 -14.2,23.2 -18.5,36.4 h 21.6 52.1 v 90.1 h 39.3 v -24.3 h 22.7 v 87.8 c -3,0.3 -6.1,0.4 -9.2,0.4 -62.2,0 -112.8,-50.6 -112.8,-112.8 0,-10.3 1.4,-20.2 4,-29.6 h -21 c -2.2,9.5 -3.3,19.4 -3.3,29.6 0,73.4 59.7,133.1 133.1,133.1 3.1,0 6.1,-0.1 9.2,-0.3 1.7,-0.1 3.4,-0.3 5.1,-0.5 0.1,0 0.3,0 0.4,0 11.8,-1.3 23.1,-4.1 33.8,-8.3 v 0 c 0,0 0,0 0,0 V 254.1 H 428 V 217.7 H 327.5 V 188.2 H 366 V 151.8 H 259.3 c 20.5,-21.6 49.6,-35.1 81.7,-35.1 62.2,0 112.8,50.6 112.8,112.8 0,40.1 -21,75.4 -52.6,95.4 v 23.4 c 43.3,-22 73,-67 73,-118.8 C 474.1,156.1 414.4,96.4 341,96.4 Z" />
|
||||
</g>
|
||||
|
||||
|
Before Width: | Height: | Size: 859 B After Width: | Height: | Size: 1.1 KiB |
Reference in New Issue
Block a user