1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
5 -- S Y S T E M . V A L U E _ U _ S P E C --
9 -- Copyright (C) 2022-2023, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception, --
20 -- version 3.1, as published by the Free Software Foundation. --
22 -- You should have received a copy of the GNU General Public License and --
23 -- a copy of the GCC Runtime Library Exception along with this program; --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
25 -- <http://www.gnu.org/licenses/>. --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
30 ------------------------------------------------------------------------------
32 -- This package contains the specification entities using for the formal
33 -- verification of the routines for scanning modular Unsigned values.
35 -- Preconditions in this unit are meant for analysis only, not for run-time
36 -- checking, so that the expected exceptions are raised. This is enforced by
37 -- setting the corresponding assertion policy to Ignore. Postconditions and
38 -- contract cases should not be executed at runtime as well, in order not to
39 -- slow down the execution of these functions.
41 pragma Assertion_Policy
(Pre
=> Ignore
,
43 Contract_Cases
=> Ignore
,
45 Subprogram_Variant
=> Ignore
);
47 with System
.Val_Util
; use System
.Val_Util
;
53 package System
.Value_U_Spec
with
56 Annotate
=> (GNATprove
, Always_Return
)
60 type Uns_Option
(Overflow
: Boolean := False) is record
69 function Wrap_Option
(Value
: Uns
) return Uns_Option
is
70 (Overflow
=> False, Value
=> Value
);
72 function Only_Decimal_Ghost
77 (for all J
in From
.. To
=> Str
(J
) in '0' .. '9')
79 Pre
=> From
> To
or else (From
>= Str
'First and then To
<= Str
'Last);
80 -- Ghost function that returns True if S has only decimal characters
81 -- from index From to index To.
83 function Only_Hexa_Ghost
(Str
: String; From
, To
: Integer) return Boolean
85 (for all J
in From
.. To
=>
86 Str
(J
) in '0' .. '9' |
'a' .. 'f' |
'A' .. 'F' |
'_')
88 Pre
=> From
> To
or else (From
>= Str
'First and then To
<= Str
'Last);
89 -- Ghost function that returns True if S has only hexadecimal characters
90 -- from index From to index To.
92 function Last_Hexa_Ghost
(Str
: String) return Positive
95 and then Str
(Str
'First) in '0' .. '9' |
'a' .. 'f' |
'A' .. 'F',
96 Post
=> Last_Hexa_Ghost
'Result in Str
'Range
97 and then (if Last_Hexa_Ghost
'Result < Str
'Last then
98 Str
(Last_Hexa_Ghost
'Result + 1) not in
99 '0' .. '9' |
'a' .. 'f' |
'A' .. 'F' |
'_')
100 and then Only_Hexa_Ghost
(Str
, Str
'First, Last_Hexa_Ghost
'Result);
101 -- Ghost function that returns the index of the last character in S that
102 -- is either an hexadecimal digit or an underscore, which necessarily
103 -- exists given the precondition on Str.
105 function Is_Based_Format_Ghost
(Str
: String) return Boolean
108 and then Str
(Str
'First) in '0' .. '9' |
'a' .. 'f' |
'A' .. 'F'
111 L
: constant Positive := Last_Hexa_Ghost
(Str
);
114 and then (for all J
in Str
'First .. L
=>
115 (if Str
(J
) = '_' then Str
(J
+ 1) /= '_'))));
116 -- Ghost function that determines if Str has the correct format for a
117 -- based number, consisting in a sequence of hexadecimal digits possibly
118 -- separated by single underscores. It may be followed by other characters.
120 function Hexa_To_Unsigned_Ghost
(X
: Character) return Uns
is
122 when '0' .. '9' => Character'Pos (X
) - Character'Pos ('0'),
123 when 'a' .. 'f' => Character'Pos (X
) - Character'Pos ('a') + 10,
124 when 'A' .. 'F' => Character'Pos (X
) - Character'Pos ('A') + 10,
125 when others => raise Program_Error
)
127 Pre
=> X
in '0' .. '9' |
'a' .. 'f' |
'A' .. 'F';
128 -- Ghost function that computes the value corresponding to an hexadecimal
131 function Scan_Overflows_Ghost
134 Acc
: Uns
) return Boolean
137 or else Acc
> Uns
'Last / Base
138 or else Uns
'Last - Digit
< Base
* Acc
);
139 -- Ghost function which returns True if Digit + Base * Acc overflows or
140 -- Digit is greater than Base, as this is used by the algorithm for the
143 function Scan_Based_Number_Ghost
147 Acc
: Uns
:= 0) return Uns_Option
149 Subprogram_Variant
=> (Increases
=> From
),
150 Pre
=> Str
'Last /= Positive'Last
152 (From
> To
or else (From
>= Str
'First and then To
<= Str
'Last))
153 and then Only_Hexa_Ghost
(Str
, From
, To
);
154 -- Ghost function that recursively computes the based number in Str,
155 -- assuming Acc has been scanned already and scanning continues at index
158 -- Lemmas unfolding the recursive definition of Scan_Based_Number_Ghost
160 procedure Lemma_Scan_Based_Number_Ghost_Base
167 Pre
=> Str
'Last /= Positive'Last
169 (From
> To
or else (From
>= Str
'First and then To
<= Str
'Last))
170 and then Only_Hexa_Ghost
(Str
, From
, To
),
173 then Scan_Based_Number_Ghost
(Str
, From
, To
, Base
, Acc
) =
174 (Overflow
=> False, Value
=> Acc
));
175 -- Base case: Scan_Based_Number_Ghost returns Acc if From is bigger than To
177 procedure Lemma_Scan_Based_Number_Ghost_Underscore
184 Pre
=> Str
'Last /= Positive'Last
186 (From
> To
or else (From
>= Str
'First and then To
<= Str
'Last))
187 and then Only_Hexa_Ghost
(Str
, From
, To
),
189 (if From
<= To
and then Str
(From
) = '_'
190 then Scan_Based_Number_Ghost
(Str
, From
, To
, Base
, Acc
) =
191 Scan_Based_Number_Ghost
(Str
, From
+ 1, To
, Base
, Acc
));
192 -- Underscore case: underscores are ignored while scanning
194 procedure Lemma_Scan_Based_Number_Ghost_Overflow
201 Pre
=> Str
'Last /= Positive'Last
203 (From
> To
or else (From
>= Str
'First and then To
<= Str
'Last))
204 and then Only_Hexa_Ghost
(Str
, From
, To
),
207 and then Str
(From
) /= '_'
208 and then Scan_Overflows_Ghost
209 (Hexa_To_Unsigned_Ghost
(Str
(From
)), Base
, Acc
)
210 then Scan_Based_Number_Ghost
(Str
, From
, To
, Base
, Acc
) =
212 -- Overflow case: scanning a digit which causes an overflow
214 procedure Lemma_Scan_Based_Number_Ghost_Step
221 Pre
=> Str
'Last /= Positive'Last
223 (From
> To
or else (From
>= Str
'First and then To
<= Str
'Last))
224 and then Only_Hexa_Ghost
(Str
, From
, To
),
227 and then Str
(From
) /= '_'
228 and then not Scan_Overflows_Ghost
229 (Hexa_To_Unsigned_Ghost
(Str
(From
)), Base
, Acc
)
230 then Scan_Based_Number_Ghost
(Str
, From
, To
, Base
, Acc
) =
231 Scan_Based_Number_Ghost
232 (Str
, From
+ 1, To
, Base
,
233 Base
* Acc
+ Hexa_To_Unsigned_Ghost
(Str
(From
))));
234 -- Normal case: scanning a digit without overflows
236 function Exponent_Unsigned_Ghost
239 Base
: Uns
:= 10) return Uns_Option
241 Subprogram_Variant
=> (Decreases
=> Exp
);
242 -- Ghost function that recursively computes Value * Base ** Exp
244 -- Lemmas unfolding the recursive definition of Exponent_Unsigned_Ghost
246 procedure Lemma_Exponent_Unsigned_Ghost_Base
252 (if Exp
= 0 or Value
= 0
253 then Exponent_Unsigned_Ghost
(Value
, Exp
, Base
) =
254 (Overflow
=> False, Value
=> Value
));
255 -- Base case: Exponent_Unsigned_Ghost returns 0 if Value or Exp is 0
257 procedure Lemma_Exponent_Unsigned_Ghost_Overflow
265 and then Scan_Overflows_Ghost
(0, Base
, Value
)
266 then Exponent_Unsigned_Ghost
(Value
, Exp
, Base
) = (Overflow
=> True));
267 -- Overflow case: the next multiplication overflows
269 procedure Lemma_Exponent_Unsigned_Ghost_Step
277 and then not Scan_Overflows_Ghost
(0, Base
, Value
)
278 then Exponent_Unsigned_Ghost
(Value
, Exp
, Base
) =
279 Exponent_Unsigned_Ghost
(Value
* Base
, Exp
- 1, Base
));
280 -- Normal case: exponentiation without overflows
282 function Is_Raw_Unsigned_Format_Ghost
(Str
: String) return Boolean is
283 (Is_Natural_Format_Ghost
(Str
)
286 Last_Num_Init
: constant Integer := Last_Number_Ghost
(Str
);
287 Starts_As_Based
: constant Boolean :=
288 Last_Num_Init
< Str
'Last - 1
289 and then Str
(Last_Num_Init
+ 1) in '#' |
':'
290 and then Str
(Last_Num_Init
+ 2) in
291 '0' .. '9' |
'a' .. 'f' |
'A' .. 'F';
292 Last_Num_Based
: constant Integer :=
294 then Last_Hexa_Ghost
(Str
(Last_Num_Init
+ 2 .. Str
'Last))
296 Is_Based
: constant Boolean :=
298 and then Last_Num_Based
< Str
'Last
299 and then Str
(Last_Num_Based
+ 1) = Str
(Last_Num_Init
+ 1);
300 First_Exp
: constant Integer :=
301 (if Is_Based
then Last_Num_Based
+ 2 else Last_Num_Init
+ 1);
303 (if Starts_As_Based
then
304 Is_Based_Format_Ghost
(Str
(Last_Num_Init
+ 2 .. Str
'Last))
305 and then Last_Num_Based
< Str
'Last)
306 and then Is_Opt_Exponent_Format_Ghost
307 (Str
(First_Exp
.. Str
'Last))))
309 Pre
=> Str
'Last /= Positive'Last;
310 -- Ghost function that determines if Str has the correct format for an
311 -- unsigned number without a sign character.
312 -- It is a natural number in base 10, optionally followed by a based
313 -- number surrounded by delimiters # or :, optionally followed by an
316 type Split_Value_Ghost
is record
322 function Scan_Split_No_Overflow_Ghost
328 Last_Num_Init
: constant Integer :=
329 Last_Number_Ghost
(Str
(From
.. To
));
330 Init_Val
: constant Uns_Option
:=
331 Scan_Based_Number_Ghost
(Str
, From
, Last_Num_Init
);
332 Starts_As_Based
: constant Boolean :=
333 Last_Num_Init
< To
- 1
334 and then Str
(Last_Num_Init
+ 1) in '#' |
':'
335 and then Str
(Last_Num_Init
+ 2) in
336 '0' .. '9' |
'a' .. 'f' |
'A' .. 'F';
337 Last_Num_Based
: constant Integer :=
339 then Last_Hexa_Ghost
(Str
(Last_Num_Init
+ 2 .. To
))
341 Based_Val
: constant Uns_Option
:=
342 (if Starts_As_Based
and then not Init_Val
.Overflow
343 then Scan_Based_Number_Ghost
344 (Str
, Last_Num_Init
+ 2, Last_Num_Based
, Init_Val
.Value
)
347 not Init_Val
.Overflow
349 (Last_Num_Init
>= To
- 1
350 or else Str
(Last_Num_Init
+ 1) not in '#' |
':'
351 or else Init_Val
.Value
in 2 .. 16)
354 or else not Based_Val
.Overflow
))
356 Pre
=> Str
'Last /= Positive'Last
357 and then From
in Str
'Range
358 and then To
in From
.. Str
'Last
359 and then Str
(From
) in '0' .. '9';
360 -- Ghost function that determines if an overflow might occur while scanning
361 -- the representation of an unsigned number. The computation overflows if
363 -- * The computation of the decimal part overflows,
364 -- * The decimal part is followed by a valid delimiter for a based
365 -- part, and the number corresponding to the base is not a valid base,
367 -- * The computation of the based part overflows.
369 pragma Warnings
(Off
, "constant * is not referenced");
370 function Scan_Split_Value_Ghost
373 return Split_Value_Ghost
376 Last_Num_Init
: constant Integer :=
377 Last_Number_Ghost
(Str
(From
.. To
));
378 Init_Val
: constant Uns_Option
:=
379 Scan_Based_Number_Ghost
(Str
, From
, Last_Num_Init
);
380 Starts_As_Based
: constant Boolean :=
381 Last_Num_Init
< To
- 1
382 and then Str
(Last_Num_Init
+ 1) in '#' |
':'
383 and then Str
(Last_Num_Init
+ 2) in
384 '0' .. '9' |
'a' .. 'f' |
'A' .. 'F';
385 Last_Num_Based
: constant Integer :=
387 then Last_Hexa_Ghost
(Str
(Last_Num_Init
+ 2 .. To
))
389 Is_Based
: constant Boolean :=
391 and then Last_Num_Based
< To
392 and then Str
(Last_Num_Based
+ 1) = Str
(Last_Num_Init
+ 1);
393 Based_Val
: constant Uns_Option
:=
394 (if Starts_As_Based
and then not Init_Val
.Overflow
395 then Scan_Based_Number_Ghost
396 (Str
, Last_Num_Init
+ 2, Last_Num_Based
, Init_Val
.Value
)
398 First_Exp
: constant Integer :=
399 (if Is_Based
then Last_Num_Based
+ 2 else Last_Num_Init
+ 1);
400 Expon
: constant Natural :=
401 (if Starts_As_Exponent_Format_Ghost
(Str
(First_Exp
.. To
))
402 then Scan_Exponent_Ghost
(Str
(First_Exp
.. To
))
404 Base
: constant Uns
:=
405 (if Is_Based
then Init_Val
.Value
else 10);
406 Value
: constant Uns
:=
407 (if Is_Based
then Based_Val
.Value
else Init_Val
.Value
);
409 (Value
=> Value
, Base
=> Base
, Expon
=> Expon
))
411 Pre
=> Str
'Last /= Positive'Last
412 and then From
in Str
'Range
413 and then To
in From
.. Str
'Last
414 and then Str
(From
) in '0' .. '9'
415 and then Scan_Split_No_Overflow_Ghost
(Str
, From
, To
);
416 -- Ghost function that scans an unsigned number without a sign character
417 -- and return a record containing the values scanned for its value, its
418 -- base, and its exponent.
419 pragma Warnings
(On
, "constant * is not referenced");
421 function Raw_Unsigned_No_Overflow_Ghost
426 (Scan_Split_No_Overflow_Ghost
(Str
, From
, To
)
429 Val
: constant Split_Value_Ghost
:= Scan_Split_Value_Ghost
432 not Exponent_Unsigned_Ghost
433 (Val
.Value
, Val
.Expon
, Val
.Base
).Overflow
))
435 Pre
=> Str
'Last /= Positive'Last
436 and then From
in Str
'Range
437 and then To
in From
.. Str
'Last
438 and then Str
(From
) in '0' .. '9';
439 -- Ghost function that determines if the computation of the unsigned number
440 -- represented by Str will overflow. The computation overflows if either:
441 -- * The scan of the string overflows, or
442 -- * The computation of the exponentiation overflows.
444 function Scan_Raw_Unsigned_Ghost
450 Val
: constant Split_Value_Ghost
:= Scan_Split_Value_Ghost
453 Exponent_Unsigned_Ghost
(Val
.Value
, Val
.Expon
, Val
.Base
).Value
)
455 Pre
=> Str
'Last /= Positive'Last
456 and then From
in Str
'Range
457 and then To
in From
.. Str
'Last
458 and then Str
(From
) in '0' .. '9'
459 and then Raw_Unsigned_No_Overflow_Ghost
(Str
, From
, To
);
460 -- Ghost function that scans an unsigned number without a sign character
462 function Raw_Unsigned_Last_Ghost
468 Last_Num_Init
: constant Integer :=
469 Last_Number_Ghost
(Str
(From
.. To
));
470 Starts_As_Based
: constant Boolean :=
471 Last_Num_Init
< To
- 1
472 and then Str
(Last_Num_Init
+ 1) in '#' |
':'
473 and then Str
(Last_Num_Init
+ 2) in
474 '0' .. '9' |
'a' .. 'f' |
'A' .. 'F';
475 Last_Num_Based
: constant Integer :=
477 then Last_Hexa_Ghost
(Str
(Last_Num_Init
+ 2 .. To
))
479 Is_Based
: constant Boolean :=
481 and then Last_Num_Based
< To
482 and then Str
(Last_Num_Based
+ 1) = Str
(Last_Num_Init
+ 1);
483 First_Exp
: constant Integer :=
484 (if Is_Based
then Last_Num_Based
+ 2 else Last_Num_Init
+ 1);
486 (if not Starts_As_Exponent_Format_Ghost
(Str
(First_Exp
.. To
))
488 elsif Str
(First_Exp
+ 1) in '-' |
'+' then
489 Last_Number_Ghost
(Str
(First_Exp
+ 2 .. To
)) + 1
490 else Last_Number_Ghost
(Str
(First_Exp
+ 1 .. To
)) + 1))
492 Pre
=> Str
'Last /= Positive'Last
493 and then From
in Str
'Range
494 and then To
in From
.. Str
'Last
495 and then Str
(From
) in '0' .. '9';
496 -- Ghost function that returns the position of the cursor once an unsigned
497 -- number has been seen.
499 function Slide_To_1
(Str
: String) return String
502 Only_Space_Ghost
(Str
, Str
'First, Str
'Last) =
503 (for all J
in Str
'First .. Str
'Last =>
504 Slide_To_1
'Result (J
- Str
'First + 1) = ' ');
505 -- Slides Str so that it starts at 1
507 function Slide_If_Necessary
(Str
: String) return String is
508 (if Str
'Last = Positive'Last then Slide_To_1
(Str
) else Str
);
509 -- If Str'Last = Positive'Last then slides Str so that it starts at 1
511 function Is_Unsigned_Ghost
(Str
: String) return Boolean is
513 Non_Blank
: constant Positive := First_Non_Space_Ghost
514 (Str
, Str
'First, Str
'Last);
515 Fst_Num
: constant Positive :=
516 (if Str
(Non_Blank
) = '+' then Non_Blank
+ 1 else Non_Blank
);
518 Is_Raw_Unsigned_Format_Ghost
(Str
(Fst_Num
.. Str
'Last))
519 and then Raw_Unsigned_No_Overflow_Ghost
(Str
, Fst_Num
, Str
'Last)
520 and then Only_Space_Ghost
521 (Str
, Raw_Unsigned_Last_Ghost
(Str
, Fst_Num
, Str
'Last), Str
'Last))
523 Pre
=> not Only_Space_Ghost
(Str
, Str
'First, Str
'Last)
524 and then Str
'Last /= Positive'Last;
525 -- Ghost function that determines if Str has the correct format for an
526 -- unsigned number, consisting in some blank characters, an optional
527 -- + sign, a raw unsigned number which does not overflow and then some
528 -- more blank characters.
530 function Is_Value_Unsigned_Ghost
(Str
: String; Val
: Uns
) return Boolean is
532 Non_Blank
: constant Positive := First_Non_Space_Ghost
533 (Str
, Str
'First, Str
'Last);
534 Fst_Num
: constant Positive :=
535 (if Str
(Non_Blank
) = '+' then Non_Blank
+ 1 else Non_Blank
);
537 Val
= Scan_Raw_Unsigned_Ghost
(Str
, Fst_Num
, Str
'Last))
539 Pre
=> not Only_Space_Ghost
(Str
, Str
'First, Str
'Last)
540 and then Str
'Last /= Positive'Last
541 and then Is_Unsigned_Ghost
(Str
);
542 -- Ghost function that returns True if Val is the value corresponding to
543 -- the unsigned number represented by Str.
545 procedure Prove_Scan_Based_Number_Ghost_Eq
546 (Str1
, Str2
: String;
551 Subprogram_Variant
=> (Increases
=> From
),
552 Pre
=> Str1
'Last /= Positive'Last
553 and then Str2
'Last /= Positive'Last
555 (From
> To
or else (From
>= Str1
'First and then To
<= Str1
'Last))
557 (From
> To
or else (From
>= Str2
'First and then To
<= Str2
'Last))
558 and then Only_Hexa_Ghost
(Str1
, From
, To
)
559 and then (for all J
in From
.. To
=> Str1
(J
) = Str2
(J
)),
561 Scan_Based_Number_Ghost
(Str1
, From
, To
, Base
, Acc
)
562 = Scan_Based_Number_Ghost
(Str2
, From
, To
, Base
, Acc
);
563 -- Scan_Based_Number_Ghost returns the same value on two slices which are
566 procedure Prove_Scan_Only_Decimal_Ghost
570 Pre
=> Str
'Last /= Positive'Last
571 and then Str
'Length >= 2
572 and then Str
(Str
'First) = ' '
573 and then Only_Decimal_Ghost
(Str
, Str
'First + 1, Str
'Last)
574 and then Scan_Based_Number_Ghost
(Str
, Str
'First + 1, Str
'Last)
576 Post
=> Is_Unsigned_Ghost
(Slide_If_Necessary
(Str
))
578 Is_Value_Unsigned_Ghost
(Slide_If_Necessary
(Str
), Val
);
579 -- Ghost lemma used in the proof of 'Image implementation, to prove that
580 -- the result of Value_Unsigned on a decimal string is the same as the
581 -- result of Scan_Based_Number_Ghost.
583 -- Bundle Uns type with other types, constants and subprograms used in
584 -- ghost code, so that this package can be instantiated once and used
585 -- multiple times as generic formal for a given Int type.
587 package Uns_Params
is new System
.Val_Util
.Uns_Params
589 P_Uns_Option
=> Uns_Option
,
590 P_Wrap_Option
=> Wrap_Option
,
591 P_Hexa_To_Unsigned_Ghost
=> Hexa_To_Unsigned_Ghost
,
592 P_Scan_Overflows_Ghost
=> Scan_Overflows_Ghost
,
593 P_Is_Raw_Unsigned_Format_Ghost
=>
594 Is_Raw_Unsigned_Format_Ghost
,
595 P_Scan_Split_No_Overflow_Ghost
=>
596 Scan_Split_No_Overflow_Ghost
,
597 P_Raw_Unsigned_No_Overflow_Ghost
=>
598 Raw_Unsigned_No_Overflow_Ghost
,
599 P_Exponent_Unsigned_Ghost
=> Exponent_Unsigned_Ghost
,
600 P_Lemma_Exponent_Unsigned_Ghost_Base
=>
601 Lemma_Exponent_Unsigned_Ghost_Base
,
602 P_Lemma_Exponent_Unsigned_Ghost_Overflow
=>
603 Lemma_Exponent_Unsigned_Ghost_Overflow
,
604 P_Lemma_Exponent_Unsigned_Ghost_Step
=>
605 Lemma_Exponent_Unsigned_Ghost_Step
,
606 P_Scan_Raw_Unsigned_Ghost
=> Scan_Raw_Unsigned_Ghost
,
607 P_Lemma_Scan_Based_Number_Ghost_Base
=>
608 Lemma_Scan_Based_Number_Ghost_Base
,
609 P_Lemma_Scan_Based_Number_Ghost_Underscore
=>
610 Lemma_Scan_Based_Number_Ghost_Underscore
,
611 P_Lemma_Scan_Based_Number_Ghost_Overflow
=>
612 Lemma_Scan_Based_Number_Ghost_Overflow
,
613 P_Lemma_Scan_Based_Number_Ghost_Step
=>
614 Lemma_Scan_Based_Number_Ghost_Step
,
615 P_Raw_Unsigned_Last_Ghost
=> Raw_Unsigned_Last_Ghost
,
616 P_Only_Decimal_Ghost
=> Only_Decimal_Ghost
,
617 P_Scan_Based_Number_Ghost
=> Scan_Based_Number_Ghost
,
618 P_Is_Unsigned_Ghost
=>
620 P_Is_Value_Unsigned_Ghost
=>
621 Is_Value_Unsigned_Ghost
,
622 P_Prove_Scan_Only_Decimal_Ghost
=>
623 Prove_Scan_Only_Decimal_Ghost
,
624 P_Prove_Scan_Based_Number_Ghost_Eq
=>
625 Prove_Scan_Based_Number_Ghost_Eq
);
633 function Slide_To_1
(Str
: String) return String is
635 Res
: constant String (1 .. Str
'Length) := Str
;
639 end System
.Value_U_Spec
;