// SPDX-License-Identifier: Apache-2.0
; specs/widgets/golden-gf24.t27 -- the infographic of lesson 15 of the GoldenFloat course (specs/course/goldenfloat.t27)
; Source of truth for public/widgets/golden-gf24/ (gHashTag/trinity): scripts/widget-pages-from-spec.mjs compiles
; this file, checks its constants, evaluates the tests below and writes the page. tool.js is one import of
; ../infographic.js, which draws SAY_TABLE_* as a real <table> and SAY_FLOW_* as an SVG diagram with a
; <title>, black and white, and holds no words of its own. ASCII only (L3), English only (LANG-EN).
; The lesson spec it illustrates: public/t27/files/specs/numeric/gf24.t27.
; phi^2 + 1/phi^2 = 3 | TRINITY

module widget_golden_gf24;

pub const KIND : str = "widget-tool";
pub const ID : str = "golden-gf24";
pub const TITLE : str = "GoldenFloat 15: GF20 and GF24";
pub const DESCRIPTION : str = "GF24: 24 bits as the spec lays them out, beside GF20, read from gf24.t27. Lesson 15 of the GoldenFloat course.";
pub const IMAGE_ALT : str = "A black and white table, GF24: 24 bits as the spec lays them out: Sign, 1 bit, SIGN_BITS; Exponent, 9 bits, EXP_BITS; Mantissa, 14 bits, MANT_BITS; Bias, 255, EXP_BIAS = 2^(E-1) - 1; Distance from 1 / phi, 0.0248, PHI_DISTANCE.";
pub const HOOK : str = "Twenty-four bits split by phi: 1 sign, 9 exponent, 14 mantissa, bias 255.";
pub const CATEGORY : str = "compiler";
pub const DATA_SOURCES : [2]str = ["The lesson spec public/t27/files/specs/numeric/gf24.t27, read when the course was authored; every number in the table is a constant, a test value or arithmetic of that file", "Nothing on this page was measured on hardware or timed; a value written into a test is said to be written in, not computed"];
pub const READS_LOCAL_FILES : bool = false;
pub const SENDS_NOTHING : bool = true;

; --- The table -----------------------------------------------------------------------------
pub const SAY_TABLE_CAPTION : str = "GF24: 24 bits as the spec lays them out";
pub const SAY_TABLE_HEAD : [3]str = ["Field", "Value", "Spec constant"];
pub const SAY_TABLE_CELLS : [15]str = ["Sign", "1 bit", "SIGN_BITS", "Exponent", "9 bits", "EXP_BITS", "Mantissa", "14 bits", "MANT_BITS", "Bias", "255", "EXP_BIAS = 2^(E-1) - 1", "Distance from 1 / phi", "0.0248", "PHI_DISTANCE"];
pub const K_TABLE_COLS : u8 = 3;
pub const K_TABLE_ROWS : u8 = 5;
pub const K_TABLE_CELLS : u16 = 15;

; --- The diagram and the note ----------------------------------------------------------------
pub const SAY_FLOW_TITLE : str = "How GF24 gets its split";
pub const SAY_FLOW_STEPS : [3]str = ["N = 24 bits", "E = round((24 - 1) / phi^2) = 9", "M = 24 - 1 - 9 = 14"];
pub const K_FLOW_STEPS : u8 = 3;
pub const SAY_NOTE : str = "gf20.t27 splits 20 bits into 1 + 7 + 12 with bias 63; its tests allow a distance under 0.04.";

test the_cells_fill_whole_rows {
    assert K_TABLE_ROWS * K_TABLE_COLS == K_TABLE_CELLS;
}

test the_table_has_a_body {
    assert K_TABLE_ROWS > 0;
    assert K_TABLE_COLS > 0;
}

test the_diagram_has_every_step {
    assert K_FLOW_STEPS == 3;
    assert K_FLOW_STEPS > 1;
}
