Skip to content

Model of a Stack Processor - includes basic Forth compiler and the model itself

Notifications You must be signed in to change notification settings

Dimankarp/stack-arch

Repository files navigation

Stack Processor. МодСль ΠΈ Forth транслятор

  • P3217, Π₯ΠΎΡ€ΠΎΡˆΠΈΡ… Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ ΠœΠ°ΠΊΡΠΈΠΌΠΎΠ²ΠΈΡ‡

  • forth | stack | neum | mc -> hw | tick -> instr | struct | stream | mem | pstr | prob1 | cache

  • УслоТнённый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚

Π―Π·Ρ‹ΠΊ программирования


<program> ::= <program> <program>
        | <primitive expr>
        | <word>
        | <comment>

<comment> ::= "(" <any symbols except: ")" >")"

<print> ::= ".\"" <str literal>"\""
<str literal> ::= <any symbols except: "\"" >

<word> ::= ":" <word name> <expr> ";"

<loop> ::= <do-loop>|<begin-until>
<do-loop> ::= "do" [<leave expr>] "loop"
<begin-until> ::= "begin" [<leave expr>] "until"

<if-else-then> ::= "if" [<expr>] ["else" <expr>] "then"

<expr> ::= <expr> <expr>
        | <token> 
        | <loop> 
        | <if-else-then>
        | <word name> 

<leave expr> ::= [<expr>] "leave" 
        | [<expr>] <leave-if-else-then> [<expr>]
        | <expr>
<leave-if-else-then> ::= "if" [<leave expr>] ["else" <leave expr>] "then"  

<primitive expr> ::= <primitive expr> <primitive expr>
        | <token>
        | <variable>
        | <sallot>
        | <word name>
<sallot> ::= "sallot" <int literal>
<variable> ::= "variable" <word name>

token ::= "dup" 
        | "drop" | "swap" | "@" | "!" | "+" | "-" 
        | "*" | "/" | "mod" | "or" | "and" | "=" | "emit"
        | "key" | "<" | ">=" | "." | <int literal> | <print>

<word name> = <any symbols>

<int literal> ::= ['-']<natural num>
<natural num> ::= [<decimal digit>]<decimal digit> 
<decimal digit> ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"

Π’ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ языка, ΠΊΠ°ΠΊ ΠΈ Π² симулируСмом процСссорС, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ 2 стэка: Data Stack (DS) с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ прямым доступом программиста ΠΈ Return Stack (DS) - Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ стэк, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ Π² do-loop Ρ†ΠΈΠΊΠ»Π΅. На Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ячСйку памяти ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ DP - data pointer, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ рСзСрвируСтся Π·Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΈ variable <имя>. DP cдвигаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ sallot.

ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΡ€ΠΎΠΌΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹Ρ… Π² объявлСния ΠΏΡ€Ρ†Π΅Π΄ΡƒΡ€, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Π¦ΠΈΠΊΠ»Ρ‹ ΠΈ условныС конструкции Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€. Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ рСкурсивныС ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€.

ОбъявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ аллокация памяти Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€.

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΈΠΌΡ‘Π½ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… - Π² любом мСстС послС объявлСния. АргумСнты ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· DS.

ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ Π½Π°Π΄ 32-Ρ…-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ числами.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ :

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ (DS Π΄ΠΎ -- DS послС) ОписаниС
"dup" (x -- x x)
"swap" (y x -- x y)
"@" (adr -- mem(adr))
"!" (val adr -- ) Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ val Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ адрСсу adr
"+" (x y -- x+y)
"-" (x y -- x-y)
"*" (x y -- x*y)
"/" (x y -- x/y)
"mod" (x y -- x mod y)
"or" (x y -- x or y)
"and" (x y -- x and y)
"=" (x y -- x==y) -1 Ссли x==y, 0 - Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС
"<" (x y -- x<y) -1 Ссли x<y, 0 - Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС
">=" (x y -- x>=y) -1 Ссли x>=y, 0 - Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС
"." (x -- ) Π’Ρ‹Π²ΠΎΠ΄ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π² Π²ΠΈΠ΄Π΅ числа Π² stdout
"emit" (x -- ) Π’Ρ‹Π²ΠΎΠ΄ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π² Π²ΠΈΠ΄Π΅ ASCII-символа Π² stdout
"key" ( -- x ) Π’Π²ΠΎΠ΄ ASCII-символа ΠΈΠ· stdin
  • : <слово> <Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅> ; - ОбъявлСниС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ

  • variable <слово> - ОбъявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

  • sallot <Π½Π°Ρ‚. число> - Π‘Π΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ DP Π½Π° <Π½Π°Ρ‚. число>

  • <слово> - Если <слово> - имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‚ΠΎ ( -- adr), ΠΈΠ½Π°Ρ‡Π΅ - вызываСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° <слово>

  • if <true-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅> [else <false-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>] then - Π’Π΅Ρ€ΡˆΠΈΠ½Π° стСка удаляСтся, Ссли ΠΎΠ½ΠΎ != 0, Ρ‚ΠΎ выполняСтся <true-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅> Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ слуаС, ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ else - выполняСтся <false-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>

  • begin <Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅> until - ΠŸΡ€ΠΈ встрСчС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° until Π²Π΅Ρ€ΡˆΠΈΠ½Π° стСка удаляСтся, Ссли ΠΎΠ½Π° != 0, Ρ‚ΠΎ Ρ†ΠΈΠΊΠ» заканчиваСтся, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС - Ρ†ΠΈΠΊΠ» возобновляСтся

  • do <Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅> loop - ΠŸΡ€ΠΈ встрСчС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° do - (limit start -- ), <выраТСния> Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠΊΠ° start != limit, Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΡ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: start++. Π’ Ρ†ΠΈΠΊΠ»Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ i: ( -- cur_start)

  • ( <ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ>) - ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ

Π’ΠΈΠ΄Ρ‹ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ²:

  • <32i> - ( -- <32i>) 32-Ρ…-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ число
  • ." <строка>" - ΠŸΠ΅Ρ‡Π°Ρ‚ΡŒ Π² stdout ASCII строки <строка>

ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ памяти

ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… общая, адрСс 26-Π±ΠΈΡ‚Π½Ρ‹ΠΉ. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ 2 стэка: Data Stack (DS) с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ прямым доступом программиста ΠΈ Return Stack (DS) - Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ стэк. Π’ стэках ΠΈ Π² памяти хранятся 32-Ρ…-Π±ΠΈΡ‚Π½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ слова.

Для программиста ΠΏΠ°ΠΌΡΡ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½Π°, начинаСтся с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ адрСса ΠΈ заканчиваСтся Data Pointer'ΠΎΠΌ. DP ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒ Π²ΠΏΠ΅Ρ€Ρ‘Π΄, аллоцируя Ρ‚Π΅ΠΌ самым ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½ΡƒΡŽΡ‚ адрСса Π² этой памяти. По памяти ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ, измСняя адрСс Π² стСкС матСматичСскимим опСрациями. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ адрСсам, мСньшим Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ большим DP - Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΈ трансляции Π² памяти Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ 3 Ρ€Π°Π·Π΄Π΅Π»Π°: Ρ€Π°Π·Π΄Π΅Π» инструкций, Ρ€Π°Π·Π΄Π΅Π» ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ Ρ€Π°Π·Π΄Π΅Π» Π΄Π°Π½Π½Ρ‹Ρ…. ВсС инструкции Π²Π½Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² Ρ€Π°Π·Π΄Π΅Π» инструкций ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π» ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄Π°Π½Π½Ρ‹Ρ… хранятся строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΈ пустыС, Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ sallot, ячСйки.

БистСма ΠΊΠΎΠΌΠ°Π½Π΄

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ состояния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· 2-Ρ… стэков, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ управлСния (условныС ΠΈ бСзусловныС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹).

Π’Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ с внСшними устройствами Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ записи/Ρ‡Ρ‚Π΅Π½ΠΈΡŽ памяти ΠΈΠ· особых установлСнных адрСсов (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΊΠΎΠ»ΠΎ Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ адрСса памяти)

DS ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈ Π² TOS - ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ рСгистр, хранящий Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ DS. Оба стэка, DS ΠΈ RS, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹Π΅ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ Π² АЛУ. Π—Π°ΠΏΠΈΡΡŒ Π² DS ΠΈ RS Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΈΠ· АЛУ.

Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· DS ΠΈ RS доступна с (stack.pop()) ΠΈ Π±Π΅Π· (stack.peek()) удалСния Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹.

ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΡ

  • DS - Data Stack
  • RS - Return Stack
  • TOS - Top of Data Stack register
  • IR.lit - ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ инструкции Π² IR

