Skip to content

Commit b6b862d

Browse files
committed
Merge branch 'master' into develop
2 parents 7737b30 + 431d1b8 commit b6b862d

File tree

1 file changed

+68
-8
lines changed

1 file changed

+68
-8
lines changed

hdl/psi_common_math_pkg.vhd

Lines changed: 68 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ use ieee.std_logic_1164.all;
1212
use ieee.numeric_std.all;
1313
use ieee.math_real.all;
1414

15-
library std;
16-
use std.textio.all;
17-
1815
library work;
1916
use work.psi_common_array_pkg.all;
2017

@@ -400,12 +397,75 @@ package body psi_common_math_pkg is
400397

401398
-- convert string to real
402399
function from_str(input : string) return real is
403-
variable line_v : line := new string'(input);
404-
variable v : real;
400+
constant Nbsp_c : character := character'val(160);
401+
variable Idx_v : integer := input'low;
402+
variable IsNeg_v : boolean := false;
403+
variable ValInt_v : integer := 0;
404+
variable ValFrac_v : real := 0.0;
405+
variable FracDigits_v : integer := 0;
406+
variable Exp_v : integer := 0;
407+
variable ExpNeg_v : boolean := false;
408+
variable ValAbs_v : real := 0.0;
405409
begin
406-
read(line_v, v);
407-
deallocate(line_v);
408-
return v;
410+
-- skip leading white-spaces (space, non-breaking space or horizontal tab)
411+
while (Idx_v <= input'high) and (input(Idx_v) = ' ' or input(Idx_v) = Nbsp_c or input(Idx_v) = HT) loop
412+
Idx_v := Idx_v + 1;
413+
end loop;
414+
415+
-- Check sign
416+
if (Idx_v <= input'high) and ((input(Idx_v) = '-') or (input(Idx_v) = '+')) then
417+
IsNeg_v := (input(Idx_v) = '-');
418+
Idx_v := Idx_v + 1;
419+
end if;
420+
421+
-- Parse Integer
422+
while (Idx_v <= input'high) and (input(Idx_v) <= '9') and (input(Idx_v) >= '0') loop
423+
ValInt_v := ValInt_v*10 + (character'pos(input(Idx_v))-character'pos('0'));
424+
Idx_v := Idx_v + 1;
425+
end loop;
426+
427+
-- Check decimal point
428+
if (Idx_v <= input'high) then
429+
if input(Idx_v) = '.' then
430+
Idx_v := Idx_v + 1;
431+
432+
-- Parse Fractional
433+
while (Idx_v <= input'high) and (input(Idx_v) <= '9') and (input(Idx_v) >= '0') loop
434+
ValFrac_v := ValFrac_v*10.0 + real((character'pos(input(Idx_v))-character'pos('0')));
435+
FracDigits_v := FracDigits_v + 1;
436+
Idx_v := Idx_v + 1;
437+
end loop;
438+
end if;
439+
end if;
440+
441+
-- Check exponent
442+
if (Idx_v <= input'high) then
443+
if (input(Idx_v) = 'E') or (input(Idx_v) = 'e') then
444+
Idx_v := Idx_v + 1;
445+
-- Check sign
446+
if (Idx_v <= input'high) and ((input(Idx_v) = '-') or (input(Idx_v) = '+')) then
447+
ExpNeg_v := (input(Idx_v) = '-');
448+
Idx_v := Idx_v + 1;
449+
end if;
450+
451+
-- Parse Integer
452+
while (Idx_v <= input'high) and (input(Idx_v) <= '9') and (input(Idx_v) >= '0') loop
453+
Exp_v := Exp_v*10 + (character'pos(input(Idx_v))-character'pos('0'));
454+
Idx_v := Idx_v + 1;
455+
end loop;
456+
if ExpNeg_v then
457+
Exp_v := -Exp_v;
458+
end if;
459+
end if;
460+
end if;
461+
462+
-- Return
463+
ValAbs_v := (real(ValInt_v)+ValFrac_v/10.0**real(FracDigits_v))*10.0**real(Exp_v);
464+
if IsNeg_v then
465+
return -ValAbs_v;
466+
else
467+
return ValAbs_v;
468+
end if;
409469
end function;
410470

411471
-- convert string to real array

0 commit comments

Comments
 (0)