blob: 9aafed92ada175929edd3de3d5522cef1e1acbf9 [file] [log] [blame]
Nico Huber5e9b1b52016-10-08 22:09:33 +02001--
2-- Copyright (C) 2016 secunet Security Networks AG
3--
4-- This program is free software; you can redistribute it and/or modify
5-- it under the terms of the GNU General Public License as published by
6-- the Free Software Foundation; version 2 of the License.
7--
8-- This program is distributed in the hope that it will be useful,
9-- but WITHOUT ANY WARRANTY; without even the implied warranty of
10-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11-- GNU General Public License for more details.
12--
13
14with HW.Sub_Regs;
15with HW.MMIO_Range;
16
17use type HW.Word64;
18
19generic
20 with package Range_P is new MMIO_Range (<>);
21 Byte_Offset_O : Natural := 0;
22
23 with package Subs_P is new Sub_Regs (<>);
24 Regs : Subs_P.Array_T;
25
26package HW.MMIO_Regs
27is
28
29 Byte_Offset : Natural := Byte_Offset_O;
30
31 ----------------------------------------------------------------------------
32
33 procedure Read (Value : out Word8; Idx : Subs_P.Index_T)
34 with
35 Pre => ((Byte_Offset + Regs (Idx).Byte_Offset) /
36 (Range_P.Element_T'Size / 8)) >= Integer (Range_P.Index_T'First) and
37 ((Byte_Offset + Regs (Idx).Byte_Offset) /
38 (Range_P.Element_T'Size / 8)) <= Integer (Range_P.Index_T'Last) and
39 Range_P.Element_T'Size <= Word64'Size and
40 Regs (Idx).MSB < Range_P.Element_T'Size and
41 Regs (Idx).MSB >= Regs (Idx).LSB and
42 Regs (Idx).MSB - Regs (Idx).LSB + 1 <= Word8'Size;
43
44 procedure Read (Value : out Word16; Idx : Subs_P.Index_T)
45 with
46 Pre => ((Byte_Offset + Regs (Idx).Byte_Offset) /
47 (Range_P.Element_T'Size / 8)) >= Integer (Range_P.Index_T'First) and
48 ((Byte_Offset + Regs (Idx).Byte_Offset) /
49 (Range_P.Element_T'Size / 8)) <= Integer (Range_P.Index_T'Last) and
50 Range_P.Element_T'Size <= Word64'Size and
51 Regs (Idx).MSB < Range_P.Element_T'Size and
52 Regs (Idx).MSB >= Regs (Idx).LSB and
53 Regs (Idx).MSB - Regs (Idx).LSB + 1 <= Word16'Size;
54
55 procedure Read (Value : out Word32; Idx : Subs_P.Index_T)
56 with
57 Pre => ((Byte_Offset + Regs (Idx).Byte_Offset) /
58 (Range_P.Element_T'Size / 8)) >= Integer (Range_P.Index_T'First) and
59 ((Byte_Offset + Regs (Idx).Byte_Offset) /
60 (Range_P.Element_T'Size / 8)) <= Integer (Range_P.Index_T'Last) and
61 Range_P.Element_T'Size <= Word64'Size and
62 Regs (Idx).MSB < Range_P.Element_T'Size and
63 Regs (Idx).MSB >= Regs (Idx).LSB and
64 Regs (Idx).MSB - Regs (Idx).LSB + 1 <= Word32'Size;
65
66 procedure Read (Value : out Word64; Idx : Subs_P.Index_T)
67 with
68 Pre => ((Byte_Offset + Regs (Idx).Byte_Offset) /
69 (Range_P.Element_T'Size / 8)) >= Integer (Range_P.Index_T'First) and
70 ((Byte_Offset + Regs (Idx).Byte_Offset) /
71 (Range_P.Element_T'Size / 8)) <= Integer (Range_P.Index_T'Last) and
72 Range_P.Element_T'Size <= Word64'Size and
73 Regs (Idx).MSB < Range_P.Element_T'Size and
74 Regs (Idx).MSB >= Regs (Idx).LSB and
75 Regs (Idx).MSB - Regs (Idx).LSB + 1 <= Word64'Size;
76
77 ----------------------------------------------------------------------------
78
79 procedure Write (Idx : Subs_P.Index_T; Value : Word8)
80 with
81 Pre => ((Byte_Offset + Regs (Idx).Byte_Offset) /
82 (Range_P.Element_T'Size / 8)) >= Integer (Range_P.Index_T'First) and
83 ((Byte_Offset + Regs (Idx).Byte_Offset) /
84 (Range_P.Element_T'Size / 8)) <= Integer (Range_P.Index_T'Last) and
85 Range_P.Element_T'Size <= Word64'Size and
86 Regs (Idx).MSB < Range_P.Element_T'Size and
87 Regs (Idx).MSB >= Regs (Idx).LSB and
88 Regs (Idx).MSB - Regs (Idx).LSB + 1 <= Value'Size and
89 Word64 (Value) < Word64 (2 ** (Regs (Idx).MSB + 1 - Regs (Idx).LSB));
90
91 procedure Write (Idx : Subs_P.Index_T; Value : Word16)
92 with
93 Pre => ((Byte_Offset + Regs (Idx).Byte_Offset) /
94 (Range_P.Element_T'Size / 8)) >= Integer (Range_P.Index_T'First) and
95 ((Byte_Offset + Regs (Idx).Byte_Offset) /
96 (Range_P.Element_T'Size / 8)) <= Integer (Range_P.Index_T'Last) and
97 Range_P.Element_T'Size <= Word64'Size and
98 Regs (Idx).MSB < Range_P.Element_T'Size and
99 Regs (Idx).MSB >= Regs (Idx).LSB and
100 Regs (Idx).MSB - Regs (Idx).LSB + 1 <= Value'Size and
101 Word64 (Value) < Word64 (2 ** (Regs (Idx).MSB + 1 - Regs (Idx).LSB));
102
103 procedure Write (Idx : Subs_P.Index_T; Value : Word32)
104 with
105 Pre => ((Byte_Offset + Regs (Idx).Byte_Offset) /
106 (Range_P.Element_T'Size / 8)) >= Integer (Range_P.Index_T'First) and
107 ((Byte_Offset + Regs (Idx).Byte_Offset) /
108 (Range_P.Element_T'Size / 8)) <= Integer (Range_P.Index_T'Last) and
109 Range_P.Element_T'Size <= Word64'Size and
110 Regs (Idx).MSB < Range_P.Element_T'Size and
111 Regs (Idx).MSB >= Regs (Idx).LSB and
112 Regs (Idx).MSB - Regs (Idx).LSB + 1 <= Value'Size and
113 Word64 (Value) < Word64 (2 ** (Regs (Idx).MSB + 1 - Regs (Idx).LSB));
114
115 procedure Write (Idx : Subs_P.Index_T; Value : Word64)
116 with
117 Pre => ((Byte_Offset + Regs (Idx).Byte_Offset) /
118 (Range_P.Element_T'Size / 8)) >= Integer (Range_P.Index_T'First) and
119 ((Byte_Offset + Regs (Idx).Byte_Offset) /
120 (Range_P.Element_T'Size / 8)) <= Integer (Range_P.Index_T'Last) and
121 Range_P.Element_T'Size <= Word64'Size and
122 Regs (Idx).MSB < Range_P.Element_T'Size and
123 Regs (Idx).MSB >= Regs (Idx).LSB and
124 Regs (Idx).MSB - Regs (Idx).LSB + 1 <= Value'Size and
125 Word64 (Value) < Word64 (2 ** (Regs (Idx).MSB + 1 - Regs (Idx).LSB));
126
127end HW.MMIO_Regs;