STACK & MEMORY OPERATIONS

  1. PUSH (LIT)
    • DS.push(TOS) | TOS <- IR.lit
  2. POP
    • TOS <- DS.pop()
  3. DUP
    • DS.push(TOS)
  4. SWAP
    • RS.push(TOS) | TOS <- DS.pop()
    • DS.push(RS.pop())
  5. FETCH
    • ADR <- TOS
    • TOS <- MEM.out(ADR)
  6. STORE
    • ADR <- TOS
    • MEM.in <- DS.pop()
    • TOS <- DS.pop()

ARITHMETIC OPERATIONS

  1. ADD
    • TOS <- DS.pop() + TOS
  2. SUB
    • TOS <- DS.pop() - TOS
  3. MUL
    • TOS <- DS.pop() * TOS
  4. DIV
    • TOS <- DS.pop() / TOS
  5. MOD
    • TOS <- DS.pop() % TOS

LOGIC OPERATION

  1. OR
    • TOS <- TOS or DS.pop()
  2. AND
    • TOS <- TOS and DS.pop()

COMPARE OPERATION

  1. EQUAL
    • Z <- TOS or DS.pop()
    • | IF(Z==1): TOS <- 1 | ELSE: TOS <- 0
  2. LESS
    • NV <- DS.pop() - TOS
    • | IF(N==1): *| IF(V==0): TOS <- 1 | ELSE: TOS <- 0 | ELSE: *| IF(V==1): TOS <- 1 | ELSE: TOS <- 0
  3. GREATEQ
    • NV <- DS.pop() - TOS
    • | IF(N==1): *| IF(V==1): TOS <- 1 | ELSE: TOS <- 0 | ELSE: *| IF(V==0): TOS <- 1 | ELSE: TOS <- 0

BRANCHING, LOOPING & RETURN STACK

  1. JMPZ (ADDR)
    • Z <- TOS | TOS <- DS.pop()
    • | IF(Z==1): PC <- IR.lit
  2. JMP (ADDR)
    • PC <- IR.lit
  3. STASH
    • RS.push(TOS) | TOS <- DS.pop()
  4. UNSTASH
    • DS.push(TOS)
    • TOS <- RS.pop()
  5. CPSTASH //COPY STASH
    • DS.push(TOS)
    • TOS <- RS
  6. LOOP (ADDR)
    • DS.push(TOS)

    • TOS <- RS.pop()

    • Z <- (TOS + 1) - RS

    • | IF(Z==1): RS.pop() | TOS <- DS.pop()

      | ELSE: RS.push(TOS + 1) | TOS <- DS.pop() | PC <- IR.lit

PROCEDURES

  1. CALL (ADDR)
    • RS.push(PC) | PC <- IR.lit
  2. RET
    • PC <- RS.pop()

MISC

  1. HALT

Вранслятор

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки транслятора forthc:

forthc.py [-s START_ADR] [-d IO_ADR] SOURCE TARGET

ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹:
  SOURCE                Ρ„Π°ΠΉΠ» с исходным ΠΊΠΎΠ΄ΠΎΠΌ
  TARGET                имя Ρ„Π°ΠΉΠ»Π° для записи транслированного ΠΊΠΎΠ΄Π°

ΠžΠΏΡ†ΠΈΠΈ:
  -s START_ADR, --start-adr START_ADR
                        адрСс Π½Π°Ρ‡Π°Π»Π° выполнСния инструкций процСссора (Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PC)
  -d IO_ADR, --device-adr IO_ADR
                        адрСс внСшнСго устройства

Π­Ρ‚Π°ΠΏΡ‹ транслирования

  1. Π­Ρ‚Π°ΠΏ - Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· исходного ΠΊΠΎΠ΄Π° строковых Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ²

  2. Π­Ρ‚Π°ΠΏ - Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²

  3. Π­Ρ‚Π°ΠΏ - ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ трансляция Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ Π³Ρ€ΡƒΠΏΠΏ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π² инструкции. На этом вмСстов адрСсов (инструкций ΠΈ Π² значСнихя ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°Ρ…) ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ "Π·Π°Ρ‚Ρ‹Ρ‡ΠΊΠΈ" - ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ смСщСния Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… (инструкций, слов ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…)

  4. Π­Ρ‚Π°ΠΏ - вычислСниС ΠΈ присвоСниС Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… адрСсов.

МодСль процСссора

