summaryrefslogtreecommitdiff
path: root/testsuite/gna/sr2940/GCD.vhd
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/gna/sr2940/GCD.vhd')
-rw-r--r--testsuite/gna/sr2940/GCD.vhd203
1 files changed, 203 insertions, 0 deletions
diff --git a/testsuite/gna/sr2940/GCD.vhd b/testsuite/gna/sr2940/GCD.vhd
new file mode 100644
index 0000000..509b721
--- /dev/null
+++ b/testsuite/gna/sr2940/GCD.vhd
@@ -0,0 +1,203 @@
+-- module GCD where
+--
+--
+-- $wmygcd::*Int# -> *Int# -> *Int#
+-- $wmygcd ww ww1 =
+-- let wild::GHC.Types.Bool = (GHC.Prim.==# ww ww1) in
+-- case wild of :: *Int#
+-- GHC.Types.False ->
+-- let wild1::GHC.Types.Bool = (GHC.Prim.<# ww ww1) in
+-- case wild1 of :: *Int#
+-- GHC.Types.False -> ($wmygcd (GHC.Prim.-# ww ww1) ww1)
+-- GHC.Types.True -> ($wmygcd ww (GHC.Prim.-# ww1 ww))
+-- GHC.Types.True -> ww
+--
+-- mygcd::GHC.Types.Int -> GHC.Types.Int -> GHC.Types.Int
+-- mygcd w w1 =
+-- let w2::GHC.Types.Int = w in
+-- case w2 of :: GHC.Types.Int
+-- GHC.Types.I# ww::*Int# ->
+-- let w3::GHC.Types.Int = w1 in
+-- case w3 of :: GHC.Types.Int
+-- GHC.Types.I# ww1::*Int# ->
+-- let ww2::*Int# = ($wmygcd ww ww1) in
+-- case ww2 of :: GHC.Types.Int DEFAULT -> (GHC.Types.I# ww2)
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+use work.\Prim\.all;
+
+package \GCD\ is
+end \GCD\;
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+use work.\Prim\.all;
+use work.\GCD\.all;
+
+entity \$wmygcd\ is
+ port (clk : in std_logic;
+ s1_call : in std_logic;
+ s1_ret : out std_logic;
+ s1_ww : in \Int#\;
+ s1_ww1 : in \Int#\;
+ res : out \Int#\);
+end entity;
+
+architecture rtl of \$wmygcd\ is
+ signal tail_call : std_logic;
+ signal tail_ww : \Int#\;
+ signal tail_ww1 : \Int#\;
+ signal core_call : std_logic;
+ signal core_ret : std_logic;
+ signal core_ww : \Int#\;
+ signal core_ww1 : \Int#\;
+ signal s1_act : std_logic;
+ signal s1_wait : std_logic;
+ signal s1_saved_ww : \Int#\;
+ signal s1_saved_ww1 : \Int#\;
+begin
+ process (core_call, core_ww, core_ww1)
+ variable wild : \GHC.Types.Bool\;
+ variable wild1 : \GHC.Types.Bool\;
+ variable ww : \Int#\;
+ variable ww1 : \Int#\;
+ begin
+ ww := core_ww;
+ ww1 := core_ww1;
+ wild := \GHC.Prim.==#\(ww, ww1);
+ if \is_GHC.Types.False\(wild) then
+ wild1 := \GHC.Prim.<#\(ww, ww1);
+ if \is_GHC.Types.False\(wild1) then
+ res <= \$wmygcd\(\GHC.Prim.-#\(ww, ww1), ww1);
+ elsif \is_GHC.Types.True\(wild1) then
+ res <= \$wmygcd\(ww, \GHC.Prim.-#\(ww1, ww));
+ end if;
+ elsif \is_GHC.Types.True\(wild) then res <= ww;
+ end if;
+ end process;
+
+ process (clk)
+ begin
+ if rising_edge(clk) then
+ core_call <= '0';
+ if s1_call = '1' then
+ s1_wait <= '1';
+ s1_saved_ww <= s1_ww;
+ s1_saved_ww1 <= s1_ww1;
+ end if;
+ if tail_call = '1' then
+ core_call <= '1';
+ core_ww <= tail_ww;
+ core_ww1 <= tail_ww1;
+ elsif core_ret = '1' or s1_act = '1' then
+ s1_act <= '0';
+ if s1_wait = '1' then
+ core_call <= '1';
+ s1_act <= '1';
+ s1_wait <= '0';
+ core_ww <= s1_saved_ww;
+ core_ww1 <= s1_saved_ww1;
+ elsif s1_call = '1' then
+ core_call <= '1';
+ s1_act <= '1';
+ s1_wait <= '0';
+ core_ww <= s1_ww;
+ core_ww1 <= s1_ww1;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ s1_ret <= core_ret and s1_act;
+
+end architecture;
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+use work.\Prim\.all;
+use work.\GCD\.all;
+
+entity mygcd is
+ port (clk : in std_logic;
+ s1_call : in std_logic;
+ s1_ret : out std_logic;
+ s1_w : in \GHC.Types.Int\;
+ s1_w1 : in \GHC.Types.Int\;
+ res : out \GHC.Types.Int\);
+end entity;
+
+architecture rtl of mygcd is
+ signal tail_call : std_logic;
+ signal tail_w : \GHC.Types.Int\;
+ signal tail_w1 : \GHC.Types.Int\;
+ signal core_call : std_logic;
+ signal core_ret : std_logic;
+ signal core_w : \GHC.Types.Int\;
+ signal core_w1 : \GHC.Types.Int\;
+ signal s1_act : std_logic;
+ signal s1_wait : std_logic;
+ signal s1_saved_w : \GHC.Types.Int\;
+ signal s1_saved_w1 : \GHC.Types.Int\;
+begin
+ process (core_call, core_w, core_w1)
+ variable w2 : \GHC.Types.Int\;
+ variable ww : \Int#\;
+ variable w3 : \GHC.Types.Int\;
+ variable ww1 : \Int#\;
+ variable ww2 : \Int#\;
+ variable w : \GHC.Types.Int\;
+ variable w1 : \GHC.Types.Int\;
+ begin
+ w := core_w;
+ w1 := core_w1;
+ w2 := w;
+ if \is_GHC.Types.I#\(w2) then
+ \expand_GHC.Types.I#\(w2, ww);
+ w3 := w1;
+ if \is_GHC.Types.I#\(w3) then
+ \expand_GHC.Types.I#\(w3, ww1);
+ ww2 := \$wmygcd\(ww, ww1);
+ res <= \GHC.Types.I#\(ww2);
+ end if;
+ end if;
+ end process;
+
+ process (clk)
+ begin
+ if rising_edge(clk) then
+ core_call <= '0';
+ if s1_call = '1' then
+ s1_wait <= '1';
+ s1_saved_w <= s1_w;
+ s1_saved_w1 <= s1_w1;
+ end if;
+ if tail_call = '1' then
+ core_call <= '1';
+ core_w <= tail_w;
+ core_w1 <= tail_w1;
+ elsif core_ret = '1' or s1_act = '1' then
+ s1_act <= '0';
+ if s1_wait = '1' then
+ core_call <= '1';
+ s1_act <= '1';
+ s1_wait <= '0';
+ core_w <= s1_saved_w;
+ core_w1 <= s1_saved_w1;
+ elsif s1_call = '1' then
+ core_call <= '1';
+ s1_act <= '1';
+ s1_wait <= '0';
+ core_w <= s1_w;
+ core_w1 <= s1_w1;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ s1_ret <= core_ret and s1_act;
+
+end architecture;
+