From ee5e19de183348fee0713054d97544104bf36b2a Mon Sep 17 00:00:00 2001 From: "M. Edward (Ed) Borasky" Date: Fri, 15 Dec 2023 16:03:37 -0800 Subject: [PATCH] doc tweaks --- The-Book-of-CLAMS/CLAMS-Forth-Overview.qmd | 19 +++++++++++-------- docs/CLAMS-Forth-Overview.html | 4 ++-- docs/The-Book-of-CLAMS.pdf | Bin 62090 -> 62192 bytes 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/The-Book-of-CLAMS/CLAMS-Forth-Overview.qmd b/The-Book-of-CLAMS/CLAMS-Forth-Overview.qmd index ab3ff3a..d817885 100644 --- a/The-Book-of-CLAMS/CLAMS-Forth-Overview.qmd +++ b/The-Book-of-CLAMS/CLAMS-Forth-Overview.qmd @@ -80,23 +80,26 @@ the function call (`BL`) instruction has an available range of plus or minus away in the 2 megabytes of flash, the better. 2. Even with a dictionary entirely in SRAM at run time, constructing a `BL` -function call instruction while compiling a user "colon" definition is a tricky process, difficult to document, -understand and maintain. If you're interested in the details, see -[@pintaske2019irreducible, section 3.5.5 ]. I decided to switch to direct -threading, rather than spend an extra week coding both a flash-to-SRAM -relocation and an algorithm to compute a relative branch address that is then -split into four separate bit fields of two 16-bit `thumb` instructions. +function call instruction while compiling a user "colon" definition is a tricky +process, difficult to document, understand and maintain. If you're interested +in the details, see [@pintaske2019irreducible, section 3.5.5 ]. I decided to +switch to direct threading, rather than spend an extra week coding both a +flash-to-SRAM relocation and an algorithm to compute a relative branch address +that is then split into four separate bit fields of two 16-bit `thumb` +instructions. ## Status / roadmap 1. There is a partial implementation of a subroutine-threaded version with inlining. I am leaving that in the repository in a development branch but won't be working on it unless I find that the direct-threaded version cannot meet -speed requirements. The subroutine-threaded version is in branch `forth-stc`. +speed requirements. The subroutine-threaded version is in branch +[`forth-stc`](https://github.com/AlgoCompSynth/CLAMS/tree/forth-stc). 2. The direct-threaded version is nearing a release. I expect to have the system dictionary, text interpreter and compiler done by January 1, 2024. It is -in the branch `forth-dtc`. +in the branch +[`forth-dtc`](https://github.com/AlgoCompSynth/CLAMS/tree/forth-stc). 3. The next step is to implement synthesis algorithms. The general process will be to prototype them in Forth, converting to assembler when needed. That will diff --git a/docs/CLAMS-Forth-Overview.html b/docs/CLAMS-Forth-Overview.html index 14a569b..4e57a0e 100644 --- a/docs/CLAMS-Forth-Overview.html +++ b/docs/CLAMS-Forth-Overview.html @@ -215,8 +215,8 @@

2.4 Status / roadmap

    -
  1. There is a partial implementation of a subroutine-threaded version with inlining. I am leaving that in the repository in a development branch but won’t be working on it unless I find that the direct-threaded version cannot meet speed requirements. The subroutine-threaded version is in branch forth-stc.

  2. -
  3. The direct-threaded version is nearing a release. I expect to have the system dictionary, text interpreter and compiler done by January 1, 2024. It is in the branch forth-dtc.

  4. +
  5. There is a partial implementation of a subroutine-threaded version with inlining. I am leaving that in the repository in a development branch but won’t be working on it unless I find that the direct-threaded version cannot meet speed requirements. The subroutine-threaded version is in branch forth-stc.

  6. +
  7. The direct-threaded version is nearing a release. I expect to have the system dictionary, text interpreter and compiler done by January 1, 2024. It is in the branch forth-dtc.

  8. The next step is to implement synthesis algorithms. The general process will be to prototype them in Forth, converting to assembler when needed. That will create the requirements for the digital signal processing library.

diff --git a/docs/The-Book-of-CLAMS.pdf b/docs/The-Book-of-CLAMS.pdf index f336d6022176e8aed8b8d02608ece4dc67d62cec..105b2d1242ee41fc2385eb43f5f09efe93069869 100644 GIT binary patch delta 11854 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 F`X8N2;cfr` delta 11836 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 ASO5S3