Datapath

                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                 
                 β”‚                             mux_tos           β”‚                                 
                 β”‚                             ------β–Ίβ”Œβ”€β”€β”€β”€β”     β”‚                                 
                 β”‚          mux_stck                β”Œβ”€β”˜DS  β—„β”€β”€β”€β”€β”€β”˜                                 
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚    β”Œβ”€β”€β”€β”β—„--------                β”‚   /  β”‚                                       
β”‚          β”œβ”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β–ΊDS └┐           β”Œβ”€β”€β”€β”€β”€β”€β”€β”    β”‚  MEM ◄──────────┐                            
β”‚          β”‚          β”‚ /  β”œβ”€β”€β”€β”€β”€β”     β”‚  TOS  ◄─────   /  β”‚          β”‚                            
β”‚  DATA    β”‚       β”Œβ”€β”€β–ΊRS β”Œβ”˜     β”‚     β””β”€β”€β”€β”¬β”€β”€β”€β”˜    β”‚  IR  ◄───┐      β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  STACK   β”‚       β”‚  β””β”€β”€β”€β”˜      β”‚         β”‚        β”‚   /  β”‚   β”‚      β”‚              β”‚            β”‚
β”‚          β”‚       β”‚       alu_l β”‚         β”‚ alu_r  └─┐ALU ◄─┐ β”‚IR.litβ”‚              β”‚ MEMORY     β”‚
β”‚          ◄───────┼────┐  ----β–Ί β”‚         β”‚ β—„----    β””β”€β”€β”€β”€β”˜ β”‚ β”‚[26:0]β”‚    MOUT[31:0]β”‚ UNIT &     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚    β”‚        β”‚         β”‚                 β”‚ β”‚      β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ CACHE      β”‚
                   β”‚    β”‚     β”Œβ”€β”€β–Όβ”€β”€β”   β”Œβ”€β”€β–Όβ”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”˜ β”‚      β”‚         mrd  β”‚            β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚    β”‚     β”‚     β””β”€β”€β”€β”˜     β”‚  CTRL  β”‚       β”‚      β”‚         ---β–Ί β”‚            β”‚
β”‚          β”œβ”€β”€β”€β”€β”€β”€β”€β”˜    β”‚     β”‚               β”‚  UNIT  β”‚      β”Œβ”΄β”€β”€β”€β”€β”€β”€β–Όβ”        mwr  β”‚            β”‚
β”‚          β”‚            β”‚     └┐     ALU     β”Œβ”˜    β–²   β”‚      β”‚   IR   β”œβ”€β”      ---β–Ί β”‚            β”‚
β”‚  RETURN  β”‚            β”‚      └┐           β”Œβ”˜     β”‚   β”‚      β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚           β”‚            β”‚
β”‚  STACK   β”‚   β”Œβ”€β”€β”€β”    β”‚  ----β–Ίβ””β”€β”€β”€β”€β”€β”¬β”€β”€β”¬β”€β”€β”˜    β”Œβ”€β”΄β”€β” β”‚                 β”‚  MIN[31:0]β”‚            β”‚
β”‚          β”‚  β”Œβ”˜ALU◄─────  alu_op     β”‚  β”‚    β”Œβ”€β–Ίβ”‚NZVβ”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί            β”‚
β”‚          ◄───  / β”‚    β”‚             β”‚  β””β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”˜ β”‚                 β”‚           β”‚            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  └┐PC ◄──┐ β”‚             β”‚                β”‚ β”Œβ”€β”€β”€β”           β”‚           β”‚            β”‚
         -----β–Ίβ””β”€β”€β”€β”˜  β”‚ └─────────────┴─┬──────────────┴─►ALU└┐  β”Œβ”€β”€β”€β”€β”  β”‚  ADR[26:0]β”‚            β”‚
         mux_rs       β”‚                 β”‚                β”‚ /  β”œβ”€β”€β–Ί AR β”œβ”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί            β”‚
                      └────────────┬────┼────────────────►PC β”Œβ”˜  β””β”€β”€β”€β”€β”˜  β”‚           β”‚            β”‚
                                   β”‚    β”‚                β””β”€β”€β”€β”˜β—„------    β”‚           β”‚            β”‚
   IR   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚    └───────────┐          mux_ar    β”‚           β”‚            β”‚
   ─────►            β”‚             β”‚   mux_pc       β”‚                    β”‚           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
   NZV  β”‚            β”‚             β”‚   -----β–Ίβ”Œβ”€β”€β”€β”€β” β”‚                    β”‚                         
   ─────► CONTROL    β”‚             β”‚       β”Œβ”€β”˜    β—„β”€β”˜                    β”‚IR.lit                   
        β”‚ UNIT       β”‚             β”‚       β”‚ ALU  β”‚                      β”‚[26:0]                   
   β—„----β”‚            β”‚         β”Œβ”€β”€β”€β”΄β”€β”€β”    β”‚  /   β”‚                      β”‚                         
 signalsβ”‚            β”‚         β”‚  PC  β”œβ”€β”€β”€β”€β”€ IR   ◄───────────────────────                         
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”¬β”€β”€β”˜    β”‚  /   β”‚                      β”‚                         
                                   β”‚       β”‚ +1   β”‚                      β–Ό                         
                                   β”‚       └─┐    ◄────┐               CTRL                        
                                   β”‚         β””β”€β”€β”€β”€β”˜    β”‚               UNIT                        
                                   β”‚                 β”Œβ”€β”΄β”                                          
                                   └─────────────────►+1β”‚                                          
                                                     β””β”€β”€β”˜                                          

