commits
2020-08-27 | decode.scm: add some section comments to structure code | Sören Tempel |
2020-08-22 | README.md: update instr->hex sample output | Sören Tempel |
2020-08-22 | convert.scm: Get rid of code duplication in get-byte and get-nibble | Sören Tempel |
2020-08-22 | convert.scm: provide bit->string helper method | Sören Tempel |
2020-08-22 | convert.scm: Strip leading zeros of instr->hex output | Sören Tempel |
Clone the repository to access all 80 commits.
# riscv-utils Scheme utility procedures for the [RISC-V][riscv website] instruction set architecture. ## Features The feature set of provided procedures is centered around easing the development of utilities for RISC-V (especially instruction set simulators). Currently the following features are provided: * `decode.scm`: Decoding of RISC-V instructions. * `encode.scm`: Encoding of RISC-V instructions. * `convert.scm`: Conversion from/to different representations. * `opcodes.scm`: Constants for instruction opcodes (currently rv32i only). ## Usage The code is supposed to be used from a Scheme REPL, no binaries are provided. The Scheme files in the `riscv/` directory are mostly(?) [R7RS][r7rs small] compatible. It should be possible to use them with any standard compliant Scheme implementation which provides an [SRFI-151][srfi-151] module. Just load the files you want to use using `(load "riscv/<file>.scm")` from your Scheme REPL. If your favorite Scheme implementation is [CHICKEN][call-cc], read on. ### Example The API is intentionally very low-level. Nonetheless, many fun things can be done with it. The following example takes an existing `JAL` instruction (e.g. as extracted from a `riscv32-unknown-elf-objdump -d` output) and modifies it to jump somewhere else. $ csi > (import riscv) > (set! jal #x0100056f) > (instr-j-imm jal) 16 > (j-type (instr-opcode jal) (instr-rd jal) 32) 33555823 The value `33555823` (`0x200056f`) is RISC-V machine code for a JAL instruction holing the value `32` (instead of `16`) as a J-immediate. This can be easily verified using: > (set! jal-new 33555823) > (instr->hex jal-new) "#x200056f" > (instr-j-imm jal-new) 32 ## Installation In addition to standard compliant(?) Scheme source code, this repository also contains the required files for using the code as a CHICKEN Scheme [egg][call-cc eggs]. However, since the code is still in very early stages of development I haven't published it as an egg yet. Nonetheless, an egg can be built locally using: $ chicken-install -test ### Building without installing If installation is not desired, build as follows: $ export CHICKEN_REPOSITORY_PATH="$(pwd):${CHICKEN_REPOSITORY_PATH}" $ chicken-install -n -test Afterwards simply run `(import riscv)` in `csi(1)` as usual. ## License This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. [riscv website]: https://riscv.org/ [srfi-151]: https://srfi.schemers.org/srfi-151/srfi-151.html [r7rs small]: https://small.r7rs.org/ [call-cc]: https://call-cc.org [call-cc eggs]: https://eggs.call-cc.org/