diff options
Diffstat (limited to 'testsuite/vests/vhdl-93/ashenden/compliant/ch_19_join-b.vhd')
-rw-r--r-- | testsuite/vests/vhdl-93/ashenden/compliant/ch_19_join-b.vhd | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/testsuite/vests/vhdl-93/ashenden/compliant/ch_19_join-b.vhd b/testsuite/vests/vhdl-93/ashenden/compliant/ch_19_join-b.vhd new file mode 100644 index 000000000..cef314e05 --- /dev/null +++ b/testsuite/vests/vhdl-93/ashenden/compliant/ch_19_join-b.vhd @@ -0,0 +1,139 @@ + +-- Copyright (C) 1996 Morgan Kaufmann Publishers, Inc + +-- This file is part of VESTs (Vhdl tESTs). + +-- VESTs 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. + +-- VESTs 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 VESTs; if not, write to the Free Software Foundation, +-- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +-- --------------------------------------------------------------------- +-- +-- $Id: ch_19_join-b.vhd,v 1.3 2001-10-26 16:29:36 paw Exp $ +-- $Revision: 1.3 $ +-- +-- --------------------------------------------------------------------- + +library qsim; + +architecture behavior of join is + +begin + + joiner : process + + use qsim.token_fifo_adt.all; + + variable source : positive range in_arc'range; + variable token_fifo : fifo_type := new_fifo; + variable current_fifo_size : natural := 0; + variable head_token : token_type; + variable number_of_tokens_joined : natural := 0; + type counter_array is array (positive range in_arc'range) of natural; + variable number_joined_from_source : counter_array := (others => 0); + + use std.textio.all; + file info_file : text; + variable L : line; + +-- Modeltech bug mt043 workaround + variable in_arc_last_value : arc_vector(in_arc'range) := in_arc; +-- + + procedure write_summary is + begin + write(L, string'("Summary information for join ")); + write(L, name); + write(L, string'(" up to time ")); + write(L, now, unit => time_unit); + writeline(info_file, L); + write(L, string'(" Number of tokens joined = ")); + write(L, natural(number_of_tokens_joined)); + writeline(info_file, L); + for source in in_arc'range loop + write(L, string'(" Number from input(")); + write(L, source); + write(L, string'(") = ")); + write(L, natural(number_joined_from_source(source))); + write(L, string'(" (")); + write(L, real(number_joined_from_source(source)) + / real(number_of_tokens_joined), + digits => 4); + write(L, ')'); + writeline(info_file, L); + end loop; + writeline(info_file, L); + end write_summary; + + procedure write_trace is + begin + write(L, string'("Join ")); + write(L, name); + write(L, string'(": at ")); + write(L, now, unit => time_unit); + write(L, string'(" joined from input ")); + write(L, source); + write(L, ' '); + write(L, in_arc(source).token, time_unit); + writeline(info_file, L); + end write_trace; + + procedure accept_new_tokens is + begin + for index in 1 to in_arc'length loop +-- Modeltech bug mt043 workaround +-- if in_arc(index).transaction /= in_arc'last_value(index).transaction then + if in_arc(index).transaction /= in_arc_last_value(index).transaction then +-- + source := index; + insert(token_fifo, in_arc(source).token); + current_fifo_size := current_fifo_size + 1; + number_of_tokens_joined := number_of_tokens_joined + 1; + number_joined_from_source(source) := number_joined_from_source(source) + 1; + if info_detail = trace then + write_trace; + end if; + end if; + end loop; +-- Modeltech bug mt043 workaround + in_arc_last_value := in_arc; +-- + end procedure accept_new_tokens; + + begin + file_open(info_file, info_file_name, write_mode); + loop + wait on info_detail'transaction, in_arc; + if info_detail'active and info_detail = summary then + write_summary; + end if; + if in_arc'event then + accept_new_tokens; + while current_fifo_size > 0 loop + remove(token_fifo, head_token); + current_fifo_size := current_fifo_size - 1; + out_arc <= arc_type'( transaction => not out_arc.transaction'driving_value, + token => head_token ); + wait for 0 fs; -- delta delay before next output token + if info_detail'active and info_detail = summary then + write_summary; + end if; + if in_arc'event then + accept_new_tokens; + end if; + end loop; + end if; + end loop; + end process joiner; + +end behavior; |