ΠšΡ€Π°ΡΠΈΠ²ΠΎ отрСндСрСнная схСма datapath

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ:

  • NZV - Ρ„Π»Π°Π³ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² АЛУ
  • На схСмС Ρ€Π°Π΄ΠΈ читаСмости ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹ сигналы замыкания рСгистров *_latch
  • Π‘ΠΈΠ³Π°Π½Π» alu_op - комплСксный, Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ
  • Memory Unit состоит ΠΈΠ· Cache ΠΈ Memory

Stack

                                           STCK.peek():             
                                                                    
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        mux_stck_adr = -1    
stck_rd  β”‚            β”‚STCKOUT[31:0]                                
-------β–Ί β”‚ SRAM       β”œβ”€β”€β”€β”€β”€β–Ί                  mux_sp = X           
         β”‚ UNIT       β”‚                                             
stck_wr  β”‚            β”‚                        sp_latch = 0         
-------β–Ί β”‚ 128x32     β”‚                                             
         β”‚            β”‚                    STCK.push(Y):            
         β”‚            β”‚STCKIN[31:0]                                 
         β”‚            ◄──────                  mux_stck_adr = SP    
         β”‚            β”‚                                             
         β””β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”˜                        mux_sp = +1          
              β”‚ADR[6:0]                                             
              β”‚                                sp_latch = 1         
            β”Œβ”€β”΄β”€β”€β”                                                  
           β”Œβ”˜    └┐  mux_stck_adr          STCK.pop():              
           β”‚-1/ SPβ”‚ β—„------------                                   
           β””β”€β–²β”€β”€β–²β”€β”˜                            mux_stck_adr = -1    
             β”‚  β”‚                                                   
             β”œβ”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           mux_sp = -1          
             β”‚  β”‚                  β”‚                                
           β”Œβ”€β”΄β” β”‚      β”Œβ”€β”€β”        β”‚           sp_latch = 1         
           β”‚-1β”‚ β”œβ”€β”€β”€β”€β”€β”€β–Ί+1β”œβ”€β”€β”€β”€β”   β”‚                                
           β””β”€β–²β”˜ β”‚      β””β”€β”€β”˜    β”‚   β”‚                                
             β”‚  β”‚            β”Œβ”€β–Όβ”€β”€β”€β–Όβ”€β”  mux_sp                      
             β”‚  β”‚            β”‚+1 / -1β”‚ β—„------                      
             β”‚  β”‚            └┐     β”Œβ”˜                              
             β”‚  β”‚             β””β”€β”€β”¬β”€β”€β”˜                               
           β”Œβ”€β”΄β”€β”€β”΄β”€β”              β”‚                                  
           β”‚  SP  β—„β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                  
           β””β”€β”€β”€β”€β”€β”€β”˜                                                 

ΠšΡ€Π°ΡΠΈΠ²ΠΎ отрСндСрСнная схСма стэка

