mirror of
https://github.com/RRZE-HPC/OSACA.git
synced 2025-12-16 00:50:06 +01:00
- Enhanced RISC-V parser to support reloc_type and symbol in ImmediateOperand. - Added missing attributes (reloc_type, symbol) to ImmediateOperand and updated __eq__ for backward compatibility. - Fixed all flake8 (E501, E265, F401, F841) and Black formatting issues across the codebase. - Improved docstrings and split long lines for better readability. - Fixed test failures related to ImmediateOperand instantiation and attribute errors. - Ensured all tests pass, including edge cases for RISC-V, x86, and AArch64. - Updated .gitignore and documentation as needed. - Renamed example files for consistency (rv6 -> rv64).
752 lines
14 KiB
YAML
752 lines
14 KiB
YAML
---
|
|
osaca_version: 0.7.0
|
|
micro_architecture: rv64
|
|
arch_code: rv64
|
|
isa: riscv
|
|
|
|
# RV64 core parameters
|
|
ROB_size: 96
|
|
retired_uOps_per_cycle: 3
|
|
scheduler_size: 84
|
|
hidden_loads: false
|
|
|
|
# Pipeline ports (simplified model)
|
|
ports:
|
|
- ALU
|
|
- MEM
|
|
- DIV
|
|
- FP
|
|
|
|
port_model_scheme: |
|
|
ALU: Integer arithmetic and logic operations
|
|
MEM: Load/store and address generation
|
|
DIV: Integer division operations
|
|
FP: Floating-point operations and vector instructions
|
|
|
|
# Load latency in cycles by register type
|
|
load_latency:
|
|
gpr: 3
|
|
fpr: 3
|
|
vr: 4
|
|
|
|
# Simplified load throughput model
|
|
load_throughput_default: [[1, ["MEM"]]]
|
|
store_throughput_default: [[1, ["MEM"]]]
|
|
store_to_load_forward_latency: 4
|
|
|
|
# Instruction forms - listed by category
|
|
instruction_forms:
|
|
# Basic integer arithmetic (latency 1, throughput 1)
|
|
- name: ADD
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: ADDI
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: SUB
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: LUI
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: AUIPC
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
# Logical operations
|
|
- name: AND
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: ANDI
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: OR
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: ORI
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: XOR
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: XORI
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
# Shifts
|
|
- name: SLL
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: SLLI
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: SRL
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: SRLI
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: SRA
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: SRAI
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
# Multiplication
|
|
- name: MUL
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: MULH
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
# Division (higher latency)
|
|
- name: DIV
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 10
|
|
throughput: 10
|
|
port_pressure: [[1, ["DIV"]]]
|
|
|
|
- name: DIVU
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 10
|
|
throughput: 10
|
|
port_pressure: [[1, ["DIV"]]]
|
|
|
|
- name: REM
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 10
|
|
throughput: 10
|
|
port_pressure: [[1, ["DIV"]]]
|
|
|
|
- name: REMU
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 10
|
|
throughput: 10
|
|
port_pressure: [[1, ["DIV"]]]
|
|
|
|
# Memory operations
|
|
- name: LW
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: LD
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: SW
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: SD
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
# Control flow
|
|
- name: BEQ
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: identifier
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: BNE
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: identifier
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: BLT
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: identifier
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: BGE
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: identifier
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: JAL
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: identifier
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: JALR
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
# Floating point operations
|
|
- name: FLW
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: FLD
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: FSW
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: FSD
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: FADD.S
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: FADD.D
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: FSUB.S
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: FMUL.S
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: FDIV.S
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
latency: 10
|
|
throughput: 10
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: FMADD.S
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
latency: 4
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
# Vector instructions
|
|
- name: VSETVLI
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
- class: identifier
|
|
- class: identifier
|
|
- class: identifier
|
|
- class: identifier
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: VLE64.V
|
|
operands:
|
|
- class: register
|
|
prefix: v
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 4
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: VLE8.V
|
|
operands:
|
|
- class: register
|
|
prefix: v
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 4
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: VSE64.V
|
|
operands:
|
|
- class: register
|
|
prefix: v
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: VSE8.V
|
|
operands:
|
|
- class: register
|
|
prefix: v
|
|
- class: memory
|
|
base: x
|
|
offset: imd
|
|
index: null
|
|
scale: 1
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["MEM"]]]
|
|
|
|
- name: VFMACC.VF
|
|
operands:
|
|
- class: register
|
|
prefix: v
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: v
|
|
latency: 4
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: VFMACC.VV
|
|
operands:
|
|
- class: register
|
|
prefix: v
|
|
- class: register
|
|
prefix: v
|
|
- class: register
|
|
prefix: v
|
|
latency: 4
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: VFADD.VV
|
|
operands:
|
|
- class: register
|
|
prefix: v
|
|
- class: register
|
|
prefix: v
|
|
- class: register
|
|
prefix: v
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: VFMADD.VV
|
|
operands:
|
|
- class: register
|
|
prefix: v
|
|
- class: register
|
|
prefix: v
|
|
- class: register
|
|
prefix: v
|
|
latency: 4
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: FMUL.D
|
|
operands:
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
- class: register
|
|
prefix: f
|
|
latency: 3
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: VFMUL.VF
|
|
operands:
|
|
- class: register
|
|
prefix: v
|
|
- class: register
|
|
prefix: v
|
|
- class: register
|
|
prefix: f
|
|
latency: 4
|
|
throughput: 1
|
|
port_pressure: [[1, ["FP"]]]
|
|
|
|
- name: J
|
|
operands:
|
|
- class: identifier
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
# CSR instructions
|
|
- name: CSRR
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: identifier
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: CSRW
|
|
operands:
|
|
- class: identifier
|
|
- class: register
|
|
prefix: x
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
# Pseudo-instructions
|
|
- name: MV
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: register
|
|
prefix: x
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: LI
|
|
operands:
|
|
- class: register
|
|
prefix: x
|
|
- class: immediate
|
|
imd: int
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]]
|
|
|
|
- name: RET
|
|
operands: []
|
|
latency: 1
|
|
throughput: 1
|
|
port_pressure: [[1, ["ALU"]]] |