diff options
Diffstat (limited to 'src/synth/elab-memtype.adb')
-rw-r--r-- | src/synth/elab-memtype.adb | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/synth/elab-memtype.adb b/src/synth/elab-memtype.adb new file mode 100644 index 000000000..382378c1c --- /dev/null +++ b/src/synth/elab-memtype.adb @@ -0,0 +1,117 @@ +-- Values in synthesis. +-- Copyright (C) 2017 Tristan Gingold +-- +-- This file is part of GHDL. +-- +-- 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 2 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 <gnu.org/licenses>. + +with System; use System; +with System.Storage_Elements; + +package body Elab.Memtype is + + function "+" (Base : Memory_Ptr; Off : Size_Type) return Memory_Ptr + is + use System.Storage_Elements; + begin + return To_Memory_Ptr (To_Address (Base) + Storage_Offset (Off)); + end "+"; + + type Ghdl_U8_Ptr is access all Ghdl_U8; + function To_U8_Ptr is + new Ada.Unchecked_Conversion (Address, Ghdl_U8_Ptr); + + procedure Write_U8 (Mem : Memory_Ptr; Val : Ghdl_U8) is + begin + To_U8_Ptr (To_Address (Mem)).all := Val; + end Write_U8; + + function Read_U8 (Mem : Memory_Ptr) return Ghdl_U8 is + begin + return To_U8_Ptr (To_Address (Mem)).all; + end Read_U8; + + procedure Write_I32 (Mem : Memory_Ptr; Val : Ghdl_I32) + is + V : Ghdl_I32; + for V'Address use To_Address (Mem); + pragma Import (Ada, V); + begin + V := Val; + end Write_I32; + + function Read_I32 (Mem : Memory_Ptr) return Ghdl_I32 + is + V : Ghdl_I32; + for V'Address use To_Address (Mem); + pragma Import (Ada, V); + begin + return V; + end Read_I32; + + procedure Write_U32 (Mem : Memory_Ptr; Val : Ghdl_U32) + is + V : Ghdl_U32; + for V'Address use To_Address (Mem); + pragma Import (Ada, V); + begin + V := Val; + end Write_U32; + + function Read_U32 (Mem : Memory_Ptr) return Ghdl_U32 + is + V : Ghdl_U32; + for V'Address use To_Address (Mem); + pragma Import (Ada, V); + begin + return V; + end Read_U32; + + procedure Write_I64 (Mem : Memory_Ptr; Val : Ghdl_I64) + is + V : Ghdl_I64; + for V'Address use To_Address (Mem); + pragma Import (Ada, V); + begin + V := Val; + end Write_I64; + + function Read_I64 (Mem : Memory_Ptr) return Ghdl_I64 + is + V : Ghdl_I64; + for V'Address use To_Address (Mem); + pragma Import (Ada, V); + begin + return V; + end Read_I64; + + procedure Write_Fp64 (Mem : Memory_Ptr; Val : Fp64) + is + V : Fp64; + for V'Address use To_Address (Mem); + pragma Import (Ada, V); + begin + V := Val; + end Write_Fp64; + + function Read_Fp64 (Mem : Memory_Ptr) return Fp64 + is + V : Fp64; + for V'Address use To_Address (Mem); + pragma Import (Ada, V); + begin + return V; + end Read_Fp64; + +end Elab.Memtype; |