Files
LithosAnanake/v4/tools/mkmap.c
T
rajamesandClaude Opus 5.5 a73580e949 feat(v4): the machine boots from its ROM; the prebuilt nucleus is gone
The host node starts in its ROM (entry 12), and the boot feeds it the
system's source through the console: capsules/v4/sys/map-64.f18, the
fourteen .f18 blobs and end.f18, each found, hash-checked and
signature-checked as any capsule, then EOT.  The ROM assembles the system
and starts it at (IDLE); the host reads the image record
(v4_image_from_node) for what only the assembled system knows.  A ROM
error is reported with its blob, line and meaning, then PARITY:FAIL.

Deleted: v4/tools/mkimage.c, capsules/v4/nucleus-64.f18, v4/capsule/*.v4,
v4/tools/v4tof18.py.  The .f18 files are the source now.

- text.c speaks the rest of the ROM's language (set, here, store, start;
  v4_text_value, v4_text_start), so the oracle reads the same source:
  test_host_rom_nucleus compares the ROM against text.c on the .f18 files,
  word for word, image record included.  Host tests load the .f18 files.
- mkmap image writes v4_map_image (the map's description of the system);
  hosted and the kernel link the ROM and the map instead of v4_image_64.c.
- Hera (Captain Bob's ruling, option 1): births stream the system the ROM
  assembled, as assembled code; hera.4th is unchanged.
  test_host_unit's host builds the system with the ROM.
- New parity lines: PARITY:V4_F18 per blob, PARITY:V4_ROM words=2049
  rom_hash=0xa6c792b5821010b7 instructions=60725216.

Acceptance: amd64, aarch64, riscv64 boot to ok> with PARITY:V4_POST
tests=538 pass=538 fail=0, POST: PASSED, and PARITY:V4_SYSTEM
word_count=317 dict_hash=0xe5a57f3eb72ff94a on all three -- the same hash
as the prebuilt nucleus gave.  make -C v4 test test-32 hosted-check: all
pass.  Logs: logs/20261015-141648, -141938, -142350.

Startup cost under QEMU TCG, the ROM's assembly (last V4_F18 line to
V4_ROM): amd64 26.7 s of 132 s to ok>; aarch64 41.0 s of 195 s; riscv64
20.5 s of 101 s.  Hosted native: +0.85 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:26:02 -04:00

161 lines
7.2 KiB
C

/* mkmap.c -- the memory map, as constants the ROM is assembled with.
*
* mkmap > rom-map-<width>.f18
* mkmap sys > capsules/v4/sys/map-<width>.f18
* mkmap image > v4_map_<width>.c
*
* Runs on the build machine, built for the host node (HOST_WORDS and the
* host stack sizes) at one cell width. It writes, as `constant` lines in
* the text assembler's notation, the addresses and codes of
* v4/tests/host_map.h that the ROM's source (capsules/v4/rom) uses: the
* console's receive registers and the ROM's state area (MACHINE.md 2.1).
* The map has one source, host_map.h; this is how the ROM reads it.
*/
#include "../tests/host_map.h"
#include <stdio.h>
static void constant(const char *name, long value)
{
printf("constant %s %ld\n", name, value);
}
/* `mkmap sys`: the system's map, the blob the ROM reads before the system's
* source (capsules/v4/sys/map-<width>.f18): every constant host_load gives
* the nucleus, and the two its end (capsules/v4/sys/end.f18) needs besides. */
static int system_map(void)
{
printf("\\ map-%d.f18 -- the memory map the system's source is assembled with, %d-bit cells.\n", V4_CELL_BITS, V4_CELL_BITS);
printf("\\ Generated by v4/tools/mkmap.c (mkmap sys) from v4/tests/host_map.h -- do not edit.\n");
#define SYS_CONSTANT(name, value) constant(name, (long)(v4_cell)(value));
HOST_CONSTANTS(SYS_CONSTANT)
#undef SYS_CONSTANT
constant("DICT-W", (long)DICT_W);
constant("(IMG)", (long)ROM_IMG);
return 0;
}
/* `mkmap image`: the system as its host knows it before it is built
* (include/v4/image.h, v4_map_image): what the build was for, the map's
* addresses, and where the image record and the ROM's error are. What only
* the assembled system knows -- where it waits, its fault table, KEY -- is
* -1 here; v4_image_from_node reads it from the image record. */
static int image_description(void)
{
printf("/* Generated by v4/tools/mkmap.c (mkmap image) from v4/tests/host_map.h -- do not edit. */\n");
printf("#include \"v4/image.h\"\n\nconst v4_image v4_map_image = {\n");
printf(" %uu, %uu, %uu, %uu,\n", (unsigned)V4_CELL_BITS, (unsigned)V4_NODE_WORDS, (unsigned)V4_DATA_RING, (unsigned)V4_RET_RING);
printf(" -1,\n -1, %ld,\n -1, -1,\n", (long)PORT);
printf(" %ld, %ld, %ld,\n %ld, %ld,\n %ld,\n %ld, %ld,\n %ld, %ld,\n %ld,\n",
(long)CONSOLE_TX, (long)CONSOLE_RX, (long)CONSOLE_ST, (long)DSTACK_REG, (long)RSTACK_REG,
(long)NODE_ERROR, (long)DP, (long)LATEST, (long)BOOT_CELLS, (long)FENCE, (long)BUF0_W);
printf(" %ld, %ld, %ld\n};\n", (long)ROM_IMG, (long)ROM_FAILED, (long)ROM_ERRLINE);
return 0;
}
int main(int argc, char **argv)
{
(void)host_load; /* host_map.h's loader is not this tool's */
(void)host_branch_slots;
if (argc == 2 && argv[1][0] == 's') return system_map();
if (argc == 2 && argv[1][0] == 'i') return image_description();
printf("\\ Generated by v4/tools/mkmap.c from v4/tests/host_map.h -- do not edit.\n");
constant("CONSOLE-RX", (long)CONSOLE_RX);
constant("CONSOLE-STATUS", (long)CONSOLE_ST);
constant("(TOK)", (long)ROM_TOK);
constant("(TOKN)", (long)ROM_TOKN);
constant("(PEEK)", (long)ROM_PEEK);
constant("(LINE)", (long)ROM_LINE);
constant("(EOF)", (long)ROM_EOF);
constant("(FAILED)", (long)ROM_FAILED);
constant("(ERRLINE)", (long)ROM_ERRLINE);
constant("(NBASE)", (long)ROM_NBASE);
constant("(NNEG)", (long)ROM_NNEG);
constant("(NI)", (long)ROM_NI);
constant("(NU)", (long)ROM_NU);
constant("(NBIG)", (long)ROM_NBIG);
constant("(RECN)", (long)ROM_RECN);
constant("(POOLN)", (long)ROM_POOLN);
constant("(REC)", (long)ROM_REC);
constant("(CNT)", (long)ROM_CNT);
constant("(PTR)", (long)ROM_PTR);
constant("(I)", (long)ROM_I);
constant("(WI)", (long)ROM_WI);
constant("(SYMH)", (long)ROM_SYMH);
constant("SYMREC", (long)ROM_SYMREC);
constant("POOLTOP", (long)ROM_POOLTOP);
constant("ERR-BAD-NAME", (long)ROM_ERR_BAD_NAME);
constant("ERR-DEFINED", (long)ROM_ERR_DEFINED);
constant("ERR-NAMES", (long)ROM_ERR_NAMES);
constant("(HERE)", (long)ROM_HERE);
constant("(CUR)", (long)ROM_CUR);
constant("(SLOT)", (long)ROM_SLOT);
constant("(NLIT)", (long)ROM_NLIT);
constant("(LITS)", (long)ROM_LITS);
constant("(PI)", (long)ROM_PI);
constant("(RS)", (long)ROM_RS);
constant("(RN)", (long)ROM_RN);
constant("RAM-WORDS", (long)V4_NODE_WORDS);
constant("ADDR-TOP", (long)ROM_ADDR_TOP);
constant("ERR-FIT", (long)ROM_ERR_FIT);
constant("ERR-OPCODE", (long)ROM_ERR_OPCODE);
constant("(NREF)", (long)ROM_NREF);
constant("(NLAB)", (long)ROM_NLAB);
constant("(WNP)", (long)ROM_WNP);
constant("(NFOR)", (long)ROM_NFOR);
constant("(FORS)", (long)ROM_FORS);
constant("(RDEPTH)", (long)ROM_RDEPTH);
constant("(RPTRS)", (long)ROM_RPTRS);
constant("(T1)", (long)ROM_T1);
constant("(T2)", (long)ROM_T2);
constant("(T3)", (long)ROM_T3);
constant("(T4)", (long)ROM_T4);
constant("(CFROM)", (long)ROM_CFROM);
constant("(CTO)", (long)ROM_CTO);
constant("(CN)", (long)ROM_CN);
constant("(RAW)", (long)ROM_RAW);
constant("(T5)", (long)ROM_T5);
constant("(T6)", (long)ROM_T6);
constant("(MLEN)", (long)ROM_MLEN);
constant("(REFS)", (long)ROM_REFS);
constant("(LABELS)", (long)ROM_LABELS);
constant("(WNAMES)", (long)ROM_WNAMES);
constant("(TSAVE)", (long)ROM_TSAVE);
constant("(MTEMP)", (long)ROM_MTEMP);
constant("(MBODY)", (long)ROM_MBODY);
constant("ORIGIN", (long)ROM_ORIGIN);
constant("REFS-MAX", (long)ROM_REFS_MAX);
constant("WN-SIZE", (long)ROM_WN_SIZE);
constant("MBODY-SIZE", (long)ROM_MBODY_SIZE);
constant("DICT-W", (long)DICT_W);
constant("DICT-END", (long)DICT_END_W);
constant("BUF0", (long)BUF0_W);
constant("TIB-W", (long)TIB_W);
constant("ERR-IN-MACRO", (long)ROM_ERR_IN_MACRO);
constant("ERR-MACRO", (long)ROM_ERR_MACRO);
constant("ERR-LABEL-DUP", (long)ROM_ERR_LABEL_DUP);
constant("ERR-LABELS", (long)ROM_ERR_LABELS);
constant("ERR-FOR", (long)ROM_ERR_FOR);
constant("ERR-UNEXT", (long)ROM_ERR_UNEXT);
constant("ERR-TARGET", (long)ROM_ERR_TARGET);
constant("ERR-UNDEFINED", (long)ROM_ERR_UNDEFINED);
constant("ERR-BIG", (long)ROM_ERR_BIG);
constant("ERR-AMP", (long)ROM_ERR_AMP);
constant("ERR-FETCH-P", (long)ROM_ERR_FETCH_P);
constant("ERR-MISSING", (long)ROM_ERR_MISSING);
constant("ERR-DEEP", (long)ROM_ERR_DEEP);
constant("ERR-REFS", (long)ROM_ERR_REFS);
constant("ERR-VALUE", (long)ROM_ERR_VALUE);
constant("ERR-NO-START", (long)ROM_ERR_NO_START);
constant("ERR-START", (long)ROM_ERR_START);
constant("DSTACK-REG", (long)DSTACK_REG);
constant("RSTACK-REG", (long)RSTACK_REG);
/* the cell width's constants (NUMBER) needs, written as signed cells */
constant("MSB", (long)(v4_cell)V4_MSB);
constant("DEC-LIMIT", (long)(v4_cell)(~(v4_ucell)0 / 10u));
constant("DEC-NLAST", -(long)(~(v4_ucell)0 % 10u) - 1);
constant("HEX-HIGH", (long)(v4_cell)~(~(v4_ucell)0 >> 4));
constant("ERR-TOO-LONG", (long)ROM_ERR_TOO_LONG);
constant("ERR-COMMENT", (long)ROM_ERR_COMMENT);
return 0;
}