Mermaid JS
Mermaid lets you create diagrams and visualizations using text and code. Read about it from their official website
Integrating mermaid with mdbook
[undone]
State diagrams
"A state diagram is a type of diagram used in computer science and related fields to describe the behavior of systems. State diagrams require that the system described is composed of a finite number of states; sometimes, this is indeed the case, while at other times this is a reasonable abstraction." Wikipedia
Find instructions on drawing state diagrams on this page
- define states (with or without descriptions)(with or without aliases)
eg
- simple states without descriptions or aliases :
stateDiagram start running
2. simple states with descriptions
stateDiagram start : The bootloader has loaded the kernel image onto the RAM running : the kernel runs in Machine mode
3. states with descriptions + aliases
- Define Transitions
stateDiagram-v2 s1 --> s2: A transition
- Nested states, sub_modules, notes
stateDiagram s1 s2 s3 [*] --> s1 s1 --> s2 s2 --> s3 s3 --> [*] state s3 { [*] --> t1 t1 --> t2 t2 --> [*] }
stateDiagram-v2 [*] --> First First --> Second First --> Third state First { [*] --> fir fir --> [*] } state Second { [*] --> sec sec --> [*] } state Third { [*] --> thi thi --> [*] }
- Choices (if else/ match)
- define the choice node
- define th transition conditions
stateDiagram load_firmware load_bootloader load_kernel' run_kernel shutdown state look_for_bootloader <<choice>> state look_for_kernel <<choice>> [*] --> load_firmware load_firmware --> look_for_bootloader look_for_bootloader --> load_bootloader : Bootloader is found look_for_bootloader --> shutdown : Bootloader is missing load_bootloader --> look_for_kernel look_for_kernel --> load_kernel : Kernel image is found look_for_kernel --> shutdown : Kernel image is Missing load_kernel --> run_kernel run_kernel --> shutdown shutdown --> [*]
- Forks/merges [undone]
- Concurrency [undone]
graph TD A[ Access the Line Status Register] --> B[Access the data_ready status bit]; B --> C{Is the Data Ready?} ; C --> |Yes| D[Read the RHR buffer]; D --> E[return the read byte]; C --> |No| E[return None type]
stateDiagram [*] --> Program state Program{ [*] --> KeyBoard : Someone presses keyboard Keys KeyBoard --> Uart_upper_interface : [stream of bytes] Uart_upper_interface --> Uart state Uart { state if_state <<choice>> [*] --> FIFO_Buffer : store byte stream into FIFO_Buffer --> if_state : Does FIFO have new Data? if_state --> send_interrupt : Yes if_state --> [*] : No state if_state_2 <<choice>> FIFO_Buffer --> if_state_2 : Is all data in FIFO read? if_state_2 --> set_uart_as_read_ready : No if_state_2 --> set_uart_as_write_ready : yes if_state_2 --> stop_sending_read_interrupt : yes } Uart --> Plic : send interrupt to Plic Plic --> CPU : Plic sends interrupt to CPU CPU --> Trap_Handler : CPU jumps to Trap_Handler --> Uart : read the Uart Buffer }