Control Unit

          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            
          β”‚        mux_mpc              β”‚mIR.adr     
          β”‚  β”Œβ”€β”€β”€β”β—„-------              β”‚            
          └──►mIR└┐                β”Œβ”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”      
             β”‚ /  β”‚     β”Œβ”€β”€β”€β”€β”€β”    β”‚          β”‚      
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Ί IR β”œβ”€β”€β”€β”€β”€β–Ί mPC β”œβ”€β”¬β”€β”€β–Ί mPROGRAM β”‚      
    β”‚        β”‚ /  β”‚     β””β”€β”€β”€β”€β”€β”˜ β”‚  β”‚          β”‚      
    β”‚     β”Œβ”€β”€β–Ί +1β”Œβ”˜             β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      
    β”‚     β”‚  β””β”€β”€β”€β”˜              β”‚    β–²      |        
    β”‚     β”‚                     β”‚    β”‚      |        
    β”‚     β”‚                     β”‚    β”‚ NZV  | signals
    β”‚     β”‚        β”Œβ”€β”€β”         β”‚    β”‚      |        
    β”‚     └─────────+1β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚      |        
β”Œβ”€β”€β”€β”΄β”€β”€β”€β”          β””β”€β”€β”˜              β”‚      β–Ό        
β”‚IR->mPCβ”‚                                            
β””β”€β”€β”€β–²β”€β”€β”€β”˜                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      
    β”‚                              β”‚          β”‚      
    β”‚            IR.opcode[31:27]  β”‚          β”‚      
    └─────────────────────────────── DATAPATH β”‚      
                                   β”‚          β”‚      
                                   β”‚          β”‚      
                                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      
  mPROGRAM                                           
 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     
 β”‚                                             β”‚     
 β”‚                   β–²                         β”‚     
 β”‚                   |                         β”‚     
 β”‚                   | signals                 β”‚     
 β”‚                   |                         β”‚     
 β”‚               β”Œβ”€β”€β”€β”€β”€β”€β”€β”                     β”‚     
 β”‚           --β–Ί β”‚signalsβ”‚                     β”‚     
 β”‚           |   β””β”€β”€β”€β–²β”€β”€β”€β”˜                     β”‚     
 β”‚           |       β”‚            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚     
 β”‚           |   β”Œβ”€β”€β”€β”΄β”€β”€β”€β” M.out  β”‚mPROGRAM  β”‚ β”‚     
 β”‚  mIR.type ----β”‚  mIR  β”œβ”€β”€β”€β—„β”€β”€β”€β”€β”€MEMORY    β”‚ β”‚     
 β”‚           |   β””β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚          β”‚ β”‚     
 β”‚           |       |            β”‚          β”‚ β”‚     
 β”‚           |  mIR.z|            β””β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”˜ β”‚     
 β”‚           |       |                  β”‚mAddr β”‚     
 β”‚    mJMP   β–Ό       β–Ό                  β”‚      β”‚     
 β”‚    β—„------AND β—„--EQβ—„--( Z/0 )    mPC β”‚      β”‚     
 β”‚                        β–²   β–²         β”‚      β”‚     
 β”‚                        |   |                β”‚     
 β”‚  Z can be one of NZV  Z|   |0               β”‚     
 β”‚  depending on mInstr   |   |                β”‚     
 β”‚                                             β”‚     
 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     

ΠšΡ€Π°ΡΠΈΠ²ΠΎ отрСндСрСнная схСма control unit

Кэш

Кэш set-associative - Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ состоит ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° set'ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ состоят ΠΈΠ· Π»ΠΈΠ½ΠΈΠΉ.

Π›ΠΈΠ½ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ dirty-Π±ΠΈΡ‚, выставляСмый Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π»ΠΈΠ½ΠΈΠΈ. Кэш обновляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ Π»Π΅Π½ΠΈΠ²ΠΎ - Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ copy-back.

Алгоритм вытСснСния PLRUm.

ВСстированиС

ВСстированиС выполняСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ golden test-ΠΎΠ².

Запуск golden-тСстов: golden_test.py

ВСсты:

  • tests/hello.yml - ΠŸΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ "Hello World!" Π² stdout
  • test/hello_user_name.yml - Π—Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π΅Ρ‚ΡΡ ΠΈ привСтствуСт Π΅Π³ΠΎ
  • test/cat.yml - Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ символы, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π² stdin, Π΄ΠΎ истощСния Π±ΡƒΡ„Π΅Ρ€Π°
  • test/prob1.yml - Euler problem 1
  • test/bubble_sort.yml - Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠΌ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Cache'Π°
  • test/factorial.yml - ΠŸΠΎΠ΄ΡΡ‡Ρ‘Ρ‚ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π°, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

CI ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²Π·ΡΡ‚ΡŒ ΠΈΠ· рСфСрСнсной Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Запуск тСстов: poetry run pytest . -v

ОбновлСниС: poetry run pytest . -v --update-goldens

CI ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Github Action:

name: Python CI

on:
  push:
    branches:
      - master
    paths:
      - ./*.py
      - ./*.lock
      - ./pyproject.toml
      - ./tests/*
      - .github/workflows/python.yaml
  pull_request:
    branches:
      - master
    paths:
      - ./*.py
      - ./*.lock
      - ./pyproject.toml
      - ./tests/*
      - .github/workflows/python.yaml
defaults:
  run:
    working-directory: ./

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.11

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install poetry
          poetry install

      - name: Run tests and collect coverage
        run: |
          poetry run coverage run -m pytest .
          poetry run coverage report -m
        env:
          CI: true

  lint:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.11

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install poetry
          poetry install

      - name: Check code formatting with Ruff
        run: poetry run ruff format --check .

      - name: Run Ruff linters
        run: poetry run ruff check .

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΈ ΠΆΡƒΡ€Π½Π°Π» Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСссора Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ cat:

$ cat ./programs/cat.f
: cat
        begin
                key dup dup if
                        emit  
                then
        0 = until
;
cat
$ python forthc.py -d 0 -s 10 ./programs/cat.f target.out
Translated successfully. Source LoC: 8  Machine Instructions: 13
$ cat target.out
[{"opcode": "call", "operand": 12, "token": {"val": "cat", "line": 8, "num": 1}, "offset": 10},
 {"opcode": "halt", "offset": 11},
 {"opcode": "push", "operand": 0, "token": {"val": "key", "line": 3, "num": 1}, "offset": 12},
 {"opcode": "fetch", "token": {"val": "key", "line": 3, "num": 1}, "offset": 13},
 {"opcode": "duplicate", "token": {"val": "dup", "line": 3, "num": 2}, "offset": 14},
 {"opcode": "duplicate", "token": {"val": "dup", "line": 3, "num": 3}, "offset": 15},
 {"opcode": "jump on zero", "operand": 19, "token": {"val": "if", "line": 3, "num": 4}, "offset": 16},
 {"opcode": "push", "operand": 0, "token": {"val": "emit", "line": 4, "num": 1}, "offset": 17},
 {"opcode": "store", "token": {"val": "emit", "line": 4, "num": 1}, "offset": 18},
 {"opcode": "push", "operand": 0, "token": {"val": "0", "line": 6, "num": 1}, "offset": 19},
 {"opcode": "equal", "token": {"val": "=", "line": 6, "num": 2}, "offset": 20},
 {"opcode": "jump on zero", "operand": 12, "token": {"val": "until", "line": 6, "num": 3}, "offset": 21},
 {"opcode": "return", "token": {"val": ";", "line": 7, "num": 1}, "offset": 22}]
$ python machine.py -j -d 0 -s 10 -m 1024 -c 32 target.out -i "St"
[JRNL]   TCK:     0   TOS:     0   ALU:     0
[JRNL] DS (LEN: 0): []...
[JRNL] RS (LEN: 0): []...
[JRNL]    PC:    10    IR: {}
[JRNL]   ADR:     0   MEM: 0
[JRNL]   mPC:     0 mPROG: ARLatch.PC, MemSignal.MemRD

[JRNL] Prefetch finishing: 0 extra ticks
[JRNL] Cache read 10 miss for 0 extra ticks
[JRNL] Cache insert 10
[JRNL] Memory store/fetch: 10 extra ticks

[JRNL] Started PARALLEL FETCHING of 14:
[JRNL] Cache miss on lookup 14
[JRNL] Cache insert 14
[JRNL] planned finish on 22 tick:

[JRNL] In total CPU waited for 10 extra ticks

[JRNL]   TCK:    11   TOS:     0   ALU:     0
[JRNL] DS (LEN: 0): []...
[JRNL] RS (LEN: 0): []...
[JRNL]    PC:    10    IR: {}
[JRNL]   ADR:    10   MEM: CALL  12 'cat'@8:1
[JRNL]   mPC:     1 mPROG: DPSignal.IRLatch, PCLatch.PLUS1

[JRNL]   TCK:    12   TOS:     0   ALU:     0
[JRNL] DS (LEN: 0): []...
[JRNL] RS (LEN: 0): []...
[JRNL]    PC:    11    IR: CALL  12 'cat'@8:1
[JRNL]   ADR:    10   MEM: CALL  12 'cat'@8:1
[JRNL]   mPC:     2 mPROG: mPCLatch.IR

...

[JRNL]   TCK:   193   TOS:     0   ALU:     0
[JRNL] DS (LEN: 1): [0]...
[JRNL] RS (LEN: 1): [11]...
[JRNL]    PC:    13    IR: PUSH   0 'key'@3:1
[JRNL]   ADR:    12   MEM: PUSH   0 'key'@3:1
[JRNL]   mPC:     0 mPROG: ARLatch.PC, MemSignal.MemRD

[JRNL] Prefetch finishing: 0 extra ticks
[JRNL] Cache read 13 hit for 0 extra ticks
[JRNL] In total CPU waited for 0 extra ticks

[JRNL]   TCK:   194   TOS:     0   ALU:     0
[JRNL] DS (LEN: 1): [0]...
[JRNL] RS (LEN: 1): [11]...
[JRNL]    PC:    13    IR: PUSH   0 'key'@3:1
[JRNL]   ADR:    13   MEM: FETCH 'key'@3:1
[JRNL]   mPC:     1 mPROG: DPSignal.IRLatch, PCLatch.PLUS1

[JRNL]   TCK:   195   TOS:     0   ALU:     0
[JRNL] DS (LEN: 1): [0]...
[JRNL] RS (LEN: 1): [11]...
[JRNL]    PC:    14    IR: FETCH 'key'@3:1
[JRNL]   ADR:    13   MEM: FETCH 'key'@3:1
[JRNL]   mPC:     2 mPROG: mPCLatch.IR

[JRNL]   TCK:   196   TOS:     0   ALU:     0
[JRNL] DS (LEN: 1): [0]...
[JRNL] RS (LEN: 1): [11]...
[JRNL]    PC:    14    IR: FETCH 'key'@3:1
[JRNL]   ADR:    13   MEM: FETCH 'key'@3:1
[JRNL]   mPC:    12 mPROG: ALUop, ARLatch.ALU, MemSignal.MemRD

[JRNL] Prefetch finishing: 0 extra ticks
[WARN] Input buffer was empty on fetch!
[INFO] Cache miss rate: 8.696%
[INFO] Ticks: 197
St
[JRNL] Output Buffer: St
[JRNL] Output Buffer(ASCII codes): 83, 116
[WARN] Input buffer was empty on fetch!
[INFO] Cache miss rate: 8.696%
[INFO] Ticks: 197
St
Cache miss rate: 8.696% Ticks: 197

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ исходного ΠΊΠΎΠ΄Π°:

$ poetry run pytest . -v
====================================================================================== test session starts ======================================================================================                                 
platform win32 -- Python 3.11.5, pytest-7.4.4, pluggy-1.5.0 -- C:\Users\marin\AppData\Local\pypoetry\Cache\virtualenvs\stack-processor-ibGfME1p-py3.11\Scripts\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\marin\OneDrive\Documents\ITMOStudies\Computer Architecture\stack_processor
configfile: pyproject.toml
plugins: golden-0.2.2
collected 6 items

golden_test.py::test_forthc_and_machine[tests/bubble_sort.yml] PASSED                                                                                                                [ 16%]
golden_test.py::test_forthc_and_machine[tests/cat.yml] PASSED                                                                                                                        [ 33%]
golden_test.py::test_forthc_and_machine[tests/factorial.yml] PASSED                                                                                                                  [ 50%]
golden_test.py::test_forthc_and_machine[tests/hello.yml] PASSED                                                                                                                      [ 66%]
golden_test.py::test_forthc_and_machine[tests/hello_user_name.yml] PASSED                                                                                                            [ 83%]
golden_test.py::test_forthc_and_machine[tests/prob1.yml] PASSED                                                                                                                      [100%]

============================================================================== 6 passed in 145.76s (0:02:25) ============================================================================== 


$ poetry run ruff check .
$ poetry run ruff format .
10 files left unchanged

About

Model of a Stack Processor - includes basic Forth compiler and the model itself

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published