From baaf926db4d834493a008db09a1bf5219f330325 Mon Sep 17 00:00:00 2001 From: Eric Yu Date: Sat, 23 Dec 2023 02:54:34 -0800 Subject: [PATCH] first commit --- .gitignore | 19 + README.md | 3 + documents/README.md | 1 + src/hdl/README.md | 1 + .../bram_pulse_definition_sim_netlist.vhdl | 1127 ++ .../bram_pulseposition_sim_netlist.vhdl | 3540 ++++++ src/hdl/ip_gen/bram_waveform_sim_netlist.vhdl | 1509 +++ .../fifo_data_to_stream_sim_netlist.vhdl | 2207 ++++ .../modules/qlaser_dacs_pulse_channel.vhdl | 269 + src/hdl/pkg/iopakb.vhd | 9531 +++++++++++++++++ src/hdl/pkg/iopakp.vhd | 2596 +++++ src/hdl/pkg/qlaser_dac_dc_pkg.vhd | 30 + src/hdl/pkg/qlaser_pkg.vhd | 146 + .../sandbox/qlaser_dacs_pulse_channel.vhdl | 606 ++ .../sandbox/tb_cpubus_dacs_pulse_channel.vhdl | 395 + src/hdl/tb/tb_cpubus_dacs_pulse_channel.vhdl | 428 + src/python/README.md | 1 + tools/README.md | 1 + tools/build_src/build.tcl | 41 + tools/sim/README.md | 2 + tools/sim/compile.bat | 2 + tools/sim/compile.do | 8 + tools/sim/run.bat | 2 + tools/sim/run.do | 13 + tools/sim/waves_do/pp_rw_cpu.do | 34 + .../bram_pulse_definition.xci | 419 + .../bram_pulseposition/bram_pulseposition.xci | 119 + .../bram_waveform/bram_waveform.xci | 419 + .../fifo_data_to_stream.xci | 635 ++ tools/xilinx-zcu/pinout_zcu.xdc | 73 + tools/xilinx-zcu/qlaser_timing_zcu.xdc | 3 + tools/xilinx-zcu/set_usercode_zcu.xdc | 29 + tools/xilinx/README.md | 1 + tools/xilinx/build_project.tcl | 597 ++ tools/xilinx/build_ps1.tcl | 890 ++ tools/xilinx/clkpll.xci | 793 ++ tools/xilinx/pinout.xdc | 119 + tools/xilinx/ps1.bd | 838 ++ tools/xilinx/qlaser_timing.xdc | 3 + tools/xilinx/set_usercode.xdc | 28 + tools/xilinx/zcu102_Rev1.0_U1_09152016.xdc | 1059 ++ 41 files changed, 28537 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 documents/README.md create mode 100644 src/hdl/README.md create mode 100644 src/hdl/ip_gen/bram_pulse_definition_sim_netlist.vhdl create mode 100644 src/hdl/ip_gen/bram_pulseposition_sim_netlist.vhdl create mode 100644 src/hdl/ip_gen/bram_waveform_sim_netlist.vhdl create mode 100644 src/hdl/ip_gen/fifo_data_to_stream_sim_netlist.vhdl create mode 100644 src/hdl/modules/qlaser_dacs_pulse_channel.vhdl create mode 100644 src/hdl/pkg/iopakb.vhd create mode 100644 src/hdl/pkg/iopakp.vhd create mode 100644 src/hdl/pkg/qlaser_dac_dc_pkg.vhd create mode 100644 src/hdl/pkg/qlaser_pkg.vhd create mode 100644 src/hdl/sandbox/qlaser_dacs_pulse_channel.vhdl create mode 100644 src/hdl/sandbox/tb_cpubus_dacs_pulse_channel.vhdl create mode 100644 src/hdl/tb/tb_cpubus_dacs_pulse_channel.vhdl create mode 100644 src/python/README.md create mode 100644 tools/README.md create mode 100644 tools/build_src/build.tcl create mode 100644 tools/sim/README.md create mode 100644 tools/sim/compile.bat create mode 100644 tools/sim/compile.do create mode 100644 tools/sim/run.bat create mode 100644 tools/sim/run.do create mode 100644 tools/sim/waves_do/pp_rw_cpu.do create mode 100644 tools/xilinx-zcu/bram_pulse_definition/bram_pulse_definition.xci create mode 100644 tools/xilinx-zcu/bram_pulseposition/bram_pulseposition.xci create mode 100644 tools/xilinx-zcu/bram_waveform/bram_waveform.xci create mode 100644 tools/xilinx-zcu/fifo_data_to_stream/fifo_data_to_stream.xci create mode 100644 tools/xilinx-zcu/pinout_zcu.xdc create mode 100644 tools/xilinx-zcu/qlaser_timing_zcu.xdc create mode 100644 tools/xilinx-zcu/set_usercode_zcu.xdc create mode 100644 tools/xilinx/README.md create mode 100644 tools/xilinx/build_project.tcl create mode 100644 tools/xilinx/build_ps1.tcl create mode 100644 tools/xilinx/clkpll.xci create mode 100644 tools/xilinx/pinout.xdc create mode 100644 tools/xilinx/ps1.bd create mode 100644 tools/xilinx/qlaser_timing.xdc create mode 100644 tools/xilinx/set_usercode.xdc create mode 100644 tools/xilinx/zcu102_Rev1.0_U1_09152016.xdc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e4760ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.log +*.jou +*.ini +*.wlf +work +transcript +prj +.Xil +tools/xilinx-zcu/*/sim/ +tools/xilinx-zcu/*/doc/ +tools/xilinx-zcu/*/hdl/ +tools/xilinx-zcu/*/simulation/ +tools/xilinx-zcu/*/synth/ +tools/xilinx-zcu/*/misc/ +tools/xilinx-zcu/*/*.xdc +tools/xilinx-zcu/*/*.veo +tools/xilinx-zcu/*/*.vho +tools/xilinx-zcu/*/*.xml +tools/xilinx-zcu/*/*.dcp \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb8bf3e --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# QLASER_V_EYHC + +## Do NOT "merge" any branches. Each branch is a separate thing!!!! diff --git a/documents/README.md b/documents/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/documents/README.md @@ -0,0 +1 @@ + diff --git a/src/hdl/README.md b/src/hdl/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/hdl/README.md @@ -0,0 +1 @@ + diff --git a/src/hdl/ip_gen/bram_pulse_definition_sim_netlist.vhdl b/src/hdl/ip_gen/bram_pulse_definition_sim_netlist.vhdl new file mode 100644 index 0000000..6e0d363 --- /dev/null +++ b/src/hdl/ip_gen/bram_pulse_definition_sim_netlist.vhdl @@ -0,0 +1,1127 @@ +-- Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. +-- -------------------------------------------------------------------------------- +-- Tool Version: Vivado v.2022.1 (win64) Build 3526262 Mon Apr 18 15:48:16 MDT 2022 +-- Date : Thu Dec 21 15:45:22 2023 +-- Host : SURFACE-EY20NA6 running 64-bit major release (build 9200) +-- Command : write_vhdl -force -mode funcsim +-- c:/Users/yuhc2/Documents/GitHub/NANOQ_Laser_EYHC/prj/zcu_pulse_channel.gen/sources_1/ip/bram_pulse_definition/bram_pulse_definition_sim_netlist.vhdl +-- Design : bram_pulse_definition +-- Purpose : This VHDL netlist is a functional simulation representation of the design and should not be modified or +-- synthesized. This netlist cannot be used for SDF annotated simulation. +-- Device : xczu9eg-ffvb1156-2-e +-- -------------------------------------------------------------------------------- +`protect begin_protected +`protect version = 1 +`protect encrypt_agent = "XILINX" +`protect encrypt_agent_info = "Xilinx Encryption Tool 2022.1" +`protect key_keyowner="Synopsys", key_keyname="SNPS-VCS-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +RgPKnWr9n0dGgttm3akiFhAlfB96usOQYxnEmPhGyTGg1AbizYAjGPWLXBWl50n/d0IA71ci4aJB +wt6mtfyNADm3ZReK7D3mKu037BOgxryoEwwf1kiC6q/PllxsdAgEMfQrfHJ3E2AzSpdYjoxVYito +y0JW6CUDcWvWa4WV0EA= + +`protect key_keyowner="Aldec", key_keyname="ALDEC15_001", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +M0l6KpOGH3jL8eRt3NCD7e2USYnkg5H9GAnE1PKmnjiouFN3Y8kjWA2PZDAQLm9UW+TsC1HeVlzO +WjNCHkjR/6ubCsIcWfpPZWdIuAenlsyq8Y9l6b8vMj8JSbDEOiFF/GHSbKsn22MJdDJKEhHFK6GV +s8gR2vywRFwG69gIRE4qGhVB+WIg8GJrDpDMYH6lCjMkTrjXuKDUcNlJN3NPLuhJ7tsditwf1pr5 +moJRmGpJnip/rGm0g4o4A6ev4CtePjoao8C1wFtzHkERX9oenhh7cGjDMejU5IrLv8NxFnLj1FpB +9MuF1beTU20NI5oAn6zLiLiOtXjf0ghU3AN4DA== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VELOCE-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +hAsrUfp6Qgjm8yBjNYTEtQmVQmMxzL8TE/3oiQSxSI3+yEkXAbQCXkT9mo+LCdv+fGECOB0istHd +eLtbsiYbxjxNxYkXiUrRE5O+aSxynIray+uF9DJigTEUZu8JJXUbzxK4DDUu1Lm9tpGps4+Prz1m +0gkj13RT/Y/418s2VTw= + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VERIF-SIM-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +BP/54Wm/GJmb1jy0bxWJJX4aiKyiWPVh4X3VL30BQrmX4PlEsNKzBJH3Qu8IIYERfnFP0ifAgboa +vypMQ5Ed0BrMePGkWIgT6I8hxJCMFpHdkSK7m1giSKyZzFfTOrVqoNFXE+qdzLfY1J5hBWCvouYo +jllavK4N3gF9FLScH2AUWYVMcVth2QPaTAU2NLnAUNH8kgtBjBfc8/KbPPTznD1QNVqvFstzcbTA +hGQ1ETVPvINQ0KqxxAG5PRhtQD4+pC+hr/Tvk+RSvGyBOfy9zE86OXkJiYs9dSFhNiMFmCPL9DBO +se4OxNNC0/7aBtb1mkSEA9YFDYEb9jS7Jasy2A== + +`protect key_keyowner="Real Intent", key_keyname="RI-RSA-KEY-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +SnzT9DVH3xlEN8nrr2YrlvTO5qj7L22d7WaBcuKyTaiHoIwwFHrC4HQbfs0TAwkdWcOgmJoATPSF +F6qm0KiddbrlERF3MfKUldeGBJtqLdX+zGw7+3JD7S+HB9dIMOFOHy+IiCZp1/Pz8epKpi238cel +rcVoJQKz406wmXDvOo8KsT+XhRLs9BVCrBErPGGXKYDk6NXAp0duOgQE9DbslzMU83M/kUC7uERV +tQW02240peKQFp2elEZC7Tetvgp0TaFTtJiKN45REi8GQUCKGa85JjNIk1qb/+k95TIIP1xrHirc +6iX7qbwnPetv8TVu2NjkZ0WDEK5RXdOXcxBwHA== + +`protect key_keyowner="Xilinx", key_keyname="xilinxt_2021_07", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +erkR82V0jX8ytva+9MzEs0c75Z7j7TsgxWRLNAUfbbU28i+U9YzuZlSfYU75M0f9jx1gvxtBrfKv +cNHVdkR+i5zfHDZsDwfMEEBhs8wzDCKqe+eex6BBEvlIOesCPXrr2RozQgaQ1PBh/os2Arfu+873 +BjsVxFJkbhpzIqlddOo/XZV9Yi+eih7A7pXXEBR6IL7Poo4Ka49MiVQU0xJrDTm+ddOuMPDRRD7g +dsxS/uzdcBcO2myV6g/7YH/C2Ce9s6+UywJN/0JeXSqwA7bsBqqnfFicVAT0lckLopMLiuzK7dsN +EwhFeqoetciFrDIj9+o0xDMWBZhgNP1u68vURA== + +`protect key_keyowner="Metrics Technologies Inc.", key_keyname="DSim", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +R+BI65BKLT0I9hEtsxGnDyM5XY9gzULeTPOSDXvd3KWOzZJAx6C0xlbyZcFZhAEG/QIK2yd0wAi6 +IUWxyF/sx3HsqKjhVi5KxnpuXDBOZVoj811O7JukedFVmDW7OHGtBkuiJ5X5irw7mfsEKRQmF/1i +V6lj9HYHZEjxtDeZjACsLY4y1QxWalSKT4HIMOHznBLL8dLbGMlS+ZmFuFn0gcwZavVl7gTkTtkf +W0gn01A9ru7NKsf+iLX0kj4dgItPu9N2g02M1vWQ9UUQEVvfV7lUc7GY1suibrD8aEkhH9S7lZ7n +bFsT4qxyvzg8ML6v4g4v7N6VuyhEtgFgNd725Q== + +`protect key_keyowner="Atrenta", key_keyname="ATR-SG-RSA-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=384) +`protect key_block +jNUVKiwH68vHsU54idgvKwaVJcoxTUuxfgrQpbpmM/IpesWA3wHsGzYClwAxkKzw3KRnFyQqTWcZ +yj1EQ2CMBxlJ0kyNbZW8OK8pXzeigToZ0U6Aq3Gy+j7wBbhe83wE1Ygn82sK8dHTEulvaRLn/c5r +ispy1s7jMKIvYNzoUuZrgyBQyfaYmdqUia8XlQjFd+VwzhTXKwzvmaqHWyaHjfBKeCooO7+oUxMG +OJg83W54EVe9ronFQ8Wr9EOL8ia7qelCAgyQe/bC0HHCoMAm8apI7sX23iMR/wMiPP5V2bQzycy+ +rBX/+SWkqSeIE1FLm+muFPvrE7iLwJaW8d1fzdFFjAZ5aIXArbWNfwbK8S0TczXc9lEzmpb69rwA +UJIrs4alo81qGQ32UFhjuMQjX75O9Od1HWHDj5PFaT/Ja5Ly+bK8Cc3gfO6dCE81m7d+B2JBZ/Hl +tBA19QuOAYwT2EIPOdpaVtCULb33cWODWu3qQFhZMmDzKTb3kwpcr0LL + +`protect key_keyowner="Cadence Design Systems.", key_keyname="CDS_RSA_KEY_VER_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +MnzcA2swaxH1LRacKDou0ZmiiMRETbWIdHgeBgyQz7ILronsXLoB/C20WuFNGEVSiL2/51EZ6MXZ +vMHI8fFcMQCJcuTBDBibUMKv6bXI9s8fTbtrBZppbF/R1icG5JYhqmX4aRnv4W/dxJRjI2L35nLN +Y48E9OfgfkD1sr+IRwx8WEKFmUhuk8dLe0VOK7ywe3XEcneYvrz+HhPj16bGmNfMwNnDgZ3gKKZD +hRnys+jzvAX3HyISrErWXhMKrhWMxXeTNFJCqNQ0LWAVHQYwyKnF5xVpyXSuGNSIrva+QXqOrZBG +3VNLirNVtMRiKLfwZeMaqvswkqBDAa53utlAAA== + +`protect key_keyowner="Synplicity", key_keyname="SYNP15_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +d0xXkKtsKM8GvXhDZr16p1+oE3uBtD04BJ76eGGIEj/CFECfHVy9qsJ43oSKjas0+AJr4GFFnVb6 +X7gJV6MmX/OboC9ier5joUCGz0mxVzkRZK9a+LPEDcg0K6+cLE36kr+FfxW9Uk2816EHBCMCf5mK +A4eAhSmAb5Nq74F/q0quiG416npbny7faiQ+xmPDfYYiM3UuMKaD4iE8ODlz1w5xThPllWESf3LZ +NTkw6fozyTqZ47vvE21O3dgIGAY1v+C6BwlCK24VwPJa1xs9csY+qTk31j5jjAc1ExlB6QF7t9UH +lk70qdNPWxT87OH7kFT8UvPO1D6BTC3/WkDZfA== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-PREC-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +LYhdzKTvo93uJrAaiP5OfCDuOnu2BSvPnxlv6I7h2n1+xHtj34LNNKzWEgOg9dUV9cYDaHYUjjEt +DKdWcz6mZ61d5qyxAhpv67fc90v7JVgtOAcT94/Yb+AuLxXFcGA6Gic7uoJtUgz6JmTnb22Dxdjc +KuIewDj4IOTfP8XGXKTaF+cNp0CFrQgTAcVSQFyLFxr0I/9h3S+GZLecA7ntEeHEOfCJzPvy0ddi +7MCdQWECLb+fXC0IAn8V95TumcpINiRAX1BHi9IGJ4QoMrb3jOCrPkFhDMTJj2aiImUWdi/l/0QE +d7wcXlgIEYVeoKYUOJ4mqy+zZPUbLNeOPADUDQ== + +`protect data_method = "AES128-CBC" +`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 41488) +`protect data_block +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 +`protect end_protected +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +entity bram_pulse_definition is + port ( + clka : in STD_LOGIC; + wea : in STD_LOGIC_VECTOR ( 0 to 0 ); + addra : in STD_LOGIC_VECTOR ( 9 downto 0 ); + dina : in STD_LOGIC_VECTOR ( 31 downto 0 ); + douta : out STD_LOGIC_VECTOR ( 31 downto 0 ); + clkb : in STD_LOGIC; + web : in STD_LOGIC_VECTOR ( 0 to 0 ); + addrb : in STD_LOGIC_VECTOR ( 9 downto 0 ); + dinb : in STD_LOGIC_VECTOR ( 31 downto 0 ); + doutb : out STD_LOGIC_VECTOR ( 31 downto 0 ) + ); + attribute NotValidForBitStream : boolean; + attribute NotValidForBitStream of bram_pulse_definition : entity is true; + attribute CHECK_LICENSE_TYPE : string; + attribute CHECK_LICENSE_TYPE of bram_pulse_definition : entity is "bram_pulse_definition,blk_mem_gen_v8_4_5,{}"; + attribute downgradeipidentifiedwarnings : string; + attribute downgradeipidentifiedwarnings of bram_pulse_definition : entity is "yes"; + attribute x_core_info : string; + attribute x_core_info of bram_pulse_definition : entity is "blk_mem_gen_v8_4_5,Vivado 2022.1"; +end bram_pulse_definition; + +architecture STRUCTURE of bram_pulse_definition is + signal NLW_U0_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_rsta_busy_UNCONNECTED : STD_LOGIC; + signal NLW_U0_rstb_busy_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_arready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_awready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_bvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_rlast_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_rvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_wready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_rdaddrecc_UNCONNECTED : STD_LOGIC_VECTOR ( 9 downto 0 ); + signal NLW_U0_s_axi_bid_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_s_axi_bresp_UNCONNECTED : STD_LOGIC_VECTOR ( 1 downto 0 ); + signal NLW_U0_s_axi_rdaddrecc_UNCONNECTED : STD_LOGIC_VECTOR ( 9 downto 0 ); + signal NLW_U0_s_axi_rdata_UNCONNECTED : STD_LOGIC_VECTOR ( 31 downto 0 ); + signal NLW_U0_s_axi_rid_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_s_axi_rresp_UNCONNECTED : STD_LOGIC_VECTOR ( 1 downto 0 ); + attribute C_ADDRA_WIDTH : integer; + attribute C_ADDRA_WIDTH of U0 : label is 10; + attribute C_ADDRB_WIDTH : integer; + attribute C_ADDRB_WIDTH of U0 : label is 10; + attribute C_ALGORITHM : integer; + attribute C_ALGORITHM of U0 : label is 1; + attribute C_AXI_ID_WIDTH : integer; + attribute C_AXI_ID_WIDTH of U0 : label is 4; + attribute C_AXI_SLAVE_TYPE : integer; + attribute C_AXI_SLAVE_TYPE of U0 : label is 0; + attribute C_AXI_TYPE : integer; + attribute C_AXI_TYPE of U0 : label is 1; + attribute C_BYTE_SIZE : integer; + attribute C_BYTE_SIZE of U0 : label is 9; + attribute C_COMMON_CLK : integer; + attribute C_COMMON_CLK of U0 : label is 0; + attribute C_COUNT_18K_BRAM : string; + attribute C_COUNT_18K_BRAM of U0 : label is "0"; + attribute C_COUNT_36K_BRAM : string; + attribute C_COUNT_36K_BRAM of U0 : label is "1"; + attribute C_CTRL_ECC_ALGO : string; + attribute C_CTRL_ECC_ALGO of U0 : label is "NONE"; + attribute C_DEFAULT_DATA : string; + attribute C_DEFAULT_DATA of U0 : label is "0"; + attribute C_DISABLE_WARN_BHV_COLL : integer; + attribute C_DISABLE_WARN_BHV_COLL of U0 : label is 0; + attribute C_DISABLE_WARN_BHV_RANGE : integer; + attribute C_DISABLE_WARN_BHV_RANGE of U0 : label is 0; + attribute C_ELABORATION_DIR : string; + attribute C_ELABORATION_DIR of U0 : label is "./"; + attribute C_ENABLE_32BIT_ADDRESS : integer; + attribute C_ENABLE_32BIT_ADDRESS of U0 : label is 0; + attribute C_EN_DEEPSLEEP_PIN : integer; + attribute C_EN_DEEPSLEEP_PIN of U0 : label is 0; + attribute C_EN_ECC_PIPE : integer; + attribute C_EN_ECC_PIPE of U0 : label is 0; + attribute C_EN_RDADDRA_CHG : integer; + attribute C_EN_RDADDRA_CHG of U0 : label is 0; + attribute C_EN_RDADDRB_CHG : integer; + attribute C_EN_RDADDRB_CHG of U0 : label is 0; + attribute C_EN_SAFETY_CKT : integer; + attribute C_EN_SAFETY_CKT of U0 : label is 0; + attribute C_EN_SHUTDOWN_PIN : integer; + attribute C_EN_SHUTDOWN_PIN of U0 : label is 0; + attribute C_EN_SLEEP_PIN : integer; + attribute C_EN_SLEEP_PIN of U0 : label is 0; + attribute C_EST_POWER_SUMMARY : string; + attribute C_EST_POWER_SUMMARY of U0 : label is "Estimated Power for IP : 4.238151 mW"; + attribute C_FAMILY : string; + attribute C_FAMILY of U0 : label is "zynquplus"; + attribute C_HAS_AXI_ID : integer; + attribute C_HAS_AXI_ID of U0 : label is 0; + attribute C_HAS_ENA : integer; + attribute C_HAS_ENA of U0 : label is 0; + attribute C_HAS_ENB : integer; + attribute C_HAS_ENB of U0 : label is 0; + attribute C_HAS_INJECTERR : integer; + attribute C_HAS_INJECTERR of U0 : label is 0; + attribute C_HAS_MEM_OUTPUT_REGS_A : integer; + attribute C_HAS_MEM_OUTPUT_REGS_A of U0 : label is 0; + attribute C_HAS_MEM_OUTPUT_REGS_B : integer; + attribute C_HAS_MEM_OUTPUT_REGS_B of U0 : label is 0; + attribute C_HAS_MUX_OUTPUT_REGS_A : integer; + attribute C_HAS_MUX_OUTPUT_REGS_A of U0 : label is 0; + attribute C_HAS_MUX_OUTPUT_REGS_B : integer; + attribute C_HAS_MUX_OUTPUT_REGS_B of U0 : label is 0; + attribute C_HAS_REGCEA : integer; + attribute C_HAS_REGCEA of U0 : label is 0; + attribute C_HAS_REGCEB : integer; + attribute C_HAS_REGCEB of U0 : label is 0; + attribute C_HAS_RSTA : integer; + attribute C_HAS_RSTA of U0 : label is 0; + attribute C_HAS_RSTB : integer; + attribute C_HAS_RSTB of U0 : label is 0; + attribute C_HAS_SOFTECC_INPUT_REGS_A : integer; + attribute C_HAS_SOFTECC_INPUT_REGS_A of U0 : label is 0; + attribute C_HAS_SOFTECC_OUTPUT_REGS_B : integer; + attribute C_HAS_SOFTECC_OUTPUT_REGS_B of U0 : label is 0; + attribute C_INITA_VAL : string; + attribute C_INITA_VAL of U0 : label is "0"; + attribute C_INITB_VAL : string; + attribute C_INITB_VAL of U0 : label is "0"; + attribute C_INIT_FILE : string; + attribute C_INIT_FILE of U0 : label is "bram_pulse_definition.mem"; + attribute C_INIT_FILE_NAME : string; + attribute C_INIT_FILE_NAME of U0 : label is "no_coe_file_loaded"; + attribute C_INTERFACE_TYPE : integer; + attribute C_INTERFACE_TYPE of U0 : label is 0; + attribute C_LOAD_INIT_FILE : integer; + attribute C_LOAD_INIT_FILE of U0 : label is 0; + attribute C_MEM_TYPE : integer; + attribute C_MEM_TYPE of U0 : label is 2; + attribute C_MUX_PIPELINE_STAGES : integer; + attribute C_MUX_PIPELINE_STAGES of U0 : label is 0; + attribute C_PRIM_TYPE : integer; + attribute C_PRIM_TYPE of U0 : label is 1; + attribute C_READ_DEPTH_A : integer; + attribute C_READ_DEPTH_A of U0 : label is 1024; + attribute C_READ_DEPTH_B : integer; + attribute C_READ_DEPTH_B of U0 : label is 1024; + attribute C_READ_LATENCY_A : integer; + attribute C_READ_LATENCY_A of U0 : label is 1; + attribute C_READ_LATENCY_B : integer; + attribute C_READ_LATENCY_B of U0 : label is 1; + attribute C_READ_WIDTH_A : integer; + attribute C_READ_WIDTH_A of U0 : label is 32; + attribute C_READ_WIDTH_B : integer; + attribute C_READ_WIDTH_B of U0 : label is 32; + attribute C_RSTRAM_A : integer; + attribute C_RSTRAM_A of U0 : label is 0; + attribute C_RSTRAM_B : integer; + attribute C_RSTRAM_B of U0 : label is 0; + attribute C_RST_PRIORITY_A : string; + attribute C_RST_PRIORITY_A of U0 : label is "CE"; + attribute C_RST_PRIORITY_B : string; + attribute C_RST_PRIORITY_B of U0 : label is "CE"; + attribute C_SIM_COLLISION_CHECK : string; + attribute C_SIM_COLLISION_CHECK of U0 : label is "ALL"; + attribute C_USE_BRAM_BLOCK : integer; + attribute C_USE_BRAM_BLOCK of U0 : label is 0; + attribute C_USE_BYTE_WEA : integer; + attribute C_USE_BYTE_WEA of U0 : label is 0; + attribute C_USE_BYTE_WEB : integer; + attribute C_USE_BYTE_WEB of U0 : label is 0; + attribute C_USE_DEFAULT_DATA : integer; + attribute C_USE_DEFAULT_DATA of U0 : label is 0; + attribute C_USE_ECC : integer; + attribute C_USE_ECC of U0 : label is 0; + attribute C_USE_SOFTECC : integer; + attribute C_USE_SOFTECC of U0 : label is 0; + attribute C_USE_URAM : integer; + attribute C_USE_URAM of U0 : label is 0; + attribute C_WEA_WIDTH : integer; + attribute C_WEA_WIDTH of U0 : label is 1; + attribute C_WEB_WIDTH : integer; + attribute C_WEB_WIDTH of U0 : label is 1; + attribute C_WRITE_DEPTH_A : integer; + attribute C_WRITE_DEPTH_A of U0 : label is 1024; + attribute C_WRITE_DEPTH_B : integer; + attribute C_WRITE_DEPTH_B of U0 : label is 1024; + attribute C_WRITE_MODE_A : string; + attribute C_WRITE_MODE_A of U0 : label is "WRITE_FIRST"; + attribute C_WRITE_MODE_B : string; + attribute C_WRITE_MODE_B of U0 : label is "WRITE_FIRST"; + attribute C_WRITE_WIDTH_A : integer; + attribute C_WRITE_WIDTH_A of U0 : label is 32; + attribute C_WRITE_WIDTH_B : integer; + attribute C_WRITE_WIDTH_B of U0 : label is 32; + attribute C_XDEVICEFAMILY : string; + attribute C_XDEVICEFAMILY of U0 : label is "zynquplus"; + attribute downgradeipidentifiedwarnings of U0 : label is "yes"; + attribute is_du_within_envelope : string; + attribute is_du_within_envelope of U0 : label is "true"; + attribute x_interface_info : string; + attribute x_interface_info of clka : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA CLK"; + attribute x_interface_parameter : string; + attribute x_interface_parameter of clka : signal is "XIL_INTERFACENAME BRAM_PORTA, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER, READ_LATENCY 1"; + attribute x_interface_info of clkb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB CLK"; + attribute x_interface_parameter of clkb : signal is "XIL_INTERFACENAME BRAM_PORTB, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER, READ_LATENCY 1"; + attribute x_interface_info of addra : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA ADDR"; + attribute x_interface_info of addrb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB ADDR"; + attribute x_interface_info of dina : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA DIN"; + attribute x_interface_info of dinb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB DIN"; + attribute x_interface_info of douta : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT"; + attribute x_interface_info of doutb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB DOUT"; + attribute x_interface_info of wea : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA WE"; + attribute x_interface_info of web : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB WE"; +begin +U0: entity work.bram_pulse_definition_blk_mem_gen_v8_4_5 + port map ( + addra(9 downto 0) => addra(9 downto 0), + addrb(9 downto 0) => addrb(9 downto 0), + clka => clka, + clkb => clkb, + dbiterr => NLW_U0_dbiterr_UNCONNECTED, + deepsleep => '0', + dina(31 downto 0) => dina(31 downto 0), + dinb(31 downto 0) => dinb(31 downto 0), + douta(31 downto 0) => douta(31 downto 0), + doutb(31 downto 0) => doutb(31 downto 0), + eccpipece => '0', + ena => '0', + enb => '0', + injectdbiterr => '0', + injectsbiterr => '0', + rdaddrecc(9 downto 0) => NLW_U0_rdaddrecc_UNCONNECTED(9 downto 0), + regcea => '0', + regceb => '0', + rsta => '0', + rsta_busy => NLW_U0_rsta_busy_UNCONNECTED, + rstb => '0', + rstb_busy => NLW_U0_rstb_busy_UNCONNECTED, + s_aclk => '0', + s_aresetn => '0', + s_axi_araddr(31 downto 0) => B"00000000000000000000000000000000", + s_axi_arburst(1 downto 0) => B"00", + s_axi_arid(3 downto 0) => B"0000", + s_axi_arlen(7 downto 0) => B"00000000", + s_axi_arready => NLW_U0_s_axi_arready_UNCONNECTED, + s_axi_arsize(2 downto 0) => B"000", + s_axi_arvalid => '0', + s_axi_awaddr(31 downto 0) => B"00000000000000000000000000000000", + s_axi_awburst(1 downto 0) => B"00", + s_axi_awid(3 downto 0) => B"0000", + s_axi_awlen(7 downto 0) => B"00000000", + s_axi_awready => NLW_U0_s_axi_awready_UNCONNECTED, + s_axi_awsize(2 downto 0) => B"000", + s_axi_awvalid => '0', + s_axi_bid(3 downto 0) => NLW_U0_s_axi_bid_UNCONNECTED(3 downto 0), + s_axi_bready => '0', + s_axi_bresp(1 downto 0) => NLW_U0_s_axi_bresp_UNCONNECTED(1 downto 0), + s_axi_bvalid => NLW_U0_s_axi_bvalid_UNCONNECTED, + s_axi_dbiterr => NLW_U0_s_axi_dbiterr_UNCONNECTED, + s_axi_injectdbiterr => '0', + s_axi_injectsbiterr => '0', + s_axi_rdaddrecc(9 downto 0) => NLW_U0_s_axi_rdaddrecc_UNCONNECTED(9 downto 0), + s_axi_rdata(31 downto 0) => NLW_U0_s_axi_rdata_UNCONNECTED(31 downto 0), + s_axi_rid(3 downto 0) => NLW_U0_s_axi_rid_UNCONNECTED(3 downto 0), + s_axi_rlast => NLW_U0_s_axi_rlast_UNCONNECTED, + s_axi_rready => '0', + s_axi_rresp(1 downto 0) => NLW_U0_s_axi_rresp_UNCONNECTED(1 downto 0), + s_axi_rvalid => NLW_U0_s_axi_rvalid_UNCONNECTED, + s_axi_sbiterr => NLW_U0_s_axi_sbiterr_UNCONNECTED, + s_axi_wdata(31 downto 0) => B"00000000000000000000000000000000", + s_axi_wlast => '0', + s_axi_wready => NLW_U0_s_axi_wready_UNCONNECTED, + s_axi_wstrb(0) => '0', + s_axi_wvalid => '0', + sbiterr => NLW_U0_sbiterr_UNCONNECTED, + shutdown => '0', + sleep => '0', + wea(0) => wea(0), + web(0) => web(0) + ); +end STRUCTURE; diff --git a/src/hdl/ip_gen/bram_pulseposition_sim_netlist.vhdl b/src/hdl/ip_gen/bram_pulseposition_sim_netlist.vhdl new file mode 100644 index 0000000..c26fde2 --- /dev/null +++ b/src/hdl/ip_gen/bram_pulseposition_sim_netlist.vhdl @@ -0,0 +1,3540 @@ +-- Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. +-- -------------------------------------------------------------------------------- +-- Tool Version: Vivado v.2022.1 (win64) Build 3526262 Mon Apr 18 15:48:16 MDT 2022 +-- Date : Thu Dec 21 15:38:27 2023 +-- Host : SURFACE-EY20NA6 running 64-bit major release (build 9200) +-- Command : write_vhdl -force -mode funcsim +-- c:/Users/yuhc2/Documents/GitHub/NANOQ_Laser_EYHC/prj/zcu_pulse_channel.gen/sources_1/ip/bram_pulseposition/bram_pulseposition_sim_netlist.vhdl +-- Design : bram_pulseposition +-- Purpose : This VHDL netlist is a functional simulation representation of the design and should not be modified or +-- synthesized. This netlist cannot be used for SDF annotated simulation. +-- Device : xczu9eg-ffvb1156-2-e +-- -------------------------------------------------------------------------------- +`protect begin_protected +`protect version = 1 +`protect encrypt_agent = "XILINX" +`protect encrypt_agent_info = "Xilinx Encryption Tool 2022.1" +`protect key_keyowner="Synopsys", key_keyname="SNPS-VCS-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +V8j9uZAuTSdcU7d37hOuvR2eN4+hJE0SQi3782LtikYHlIhlhzzBECcQ3wckATmgIOfJCCVEoeRA +ZabxUB0jmkGFcM25pS42us4l8Jw3tzYXg8dRkvx7VRPHyWH9wXwUgy0qFUIqbS1K3ToC2ti3Bihe +SaejkALX/yf7GEmQSeg= + +`protect key_keyowner="Aldec", key_keyname="ALDEC15_001", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +KjnLJu4SYrpE4qQx0FJobDTHe2g5+n+Q6FObiGTKe0NVy1wB7V+KEJqc+r2xjpEXlquV87+TrOgr +yoeXvSYsOmh/oNv+5lpsb/kdhT5EljdkfqI4rTDdogwIRbF5iSu9dp/2OtVr+nC6QYGDI0YDgcO7 +4kn8ghnBESoln4PERbuzfTfbc58lo6Gq5qv7TMTjDZMRiN0CUTCuYzVqRTCRXkgTDhosefVDs6Up +pB5jZ9devajNCsz9yQIQtxvuN9tXVWeuRueNFB14r4rYY7F5/otmDqvKgCWwEXtKqVQNj5hQkSFz +YWx96euGqafcGtIs2W0H2QMov0vrSxi2Wndlrw== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VELOCE-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +YO2SS3ozlen3bngSMDbc88mazzkono7nFrse2QdBdhm7cHsDiCLJl1u/2ZwIFv3QeEbCn5u5q8hG +TDNHI8nZRuskZLs0BXqig7uplAiktBJEN0l0ei2ciUax4iVnRtCVKfn/M+BUZj+banPiWp9Kpdml +VOrMoFqIXebJq184IVY= + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VERIF-SIM-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +eDqyXO8M8wAUlkNysOtmW3Ag3h1qUc1ksEfo85mvU5cMYdCjRVYz6OacttNeARjho7fIzXtgtHAi +s4cOsFuah18hkHlPDbWnJcyaBoN1UC3zH5Sq356+JnD/+tnBnq5OlU7W8OrboEfK03go6Zxe/y0y +s5Nz5MFYMngLELHz4vZOYoOsO0xFsbio7vDtFzbgvpvZVLhKvQGtVdJsfIEkBd5elE4tTaYSPadU +6/cHnyXVTNeuDPFYqkX5j61R1m3f4zfnkdWn8CSZWYouhfpOaV32Tgk2834g6THkeV44U6Kee28f +2zM3Vl2Xrsa0SP/3vltYwvfGU5mZYQWr7lVJMg== + +`protect key_keyowner="Real Intent", key_keyname="RI-RSA-KEY-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +aoJHr9XKFogp3jqb6pnOP1SMdRNgax7PRBVL5oP9u6EBjCyOxasIjony/C5q5NGBilztG19Wtj7R +pSXqIdzborswgHUyJ9bwF4lzJzoJcmlMej18+z1Jpel6fGTc/j055Fdrvxf8H5B0py0ynW0+fDNZ +zPhFWIdVVbPKObUsbSrAF28VEEdjfIanMWusQBga1WgtIzzlY2O5qHroTYp5swOjX4CzofsxuVN6 +zxftYABV04wUN095K7HOK1DJ7TAXkfdSXbtZi/YpdsedZqTNxXRNCMIadoaueO+BVfk1QA6R8ep1 +QEt/eDqhzxImaL/W5zdRu4iR3rKrxE66765F1g== + +`protect key_keyowner="Xilinx", key_keyname="xilinxt_2021_07", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +CgtzskH+mzmGEWqd7KptSOOtqVwPm0tHLX1SSP1oz9rDkV9s3RKi69fpV8a1hfcU7tArjCYftqG0 +OvBq65dZs3YMQA33i9lNugkOFd4s4mWuu5Jl7VeYn+9Rbn9WpXfIZp2ZhSebC7u4L3PU9Z/nt268 +TK5LXHg27h+Dh/nfSuPBuUJcCfpFrpuNqXFqczDxXmwttNzz/5sbeoeBrELv9ua1vTrye7Ej9hF+ +MotLlCmiWkkXoEFD9pgzAoLciXYvcnbqinUVZBh3f4F63hp3dnaF1XRU6BQXb07O2YWHsXMlKNt4 +dK69u70ApIkoibr/gnLIZpYXk2Aw8SUE6s7f8g== + +`protect key_keyowner="Metrics Technologies Inc.", key_keyname="DSim", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +qsF9lZxi/zzJVv67MO9pgWqGUstJe9URVdS4Sv0uoJrhh2rTsivGGCvajhVD4t887objCstZgTrr +GYoUVZ6+g5Wc50Y2H3Lujxr2ttPiAVBcqys8TNKzDd+sqqU9enMiC6oiNqRB47MmOChOBEVYG9po +MWBfSEOoqO1Bo4apr1ti7erpbZIS+vDEvNVBAffYTcjwMJo0YqVrHdgptBq2+soaNLYmiqaRp4+L +E+a1aCRpXco//ur2pwZKefYRj1Pbc3mGa0Db2EKTgzYxLCUc2Ni0MogHDl9nRduLW5okZXPYINE9 +ZEibZH4ij3dCb5HI1YitvIlSsbwkthlrTRuwrA== + +`protect key_keyowner="Atrenta", key_keyname="ATR-SG-RSA-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=384) +`protect key_block +Kfvr9uGICBYg+bSLCIkImscNd/d6O5EKsn3LkkEE5OLapxJgQzKOiesn0Ix7C0xi1lWmgjVDszTB +1+4PlhsdxFh2+tLaWEL5PS8Y+wY+Z6QWup4F/pHxKClIEvUeQqoxvy/4LamzYL84Lk6M8riHxELU ++UIySMpujDpmvesYeJcr8406Ky08tXu2ZYhzpI7ssAdevE5a5sv9uGOIE8SIM7hMSJnH+kDqv2XV +DCjIB/nPCxYZc0dpsQlckrpVRPSgn2XaJLX/gv1m3TBeoBxFtKK5IcQEbprjnUtdBRAJSECHzJ99 +klwM9H7sQ3olqvcqMgxh7KtmwR1Pk7/BfETOzoythUHTo20xnhDaqT37g+zkKDOX/KMPxPP/+8Mf +v3C54uoO1KJz8iInxtwwu0Gkg+jGF77lLMNhR/s8ZQa0xupnEtjRd7L1H5D1xGuzhnimxL6oJ4lM +f3ToIlUmMffRPBpCLpWb6aeZZQyBMi3q/mdNpJxSTW5p99Bkt8UAcy2n + +`protect key_keyowner="Cadence Design Systems.", key_keyname="CDS_RSA_KEY_VER_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +kfapcdMik5+2iWCupVkPJLH/966AXOp3PqrBkJuAdqp3INTQeZICoWcyWImOR+Fnd1UbR5M8rJYw +R8Cjv4QYkt8kMqp/W6ZkPKauqc/dV4hHTgNjWmaDEPaIWvhXyVCARs6Kkc1XM9Id1BraWss872xt +GalXd7JXwJwOrBSKRYIZJMAvcqANDFyws1jlxEcuCKaxlT77kayjELqOewDOTN89nkTaPS80mBry +uUoplb7zOYXDvaWu/iVZ/BC1Iq5miXVcNAHb14TeyqXWwAsSVLeUJgrmOaKabKq2FRh66iEmv9wR +IeDmDHY40ooDpK1V7CDq6vBkUhnIeEQ3uiDy7Q== + +`protect data_method = "AES128-CBC" +`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 189536) +`protect data_block +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 +96l5MpFSl5uDh1o= +`protect end_protected +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +entity bram_pulseposition is + port ( + a : in STD_LOGIC_VECTOR ( 3 downto 0 ); + d : in STD_LOGIC_VECTOR ( 95 downto 0 ); + dpra : in STD_LOGIC_VECTOR ( 3 downto 0 ); + clk : in STD_LOGIC; + we : in STD_LOGIC; + spo : out STD_LOGIC_VECTOR ( 95 downto 0 ); + dpo : out STD_LOGIC_VECTOR ( 95 downto 0 ) + ); + attribute NotValidForBitStream : boolean; + attribute NotValidForBitStream of bram_pulseposition : entity is true; + attribute CHECK_LICENSE_TYPE : string; + attribute CHECK_LICENSE_TYPE of bram_pulseposition : entity is "bram_pulseposition,dist_mem_gen_v8_0_13,{}"; + attribute downgradeipidentifiedwarnings : string; + attribute downgradeipidentifiedwarnings of bram_pulseposition : entity is "yes"; + attribute x_core_info : string; + attribute x_core_info of bram_pulseposition : entity is "dist_mem_gen_v8_0_13,Vivado 2022.1"; +end bram_pulseposition; + +architecture STRUCTURE of bram_pulseposition is + signal NLW_U0_qdpo_UNCONNECTED : STD_LOGIC_VECTOR ( 95 downto 0 ); + signal NLW_U0_qspo_UNCONNECTED : STD_LOGIC_VECTOR ( 95 downto 0 ); + attribute C_FAMILY : string; + attribute C_FAMILY of U0 : label is "zynquplus"; + attribute C_HAS_CLK : integer; + attribute C_HAS_CLK of U0 : label is 1; + attribute C_HAS_D : integer; + attribute C_HAS_D of U0 : label is 1; + attribute C_HAS_WE : integer; + attribute C_HAS_WE of U0 : label is 1; + attribute C_MEM_TYPE : integer; + attribute C_MEM_TYPE of U0 : label is 2; + attribute c_addr_width : integer; + attribute c_addr_width of U0 : label is 4; + attribute c_default_data : string; + attribute c_default_data of U0 : label is "0"; + attribute c_depth : integer; + attribute c_depth of U0 : label is 16; + attribute c_elaboration_dir : string; + attribute c_elaboration_dir of U0 : label is "./"; + attribute c_has_dpo : integer; + attribute c_has_dpo of U0 : label is 1; + attribute c_has_dpra : integer; + attribute c_has_dpra of U0 : label is 1; + attribute c_has_i_ce : integer; + attribute c_has_i_ce of U0 : label is 0; + attribute c_has_qdpo : integer; + attribute c_has_qdpo of U0 : label is 0; + attribute c_has_qdpo_ce : integer; + attribute c_has_qdpo_ce of U0 : label is 0; + attribute c_has_qdpo_clk : integer; + attribute c_has_qdpo_clk of U0 : label is 0; + attribute c_has_qdpo_rst : integer; + attribute c_has_qdpo_rst of U0 : label is 0; + attribute c_has_qdpo_srst : integer; + attribute c_has_qdpo_srst of U0 : label is 0; + attribute c_has_qspo : integer; + attribute c_has_qspo of U0 : label is 0; + attribute c_has_qspo_ce : integer; + attribute c_has_qspo_ce of U0 : label is 0; + attribute c_has_qspo_rst : integer; + attribute c_has_qspo_rst of U0 : label is 0; + attribute c_has_qspo_srst : integer; + attribute c_has_qspo_srst of U0 : label is 0; + attribute c_has_spo : integer; + attribute c_has_spo of U0 : label is 1; + attribute c_mem_init_file : string; + attribute c_mem_init_file of U0 : label is "no_coe_file_loaded"; + attribute c_parser_type : integer; + attribute c_parser_type of U0 : label is 1; + attribute c_pipeline_stages : integer; + attribute c_pipeline_stages of U0 : label is 0; + attribute c_qce_joined : integer; + attribute c_qce_joined of U0 : label is 0; + attribute c_qualify_we : integer; + attribute c_qualify_we of U0 : label is 0; + attribute c_read_mif : integer; + attribute c_read_mif of U0 : label is 0; + attribute c_reg_a_d_inputs : integer; + attribute c_reg_a_d_inputs of U0 : label is 0; + attribute c_reg_dpra_input : integer; + attribute c_reg_dpra_input of U0 : label is 0; + attribute c_sync_enable : integer; + attribute c_sync_enable of U0 : label is 1; + attribute c_width : integer; + attribute c_width of U0 : label is 96; + attribute is_du_within_envelope : string; + attribute is_du_within_envelope of U0 : label is "true"; +begin +U0: entity work.bram_pulseposition_dist_mem_gen_v8_0_13 + port map ( + a(3 downto 0) => a(3 downto 0), + clk => clk, + d(95 downto 0) => d(95 downto 0), + dpo(95 downto 0) => dpo(95 downto 0), + dpra(3 downto 0) => dpra(3 downto 0), + i_ce => '1', + qdpo(95 downto 0) => NLW_U0_qdpo_UNCONNECTED(95 downto 0), + qdpo_ce => '1', + qdpo_clk => '0', + qdpo_rst => '0', + qdpo_srst => '0', + qspo(95 downto 0) => NLW_U0_qspo_UNCONNECTED(95 downto 0), + qspo_ce => '1', + qspo_rst => '0', + qspo_srst => '0', + spo(95 downto 0) => spo(95 downto 0), + we => we + ); +end STRUCTURE; diff --git a/src/hdl/ip_gen/bram_waveform_sim_netlist.vhdl b/src/hdl/ip_gen/bram_waveform_sim_netlist.vhdl new file mode 100644 index 0000000..8f9c91a --- /dev/null +++ b/src/hdl/ip_gen/bram_waveform_sim_netlist.vhdl @@ -0,0 +1,1509 @@ +-- Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. +-- -------------------------------------------------------------------------------- +-- Tool Version: Vivado v.2022.1 (win64) Build 3526262 Mon Apr 18 15:48:16 MDT 2022 +-- Date : Thu Dec 21 15:42:31 2023 +-- Host : SURFACE-EY20NA6 running 64-bit major release (build 9200) +-- Command : write_vhdl -force -mode funcsim +-- c:/Users/yuhc2/Documents/GitHub/NANOQ_Laser_EYHC/prj/zcu_pulse_channel.gen/sources_1/ip/bram_waveform/bram_waveform_sim_netlist.vhdl +-- Design : bram_waveform +-- Purpose : This VHDL netlist is a functional simulation representation of the design and should not be modified or +-- synthesized. This netlist cannot be used for SDF annotated simulation. +-- Device : xczu9eg-ffvb1156-2-e +-- -------------------------------------------------------------------------------- +`protect begin_protected +`protect version = 1 +`protect encrypt_agent = "XILINX" +`protect encrypt_agent_info = "Xilinx Encryption Tool 2022.1" +`protect key_keyowner="Synopsys", key_keyname="SNPS-VCS-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +RgPKnWr9n0dGgttm3akiFhAlfB96usOQYxnEmPhGyTGg1AbizYAjGPWLXBWl50n/d0IA71ci4aJB +wt6mtfyNADm3ZReK7D3mKu037BOgxryoEwwf1kiC6q/PllxsdAgEMfQrfHJ3E2AzSpdYjoxVYito +y0JW6CUDcWvWa4WV0EA= + +`protect key_keyowner="Aldec", key_keyname="ALDEC15_001", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +M0l6KpOGH3jL8eRt3NCD7e2USYnkg5H9GAnE1PKmnjiouFN3Y8kjWA2PZDAQLm9UW+TsC1HeVlzO +WjNCHkjR/6ubCsIcWfpPZWdIuAenlsyq8Y9l6b8vMj8JSbDEOiFF/GHSbKsn22MJdDJKEhHFK6GV +s8gR2vywRFwG69gIRE4qGhVB+WIg8GJrDpDMYH6lCjMkTrjXuKDUcNlJN3NPLuhJ7tsditwf1pr5 +moJRmGpJnip/rGm0g4o4A6ev4CtePjoao8C1wFtzHkERX9oenhh7cGjDMejU5IrLv8NxFnLj1FpB +9MuF1beTU20NI5oAn6zLiLiOtXjf0ghU3AN4DA== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VELOCE-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +hAsrUfp6Qgjm8yBjNYTEtQmVQmMxzL8TE/3oiQSxSI3+yEkXAbQCXkT9mo+LCdv+fGECOB0istHd +eLtbsiYbxjxNxYkXiUrRE5O+aSxynIray+uF9DJigTEUZu8JJXUbzxK4DDUu1Lm9tpGps4+Prz1m +0gkj13RT/Y/418s2VTw= + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VERIF-SIM-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +BP/54Wm/GJmb1jy0bxWJJX4aiKyiWPVh4X3VL30BQrmX4PlEsNKzBJH3Qu8IIYERfnFP0ifAgboa +vypMQ5Ed0BrMePGkWIgT6I8hxJCMFpHdkSK7m1giSKyZzFfTOrVqoNFXE+qdzLfY1J5hBWCvouYo +jllavK4N3gF9FLScH2AUWYVMcVth2QPaTAU2NLnAUNH8kgtBjBfc8/KbPPTznD1QNVqvFstzcbTA +hGQ1ETVPvINQ0KqxxAG5PRhtQD4+pC+hr/Tvk+RSvGyBOfy9zE86OXkJiYs9dSFhNiMFmCPL9DBO +se4OxNNC0/7aBtb1mkSEA9YFDYEb9jS7Jasy2A== + +`protect key_keyowner="Real Intent", key_keyname="RI-RSA-KEY-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +SnzT9DVH3xlEN8nrr2YrlvTO5qj7L22d7WaBcuKyTaiHoIwwFHrC4HQbfs0TAwkdWcOgmJoATPSF +F6qm0KiddbrlERF3MfKUldeGBJtqLdX+zGw7+3JD7S+HB9dIMOFOHy+IiCZp1/Pz8epKpi238cel +rcVoJQKz406wmXDvOo8KsT+XhRLs9BVCrBErPGGXKYDk6NXAp0duOgQE9DbslzMU83M/kUC7uERV +tQW02240peKQFp2elEZC7Tetvgp0TaFTtJiKN45REi8GQUCKGa85JjNIk1qb/+k95TIIP1xrHirc +6iX7qbwnPetv8TVu2NjkZ0WDEK5RXdOXcxBwHA== + +`protect key_keyowner="Xilinx", key_keyname="xilinxt_2021_07", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +erkR82V0jX8ytva+9MzEs0c75Z7j7TsgxWRLNAUfbbU28i+U9YzuZlSfYU75M0f9jx1gvxtBrfKv +cNHVdkR+i5zfHDZsDwfMEEBhs8wzDCKqe+eex6BBEvlIOesCPXrr2RozQgaQ1PBh/os2Arfu+873 +BjsVxFJkbhpzIqlddOo/XZV9Yi+eih7A7pXXEBR6IL7Poo4Ka49MiVQU0xJrDTm+ddOuMPDRRD7g +dsxS/uzdcBcO2myV6g/7YH/C2Ce9s6+UywJN/0JeXSqwA7bsBqqnfFicVAT0lckLopMLiuzK7dsN +EwhFeqoetciFrDIj9+o0xDMWBZhgNP1u68vURA== + +`protect key_keyowner="Metrics Technologies Inc.", key_keyname="DSim", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +R+BI65BKLT0I9hEtsxGnDyM5XY9gzULeTPOSDXvd3KWOzZJAx6C0xlbyZcFZhAEG/QIK2yd0wAi6 +IUWxyF/sx3HsqKjhVi5KxnpuXDBOZVoj811O7JukedFVmDW7OHGtBkuiJ5X5irw7mfsEKRQmF/1i +V6lj9HYHZEjxtDeZjACsLY4y1QxWalSKT4HIMOHznBLL8dLbGMlS+ZmFuFn0gcwZavVl7gTkTtkf +W0gn01A9ru7NKsf+iLX0kj4dgItPu9N2g02M1vWQ9UUQEVvfV7lUc7GY1suibrD8aEkhH9S7lZ7n +bFsT4qxyvzg8ML6v4g4v7N6VuyhEtgFgNd725Q== + +`protect key_keyowner="Atrenta", key_keyname="ATR-SG-RSA-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=384) +`protect key_block +jNUVKiwH68vHsU54idgvKwaVJcoxTUuxfgrQpbpmM/IpesWA3wHsGzYClwAxkKzw3KRnFyQqTWcZ +yj1EQ2CMBxlJ0kyNbZW8OK8pXzeigToZ0U6Aq3Gy+j7wBbhe83wE1Ygn82sK8dHTEulvaRLn/c5r +ispy1s7jMKIvYNzoUuZrgyBQyfaYmdqUia8XlQjFd+VwzhTXKwzvmaqHWyaHjfBKeCooO7+oUxMG +OJg83W54EVe9ronFQ8Wr9EOL8ia7qelCAgyQe/bC0HHCoMAm8apI7sX23iMR/wMiPP5V2bQzycy+ +rBX/+SWkqSeIE1FLm+muFPvrE7iLwJaW8d1fzdFFjAZ5aIXArbWNfwbK8S0TczXc9lEzmpb69rwA +UJIrs4alo81qGQ32UFhjuMQjX75O9Od1HWHDj5PFaT/Ja5Ly+bK8Cc3gfO6dCE81m7d+B2JBZ/Hl +tBA19QuOAYwT2EIPOdpaVtCULb33cWODWu3qQFhZMmDzKTb3kwpcr0LL + +`protect key_keyowner="Cadence Design Systems.", key_keyname="CDS_RSA_KEY_VER_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +MnzcA2swaxH1LRacKDou0ZmiiMRETbWIdHgeBgyQz7ILronsXLoB/C20WuFNGEVSiL2/51EZ6MXZ +vMHI8fFcMQCJcuTBDBibUMKv6bXI9s8fTbtrBZppbF/R1icG5JYhqmX4aRnv4W/dxJRjI2L35nLN +Y48E9OfgfkD1sr+IRwx8WEKFmUhuk8dLe0VOK7ywe3XEcneYvrz+HhPj16bGmNfMwNnDgZ3gKKZD +hRnys+jzvAX3HyISrErWXhMKrhWMxXeTNFJCqNQ0LWAVHQYwyKnF5xVpyXSuGNSIrva+QXqOrZBG +3VNLirNVtMRiKLfwZeMaqvswkqBDAa53utlAAA== + +`protect key_keyowner="Synplicity", key_keyname="SYNP15_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +d0xXkKtsKM8GvXhDZr16p1+oE3uBtD04BJ76eGGIEj/CFECfHVy9qsJ43oSKjas0+AJr4GFFnVb6 +X7gJV6MmX/OboC9ier5joUCGz0mxVzkRZK9a+LPEDcg0K6+cLE36kr+FfxW9Uk2816EHBCMCf5mK +A4eAhSmAb5Nq74F/q0quiG416npbny7faiQ+xmPDfYYiM3UuMKaD4iE8ODlz1w5xThPllWESf3LZ +NTkw6fozyTqZ47vvE21O3dgIGAY1v+C6BwlCK24VwPJa1xs9csY+qTk31j5jjAc1ExlB6QF7t9UH +lk70qdNPWxT87OH7kFT8UvPO1D6BTC3/WkDZfA== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-PREC-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +LYhdzKTvo93uJrAaiP5OfCDuOnu2BSvPnxlv6I7h2n1+xHtj34LNNKzWEgOg9dUV9cYDaHYUjjEt +DKdWcz6mZ61d5qyxAhpv67fc90v7JVgtOAcT94/Yb+AuLxXFcGA6Gic7uoJtUgz6JmTnb22Dxdjc +KuIewDj4IOTfP8XGXKTaF+cNp0CFrQgTAcVSQFyLFxr0I/9h3S+GZLecA7ntEeHEOfCJzPvy0ddi +7MCdQWECLb+fXC0IAn8V95TumcpINiRAX1BHi9IGJ4QoMrb3jOCrPkFhDMTJj2aiImUWdi/l/0QE +d7wcXlgIEYVeoKYUOJ4mqy+zZPUbLNeOPADUDQ== + +`protect data_method = "AES128-CBC" +`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 63264) +`protect data_block +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 +`protect end_protected +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +entity bram_waveform is + port ( + clka : in STD_LOGIC; + wea : in STD_LOGIC_VECTOR ( 0 to 0 ); + addra : in STD_LOGIC_VECTOR ( 10 downto 0 ); + dina : in STD_LOGIC_VECTOR ( 31 downto 0 ); + douta : out STD_LOGIC_VECTOR ( 31 downto 0 ); + clkb : in STD_LOGIC; + web : in STD_LOGIC_VECTOR ( 0 to 0 ); + addrb : in STD_LOGIC_VECTOR ( 11 downto 0 ); + dinb : in STD_LOGIC_VECTOR ( 15 downto 0 ); + doutb : out STD_LOGIC_VECTOR ( 15 downto 0 ) + ); + attribute NotValidForBitStream : boolean; + attribute NotValidForBitStream of bram_waveform : entity is true; + attribute CHECK_LICENSE_TYPE : string; + attribute CHECK_LICENSE_TYPE of bram_waveform : entity is "bram_waveform,blk_mem_gen_v8_4_5,{}"; + attribute downgradeipidentifiedwarnings : string; + attribute downgradeipidentifiedwarnings of bram_waveform : entity is "yes"; + attribute x_core_info : string; + attribute x_core_info of bram_waveform : entity is "blk_mem_gen_v8_4_5,Vivado 2022.1"; +end bram_waveform; + +architecture STRUCTURE of bram_waveform is + signal NLW_U0_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_rsta_busy_UNCONNECTED : STD_LOGIC; + signal NLW_U0_rstb_busy_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_arready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_awready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_bvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_rlast_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_rvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_wready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_rdaddrecc_UNCONNECTED : STD_LOGIC_VECTOR ( 11 downto 0 ); + signal NLW_U0_s_axi_bid_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_s_axi_bresp_UNCONNECTED : STD_LOGIC_VECTOR ( 1 downto 0 ); + signal NLW_U0_s_axi_rdaddrecc_UNCONNECTED : STD_LOGIC_VECTOR ( 11 downto 0 ); + signal NLW_U0_s_axi_rdata_UNCONNECTED : STD_LOGIC_VECTOR ( 15 downto 0 ); + signal NLW_U0_s_axi_rid_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_s_axi_rresp_UNCONNECTED : STD_LOGIC_VECTOR ( 1 downto 0 ); + attribute C_ADDRA_WIDTH : integer; + attribute C_ADDRA_WIDTH of U0 : label is 11; + attribute C_ADDRB_WIDTH : integer; + attribute C_ADDRB_WIDTH of U0 : label is 12; + attribute C_ALGORITHM : integer; + attribute C_ALGORITHM of U0 : label is 1; + attribute C_AXI_ID_WIDTH : integer; + attribute C_AXI_ID_WIDTH of U0 : label is 4; + attribute C_AXI_SLAVE_TYPE : integer; + attribute C_AXI_SLAVE_TYPE of U0 : label is 0; + attribute C_AXI_TYPE : integer; + attribute C_AXI_TYPE of U0 : label is 1; + attribute C_BYTE_SIZE : integer; + attribute C_BYTE_SIZE of U0 : label is 9; + attribute C_COMMON_CLK : integer; + attribute C_COMMON_CLK of U0 : label is 0; + attribute C_COUNT_18K_BRAM : string; + attribute C_COUNT_18K_BRAM of U0 : label is "0"; + attribute C_COUNT_36K_BRAM : string; + attribute C_COUNT_36K_BRAM of U0 : label is "2"; + attribute C_CTRL_ECC_ALGO : string; + attribute C_CTRL_ECC_ALGO of U0 : label is "NONE"; + attribute C_DEFAULT_DATA : string; + attribute C_DEFAULT_DATA of U0 : label is "0"; + attribute C_DISABLE_WARN_BHV_COLL : integer; + attribute C_DISABLE_WARN_BHV_COLL of U0 : label is 0; + attribute C_DISABLE_WARN_BHV_RANGE : integer; + attribute C_DISABLE_WARN_BHV_RANGE of U0 : label is 0; + attribute C_ELABORATION_DIR : string; + attribute C_ELABORATION_DIR of U0 : label is "./"; + attribute C_ENABLE_32BIT_ADDRESS : integer; + attribute C_ENABLE_32BIT_ADDRESS of U0 : label is 0; + attribute C_EN_DEEPSLEEP_PIN : integer; + attribute C_EN_DEEPSLEEP_PIN of U0 : label is 0; + attribute C_EN_ECC_PIPE : integer; + attribute C_EN_ECC_PIPE of U0 : label is 0; + attribute C_EN_RDADDRA_CHG : integer; + attribute C_EN_RDADDRA_CHG of U0 : label is 0; + attribute C_EN_RDADDRB_CHG : integer; + attribute C_EN_RDADDRB_CHG of U0 : label is 0; + attribute C_EN_SAFETY_CKT : integer; + attribute C_EN_SAFETY_CKT of U0 : label is 0; + attribute C_EN_SHUTDOWN_PIN : integer; + attribute C_EN_SHUTDOWN_PIN of U0 : label is 0; + attribute C_EN_SLEEP_PIN : integer; + attribute C_EN_SLEEP_PIN of U0 : label is 0; + attribute C_EST_POWER_SUMMARY : string; + attribute C_EST_POWER_SUMMARY of U0 : label is "Estimated Power for IP : 6.91608 mW"; + attribute C_FAMILY : string; + attribute C_FAMILY of U0 : label is "zynquplus"; + attribute C_HAS_AXI_ID : integer; + attribute C_HAS_AXI_ID of U0 : label is 0; + attribute C_HAS_ENA : integer; + attribute C_HAS_ENA of U0 : label is 0; + attribute C_HAS_ENB : integer; + attribute C_HAS_ENB of U0 : label is 0; + attribute C_HAS_INJECTERR : integer; + attribute C_HAS_INJECTERR of U0 : label is 0; + attribute C_HAS_MEM_OUTPUT_REGS_A : integer; + attribute C_HAS_MEM_OUTPUT_REGS_A of U0 : label is 0; + attribute C_HAS_MEM_OUTPUT_REGS_B : integer; + attribute C_HAS_MEM_OUTPUT_REGS_B of U0 : label is 0; + attribute C_HAS_MUX_OUTPUT_REGS_A : integer; + attribute C_HAS_MUX_OUTPUT_REGS_A of U0 : label is 0; + attribute C_HAS_MUX_OUTPUT_REGS_B : integer; + attribute C_HAS_MUX_OUTPUT_REGS_B of U0 : label is 0; + attribute C_HAS_REGCEA : integer; + attribute C_HAS_REGCEA of U0 : label is 0; + attribute C_HAS_REGCEB : integer; + attribute C_HAS_REGCEB of U0 : label is 0; + attribute C_HAS_RSTA : integer; + attribute C_HAS_RSTA of U0 : label is 0; + attribute C_HAS_RSTB : integer; + attribute C_HAS_RSTB of U0 : label is 0; + attribute C_HAS_SOFTECC_INPUT_REGS_A : integer; + attribute C_HAS_SOFTECC_INPUT_REGS_A of U0 : label is 0; + attribute C_HAS_SOFTECC_OUTPUT_REGS_B : integer; + attribute C_HAS_SOFTECC_OUTPUT_REGS_B of U0 : label is 0; + attribute C_INITA_VAL : string; + attribute C_INITA_VAL of U0 : label is "0"; + attribute C_INITB_VAL : string; + attribute C_INITB_VAL of U0 : label is "0"; + attribute C_INIT_FILE : string; + attribute C_INIT_FILE of U0 : label is "bram_waveform.mem"; + attribute C_INIT_FILE_NAME : string; + attribute C_INIT_FILE_NAME of U0 : label is "no_coe_file_loaded"; + attribute C_INTERFACE_TYPE : integer; + attribute C_INTERFACE_TYPE of U0 : label is 0; + attribute C_LOAD_INIT_FILE : integer; + attribute C_LOAD_INIT_FILE of U0 : label is 0; + attribute C_MEM_TYPE : integer; + attribute C_MEM_TYPE of U0 : label is 2; + attribute C_MUX_PIPELINE_STAGES : integer; + attribute C_MUX_PIPELINE_STAGES of U0 : label is 0; + attribute C_PRIM_TYPE : integer; + attribute C_PRIM_TYPE of U0 : label is 1; + attribute C_READ_DEPTH_A : integer; + attribute C_READ_DEPTH_A of U0 : label is 2048; + attribute C_READ_DEPTH_B : integer; + attribute C_READ_DEPTH_B of U0 : label is 4096; + attribute C_READ_LATENCY_A : integer; + attribute C_READ_LATENCY_A of U0 : label is 1; + attribute C_READ_LATENCY_B : integer; + attribute C_READ_LATENCY_B of U0 : label is 1; + attribute C_READ_WIDTH_A : integer; + attribute C_READ_WIDTH_A of U0 : label is 32; + attribute C_READ_WIDTH_B : integer; + attribute C_READ_WIDTH_B of U0 : label is 16; + attribute C_RSTRAM_A : integer; + attribute C_RSTRAM_A of U0 : label is 0; + attribute C_RSTRAM_B : integer; + attribute C_RSTRAM_B of U0 : label is 0; + attribute C_RST_PRIORITY_A : string; + attribute C_RST_PRIORITY_A of U0 : label is "CE"; + attribute C_RST_PRIORITY_B : string; + attribute C_RST_PRIORITY_B of U0 : label is "CE"; + attribute C_SIM_COLLISION_CHECK : string; + attribute C_SIM_COLLISION_CHECK of U0 : label is "ALL"; + attribute C_USE_BRAM_BLOCK : integer; + attribute C_USE_BRAM_BLOCK of U0 : label is 0; + attribute C_USE_BYTE_WEA : integer; + attribute C_USE_BYTE_WEA of U0 : label is 0; + attribute C_USE_BYTE_WEB : integer; + attribute C_USE_BYTE_WEB of U0 : label is 0; + attribute C_USE_DEFAULT_DATA : integer; + attribute C_USE_DEFAULT_DATA of U0 : label is 0; + attribute C_USE_ECC : integer; + attribute C_USE_ECC of U0 : label is 0; + attribute C_USE_SOFTECC : integer; + attribute C_USE_SOFTECC of U0 : label is 0; + attribute C_USE_URAM : integer; + attribute C_USE_URAM of U0 : label is 0; + attribute C_WEA_WIDTH : integer; + attribute C_WEA_WIDTH of U0 : label is 1; + attribute C_WEB_WIDTH : integer; + attribute C_WEB_WIDTH of U0 : label is 1; + attribute C_WRITE_DEPTH_A : integer; + attribute C_WRITE_DEPTH_A of U0 : label is 2048; + attribute C_WRITE_DEPTH_B : integer; + attribute C_WRITE_DEPTH_B of U0 : label is 4096; + attribute C_WRITE_MODE_A : string; + attribute C_WRITE_MODE_A of U0 : label is "WRITE_FIRST"; + attribute C_WRITE_MODE_B : string; + attribute C_WRITE_MODE_B of U0 : label is "WRITE_FIRST"; + attribute C_WRITE_WIDTH_A : integer; + attribute C_WRITE_WIDTH_A of U0 : label is 32; + attribute C_WRITE_WIDTH_B : integer; + attribute C_WRITE_WIDTH_B of U0 : label is 16; + attribute C_XDEVICEFAMILY : string; + attribute C_XDEVICEFAMILY of U0 : label is "zynquplus"; + attribute downgradeipidentifiedwarnings of U0 : label is "yes"; + attribute is_du_within_envelope : string; + attribute is_du_within_envelope of U0 : label is "true"; + attribute x_interface_info : string; + attribute x_interface_info of clka : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA CLK"; + attribute x_interface_parameter : string; + attribute x_interface_parameter of clka : signal is "XIL_INTERFACENAME BRAM_PORTA, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER, READ_LATENCY 1"; + attribute x_interface_info of clkb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB CLK"; + attribute x_interface_parameter of clkb : signal is "XIL_INTERFACENAME BRAM_PORTB, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER, READ_LATENCY 1"; + attribute x_interface_info of addra : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA ADDR"; + attribute x_interface_info of addrb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB ADDR"; + attribute x_interface_info of dina : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA DIN"; + attribute x_interface_info of dinb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB DIN"; + attribute x_interface_info of douta : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT"; + attribute x_interface_info of doutb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB DOUT"; + attribute x_interface_info of wea : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA WE"; + attribute x_interface_info of web : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB WE"; +begin +U0: entity work.bram_waveform_blk_mem_gen_v8_4_5 + port map ( + addra(10 downto 0) => addra(10 downto 0), + addrb(11 downto 0) => addrb(11 downto 0), + clka => clka, + clkb => clkb, + dbiterr => NLW_U0_dbiterr_UNCONNECTED, + deepsleep => '0', + dina(31 downto 0) => dina(31 downto 0), + dinb(15 downto 0) => dinb(15 downto 0), + douta(31 downto 0) => douta(31 downto 0), + doutb(15 downto 0) => doutb(15 downto 0), + eccpipece => '0', + ena => '0', + enb => '0', + injectdbiterr => '0', + injectsbiterr => '0', + rdaddrecc(11 downto 0) => NLW_U0_rdaddrecc_UNCONNECTED(11 downto 0), + regcea => '0', + regceb => '0', + rsta => '0', + rsta_busy => NLW_U0_rsta_busy_UNCONNECTED, + rstb => '0', + rstb_busy => NLW_U0_rstb_busy_UNCONNECTED, + s_aclk => '0', + s_aresetn => '0', + s_axi_araddr(31 downto 0) => B"00000000000000000000000000000000", + s_axi_arburst(1 downto 0) => B"00", + s_axi_arid(3 downto 0) => B"0000", + s_axi_arlen(7 downto 0) => B"00000000", + s_axi_arready => NLW_U0_s_axi_arready_UNCONNECTED, + s_axi_arsize(2 downto 0) => B"000", + s_axi_arvalid => '0', + s_axi_awaddr(31 downto 0) => B"00000000000000000000000000000000", + s_axi_awburst(1 downto 0) => B"00", + s_axi_awid(3 downto 0) => B"0000", + s_axi_awlen(7 downto 0) => B"00000000", + s_axi_awready => NLW_U0_s_axi_awready_UNCONNECTED, + s_axi_awsize(2 downto 0) => B"000", + s_axi_awvalid => '0', + s_axi_bid(3 downto 0) => NLW_U0_s_axi_bid_UNCONNECTED(3 downto 0), + s_axi_bready => '0', + s_axi_bresp(1 downto 0) => NLW_U0_s_axi_bresp_UNCONNECTED(1 downto 0), + s_axi_bvalid => NLW_U0_s_axi_bvalid_UNCONNECTED, + s_axi_dbiterr => NLW_U0_s_axi_dbiterr_UNCONNECTED, + s_axi_injectdbiterr => '0', + s_axi_injectsbiterr => '0', + s_axi_rdaddrecc(11 downto 0) => NLW_U0_s_axi_rdaddrecc_UNCONNECTED(11 downto 0), + s_axi_rdata(15 downto 0) => NLW_U0_s_axi_rdata_UNCONNECTED(15 downto 0), + s_axi_rid(3 downto 0) => NLW_U0_s_axi_rid_UNCONNECTED(3 downto 0), + s_axi_rlast => NLW_U0_s_axi_rlast_UNCONNECTED, + s_axi_rready => '0', + s_axi_rresp(1 downto 0) => NLW_U0_s_axi_rresp_UNCONNECTED(1 downto 0), + s_axi_rvalid => NLW_U0_s_axi_rvalid_UNCONNECTED, + s_axi_sbiterr => NLW_U0_s_axi_sbiterr_UNCONNECTED, + s_axi_wdata(31 downto 0) => B"00000000000000000000000000000000", + s_axi_wlast => '0', + s_axi_wready => NLW_U0_s_axi_wready_UNCONNECTED, + s_axi_wstrb(0) => '0', + s_axi_wvalid => '0', + sbiterr => NLW_U0_sbiterr_UNCONNECTED, + shutdown => '0', + sleep => '0', + wea(0) => wea(0), + web(0) => web(0) + ); +end STRUCTURE; diff --git a/src/hdl/ip_gen/fifo_data_to_stream_sim_netlist.vhdl b/src/hdl/ip_gen/fifo_data_to_stream_sim_netlist.vhdl new file mode 100644 index 0000000..1de3735 --- /dev/null +++ b/src/hdl/ip_gen/fifo_data_to_stream_sim_netlist.vhdl @@ -0,0 +1,2207 @@ +-- Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. +-- -------------------------------------------------------------------------------- +-- Tool Version: Vivado v.2022.1 (win64) Build 3526262 Mon Apr 18 15:48:16 MDT 2022 +-- Date : Thu Dec 21 15:40:18 2023 +-- Host : SURFACE-EY20NA6 running 64-bit major release (build 9200) +-- Command : write_vhdl -force -mode funcsim +-- c:/Users/yuhc2/Documents/GitHub/NANOQ_Laser_EYHC/prj/zcu_pulse_channel.gen/sources_1/ip/fifo_data_to_stream/fifo_data_to_stream_sim_netlist.vhdl +-- Design : fifo_data_to_stream +-- Purpose : This VHDL netlist is a functional simulation representation of the design and should not be modified or +-- synthesized. This netlist cannot be used for SDF annotated simulation. +-- Device : xczu9eg-ffvb1156-2-e +-- -------------------------------------------------------------------------------- +`protect begin_protected +`protect version = 1 +`protect encrypt_agent = "XILINX" +`protect encrypt_agent_info = "Xilinx Encryption Tool 2022.1" +`protect key_keyowner="Synopsys", key_keyname="SNPS-VCS-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +h4/8v0FBgXUomE5kJVs58UlO/ao4SLHpniPXt+fomPPYB6tv3U0iBfOL5737ZNNEhgP1kkKeMvq+ +VxOLW94g7JZT6mWc5ZuQ7jgK8Qpa6+1xpVVQBB6gVSEeHij7ZHqPdYaLC9rL/SR7notnBC1OujFi +++mTu5z/HJZtnN4VJQw= + +`protect key_keyowner="Aldec", key_keyname="ALDEC15_001", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +Su6POoQw092/hg4JN8GOCSrLUa435VAUaqUned4C4G61yBHlUmaG63UO+KxY5pgyMrDH6/XH2bPa +fona2wB0Y0sw6W61PXOfiew7cH42baMY0P9UBRjH25EZTf72W3O8r7DNj16ob9pPi7bkuCd3aab3 +hdfeY613n+hUbAXTLQqbhjqGmO9kFeC/VmdSITa02RauMnpfVxz1wLu9iUQ0V+mPTp6hvfNXlD0F +7oONLZJg+c6/+uSw1WbEiltO2Lplqvbb0sYbZjtTSEQZSdF4DiUdA0SGK+L75aDYGx3Z/ajCRpBx +Mr39wb5wiDr6SJ/QQ/JmYc+HrTs/fbN9BJ/Grg== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VELOCE-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +JbOromwhdJgnOFMOfO8mpnyFC1anQPoDL/XeHYQuoY4+0yjNmPGasGLGjanpoUgfOYngBHPrFFFH +rapGBPsHEbT6JXWHeRJexf2moVhmq1sHJ7n+Jx1rVNuyclUCC08Fg3sy6FdUQmptKSpqOw1x0DV8 +R9ZlmwLTkoN8IV6D7sg= + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VERIF-SIM-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +XbCcyKbk3pmZ92QhZ1iCj+9jpzUJAn91N3YYwVHN3gwcgTU0NRr0oD7EmkLoZ8hVAhh/9YMUp7DE +059wcAzCBsD2W3CWY+GHUSJS57Xt2yi9tZH7binajEyHpCqaFKKO9WxDTO9XnYLVswRvAii0DOJL +mY+z3Z0uDx55BVWqbbvDkA5gABsZLueFt15rXRJPRnAjzWXhYzjiqC1WQDy5UHl/LBDlsOMuouyd +gM4k7zzEZUOy4o1sI2isD+6T/wd+iOsXvq39rguDUtkw3SR4GJmk+rBu3rBh+EvBHKxaWqQjGGNV +qWyrqd89LjZFGnXZ2jvsgxldJWCellgTK1ZEfA== + +`protect key_keyowner="Real Intent", key_keyname="RI-RSA-KEY-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +dG5h8R2Fe36rfzcvmeDU4OapeKO/Lhe0DkL+4c9AG4It+1yVmtHeEWL8eVWMvHdPTwqJqgkMQbh4 +OO9/9XZMyYCWFJTHu4ossKo7zKccfTeBbKfgP+rDEckDTGIWXihj2YJ2N0p6q9Ynpsz9qOLdoXTY +gZXwoOe4MrZBJWZrDOqkD1hQ+cRUV9c8S6FlH+AyBNj5dlaAM0Jyq6a8TvcRmLoZfdi1zFWXeTUW +/XfWQRP+vnqqV8VPdyfaJJzaKnG1u9PnvSFauc3SzydGZfICacU2pPxqAaJWzDYwSns+vd4vCu7u +e01UXo4XXeFCvO/9mye0QnyrDHhuE0b1Svw/jQ== + +`protect key_keyowner="Xilinx", key_keyname="xilinxt_2021_07", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +K8hvyEyHvgdg02DFF2GnEdLUq6j/uKT5fsI+Nkpbw14CRrq5p+STF83Or85VDleAax2TYln4LhGn +6G6INbZ4BdMuA4nVtyx5xaogScfMwbjrTAn0bqxT20M++g4cn4gW2g3oEFMnXaYCsLaJ58t4/T42 +ocO8oqJeCowKICP/eM+B+/jSusNp4JILdp522MKky1zANadPwlv8a7QrMrJQrnb/lF8qC10yXqfM +LbKfbAEBaHlel46y7YBqdIimfeAVng194wkXobD6WuMhQOpFkigBOLQzoKQWN1TWeY5/rSQt9pcT +xLm+NEQmtlL61OudMCIqm++dCQSgE4NFJj1fCw== + +`protect key_keyowner="Metrics Technologies Inc.", key_keyname="DSim", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +gSLVZdmdCqRy/3LoTp5M48T1hUUfGQp8cxVz4NQ+P65mrZ0oJJXHSaNbzdvtYH41+27aGh3RBbLb +pzz+TmeVuEVneG5nGe1VY2ogM1D7tBMRUvNgXK2PkSRLnk9tYgnxoYi0cYLBxa3piqBh44cdYXif +bT0Uh2vFogmdeH5hxVNFk8FEhULNtR/T9r9ilPNDQALb08fQM461sjlhS2jgRgH0X8LZqnBOii+F +7+GguDMENTlzU0XSYWEcGFH9V5PdYMehb0WgZeiqTchxRuQFmLjDhI4J5dkci8RmkLCwz4KyjfOi +S8Nkg20qh9otuAisfQTh4Qx2lC7x7BHgmuwy0w== + +`protect key_keyowner="Atrenta", key_keyname="ATR-SG-RSA-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=384) +`protect key_block +kXlkvzJI7Tq1glqNfjqmCb8YU69bhN9hH5OsWvFNj7VseyX6/5l9Mgif4B1r1LeKz06I27dmB9g7 +AuHBFZ0bPN86mURBL/HK/dTOGyLYAveWeOIK1kqX56i4H9UNIUObEphcz9wdT0OgXHTPMxiIpJhT +1o5oYJW49mDsAv5yxe4FvPo6rFgZAiEo34vJGDxzz4//zJq0z+GxJNCibpLydZBWaJWRfsDUs9pm +1O6hS3KPIL5Evg1JOFt1uwKb1xEA08ETT+qYwg6zmFfwQbs6O7modRmBtEd1n9mrqsgCAviiLPtN +LUFiLdrywPt7LArLCRz4h5uHJxz/21Pj5m1VZtZq9nFmsbp6Lw/0RF1+nN8o+RIu+/tmu74xkL/8 +nNEc9mEFy912OKP6WDP4Ajzg4gl9xhtaYA5eGkNB/43YjgGsmTe+L0dyxHIwa734JNMb5zC5dRtR +V4pCnWZKmnDJDXvMftedQzqQvdFwJg5hLxrHfkPD8LqiOwVck/Nt6QSF + +`protect key_keyowner="Cadence Design Systems.", key_keyname="CDS_RSA_KEY_VER_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +ADtaDIjUIR6zZBfz+lPRaDMdXcoufPACX4aSe06/DoTgIDvM+UOlm8rH20gKO3r8YdsuLtUh7rhz +ekJB22nBPUdbl3FvlGdQIgiCyJ8XgZYvvuOo9I765yKjFxQsFmQE0Ih86fqCqvYmRnsZkpk1uQ7v +JpqhWGBX6tLgYu/txP+ShnzFfkWGhj29JhYII0zqJMBCjGeM89F+mlH+X/YL5Q/fZYyh9Cr2CJx6 +ofJpBZ1SPlXwgafXVi0QAUVuQEBmZYVn9Kze++tMEr6qv62ANq23LevYQfCsYKoY5iyf5U7jJ5Qx +eC9nG5Es4y6lz5giep7veaXdBFBHd7VuD56v4w== + +`protect key_keyowner="Synplicity", key_keyname="SYNP15_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +zFwVPvNmX5sBruiGDSfENTp6EBfydwYKhxWi0YDKQ4j0gu6AMV8yJP6GXeJs/A9Zgb1UFE+sJifk +OngE9N2vVRp43pAVauHQf1hUkSWPDJuZ9yEQZbR7F3mmiBKu/Aehj7KcAjv07FWv46HzxRL9E2xx +gpDOzAyNSNubxORv7bVYUV0C4Fr+tZRA6douG4rxi56npPfzIAZjyU4wPvwabxrJ9L4ZRuZXciLk +lJGTIJZTH2uclPmuo57jlIXGo1ZtQZgRCDfn7W02AQ7MDKblx47m+E+sUKKYHZlvf30GkPcwlucZ +ZcUcGnYaRCZnrhwFl0qxxXn2pO15vG4MJXOHMw== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-PREC-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +Lq86c/0SMuvdLuij6dbfI/ah4/50WGATVNRwXobLfbnZqWOhhEk3VDQATTxe7ZLrUauwrLuMoKhS +j4kqT2raqDijA51Tz7ee+F/MUKvyxGDJqfBi5JJX9y81LCXav7HpdRiPTy6w5O3tQoQbugh61D0B +oJBwNvL22Oi10e+Bu7H1yQvsbksxPAA8VE8HK+OJzZETk0PfHS2ySL5WXLQf7duD6CWmpWdLMrZQ +ojOqvNL31LsO1gZhssTk4RgyZUrZ3CboBbLWDxq2L/SsF5YiRIUPDTe17rRcrxa1y6LzMD/ve/nR +mptJOGxlUgLpJaPAA7jH3b+EQGlrHzHOsG8fFQ== + +`protect data_method = "AES128-CBC" +`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 73440) +`protect data_block +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 +53CnBJI0H5+yXp2qRemBfFW3aetVVUkR +`protect end_protected +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +entity fifo_data_to_stream is + port ( + clk : in STD_LOGIC; + srst : in STD_LOGIC; + din : in STD_LOGIC_VECTOR ( 31 downto 0 ); + wr_en : in STD_LOGIC; + rd_en : in STD_LOGIC; + dout : out STD_LOGIC_VECTOR ( 15 downto 0 ); + full : out STD_LOGIC; + empty : out STD_LOGIC; + wr_rst_busy : out STD_LOGIC; + rd_rst_busy : out STD_LOGIC + ); + attribute NotValidForBitStream : boolean; + attribute NotValidForBitStream of fifo_data_to_stream : entity is true; + attribute CHECK_LICENSE_TYPE : string; + attribute CHECK_LICENSE_TYPE of fifo_data_to_stream : entity is "fifo_data_to_stream,fifo_generator_v13_2_7,{}"; + attribute downgradeipidentifiedwarnings : string; + attribute downgradeipidentifiedwarnings of fifo_data_to_stream : entity is "yes"; + attribute x_core_info : string; + attribute x_core_info of fifo_data_to_stream : entity is "fifo_generator_v13_2_7,Vivado 2022.1"; +end fifo_data_to_stream; + +architecture STRUCTURE of fifo_data_to_stream is + signal NLW_U0_almost_empty_UNCONNECTED : STD_LOGIC; + signal NLW_U0_almost_full_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_ar_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_ar_overflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_ar_prog_empty_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_ar_prog_full_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_ar_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_ar_underflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_aw_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_aw_overflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_aw_prog_empty_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_aw_prog_full_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_aw_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_aw_underflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_b_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_b_overflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_b_prog_empty_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_b_prog_full_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_b_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_b_underflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_r_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_r_overflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_r_prog_empty_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_r_prog_full_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_r_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_r_underflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_w_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_w_overflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_w_prog_empty_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_w_prog_full_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_w_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_w_underflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axis_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axis_overflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axis_prog_empty_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axis_prog_full_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axis_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axis_underflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_dbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_m_axi_arvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_m_axi_awvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_m_axi_bready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_m_axi_rready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_m_axi_wlast_UNCONNECTED : STD_LOGIC; + signal NLW_U0_m_axi_wvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_m_axis_tlast_UNCONNECTED : STD_LOGIC; + signal NLW_U0_m_axis_tvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_overflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_prog_empty_UNCONNECTED : STD_LOGIC; + signal NLW_U0_prog_full_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_arready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_awready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_bvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_rlast_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_rvalid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axi_wready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_s_axis_tready_UNCONNECTED : STD_LOGIC; + signal NLW_U0_sbiterr_UNCONNECTED : STD_LOGIC; + signal NLW_U0_underflow_UNCONNECTED : STD_LOGIC; + signal NLW_U0_valid_UNCONNECTED : STD_LOGIC; + signal NLW_U0_wr_ack_UNCONNECTED : STD_LOGIC; + signal NLW_U0_axi_ar_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 4 downto 0 ); + signal NLW_U0_axi_ar_rd_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 4 downto 0 ); + signal NLW_U0_axi_ar_wr_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 4 downto 0 ); + signal NLW_U0_axi_aw_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 4 downto 0 ); + signal NLW_U0_axi_aw_rd_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 4 downto 0 ); + signal NLW_U0_axi_aw_wr_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 4 downto 0 ); + signal NLW_U0_axi_b_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 4 downto 0 ); + signal NLW_U0_axi_b_rd_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 4 downto 0 ); + signal NLW_U0_axi_b_wr_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 4 downto 0 ); + signal NLW_U0_axi_r_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 10 downto 0 ); + signal NLW_U0_axi_r_rd_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 10 downto 0 ); + signal NLW_U0_axi_r_wr_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 10 downto 0 ); + signal NLW_U0_axi_w_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 10 downto 0 ); + signal NLW_U0_axi_w_rd_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 10 downto 0 ); + signal NLW_U0_axi_w_wr_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 10 downto 0 ); + signal NLW_U0_axis_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 10 downto 0 ); + signal NLW_U0_axis_rd_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 10 downto 0 ); + signal NLW_U0_axis_wr_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 10 downto 0 ); + signal NLW_U0_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 8 downto 0 ); + signal NLW_U0_m_axi_araddr_UNCONNECTED : STD_LOGIC_VECTOR ( 31 downto 0 ); + signal NLW_U0_m_axi_arburst_UNCONNECTED : STD_LOGIC_VECTOR ( 1 downto 0 ); + signal NLW_U0_m_axi_arcache_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_m_axi_arid_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axi_arlen_UNCONNECTED : STD_LOGIC_VECTOR ( 7 downto 0 ); + signal NLW_U0_m_axi_arlock_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axi_arprot_UNCONNECTED : STD_LOGIC_VECTOR ( 2 downto 0 ); + signal NLW_U0_m_axi_arqos_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_m_axi_arregion_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_m_axi_arsize_UNCONNECTED : STD_LOGIC_VECTOR ( 2 downto 0 ); + signal NLW_U0_m_axi_aruser_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axi_awaddr_UNCONNECTED : STD_LOGIC_VECTOR ( 31 downto 0 ); + signal NLW_U0_m_axi_awburst_UNCONNECTED : STD_LOGIC_VECTOR ( 1 downto 0 ); + signal NLW_U0_m_axi_awcache_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_m_axi_awid_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axi_awlen_UNCONNECTED : STD_LOGIC_VECTOR ( 7 downto 0 ); + signal NLW_U0_m_axi_awlock_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axi_awprot_UNCONNECTED : STD_LOGIC_VECTOR ( 2 downto 0 ); + signal NLW_U0_m_axi_awqos_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_m_axi_awregion_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_m_axi_awsize_UNCONNECTED : STD_LOGIC_VECTOR ( 2 downto 0 ); + signal NLW_U0_m_axi_awuser_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axi_wdata_UNCONNECTED : STD_LOGIC_VECTOR ( 63 downto 0 ); + signal NLW_U0_m_axi_wid_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axi_wstrb_UNCONNECTED : STD_LOGIC_VECTOR ( 7 downto 0 ); + signal NLW_U0_m_axi_wuser_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axis_tdata_UNCONNECTED : STD_LOGIC_VECTOR ( 7 downto 0 ); + signal NLW_U0_m_axis_tdest_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axis_tid_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axis_tkeep_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axis_tstrb_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_m_axis_tuser_UNCONNECTED : STD_LOGIC_VECTOR ( 3 downto 0 ); + signal NLW_U0_rd_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 9 downto 0 ); + signal NLW_U0_s_axi_bid_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_s_axi_bresp_UNCONNECTED : STD_LOGIC_VECTOR ( 1 downto 0 ); + signal NLW_U0_s_axi_buser_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_s_axi_rdata_UNCONNECTED : STD_LOGIC_VECTOR ( 63 downto 0 ); + signal NLW_U0_s_axi_rid_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_s_axi_rresp_UNCONNECTED : STD_LOGIC_VECTOR ( 1 downto 0 ); + signal NLW_U0_s_axi_ruser_UNCONNECTED : STD_LOGIC_VECTOR ( 0 to 0 ); + signal NLW_U0_wr_data_count_UNCONNECTED : STD_LOGIC_VECTOR ( 8 downto 0 ); + attribute C_ADD_NGC_CONSTRAINT : integer; + attribute C_ADD_NGC_CONSTRAINT of U0 : label is 0; + attribute C_APPLICATION_TYPE_AXIS : integer; + attribute C_APPLICATION_TYPE_AXIS of U0 : label is 0; + attribute C_APPLICATION_TYPE_RACH : integer; + attribute C_APPLICATION_TYPE_RACH of U0 : label is 0; + attribute C_APPLICATION_TYPE_RDCH : integer; + attribute C_APPLICATION_TYPE_RDCH of U0 : label is 0; + attribute C_APPLICATION_TYPE_WACH : integer; + attribute C_APPLICATION_TYPE_WACH of U0 : label is 0; + attribute C_APPLICATION_TYPE_WDCH : integer; + attribute C_APPLICATION_TYPE_WDCH of U0 : label is 0; + attribute C_APPLICATION_TYPE_WRCH : integer; + attribute C_APPLICATION_TYPE_WRCH of U0 : label is 0; + attribute C_AXIS_TDATA_WIDTH : integer; + attribute C_AXIS_TDATA_WIDTH of U0 : label is 8; + attribute C_AXIS_TDEST_WIDTH : integer; + attribute C_AXIS_TDEST_WIDTH of U0 : label is 1; + attribute C_AXIS_TID_WIDTH : integer; + attribute C_AXIS_TID_WIDTH of U0 : label is 1; + attribute C_AXIS_TKEEP_WIDTH : integer; + attribute C_AXIS_TKEEP_WIDTH of U0 : label is 1; + attribute C_AXIS_TSTRB_WIDTH : integer; + attribute C_AXIS_TSTRB_WIDTH of U0 : label is 1; + attribute C_AXIS_TUSER_WIDTH : integer; + attribute C_AXIS_TUSER_WIDTH of U0 : label is 4; + attribute C_AXIS_TYPE : integer; + attribute C_AXIS_TYPE of U0 : label is 0; + attribute C_AXI_ADDR_WIDTH : integer; + attribute C_AXI_ADDR_WIDTH of U0 : label is 32; + attribute C_AXI_ARUSER_WIDTH : integer; + attribute C_AXI_ARUSER_WIDTH of U0 : label is 1; + attribute C_AXI_AWUSER_WIDTH : integer; + attribute C_AXI_AWUSER_WIDTH of U0 : label is 1; + attribute C_AXI_BUSER_WIDTH : integer; + attribute C_AXI_BUSER_WIDTH of U0 : label is 1; + attribute C_AXI_DATA_WIDTH : integer; + attribute C_AXI_DATA_WIDTH of U0 : label is 64; + attribute C_AXI_ID_WIDTH : integer; + attribute C_AXI_ID_WIDTH of U0 : label is 1; + attribute C_AXI_LEN_WIDTH : integer; + attribute C_AXI_LEN_WIDTH of U0 : label is 8; + attribute C_AXI_LOCK_WIDTH : integer; + attribute C_AXI_LOCK_WIDTH of U0 : label is 1; + attribute C_AXI_RUSER_WIDTH : integer; + attribute C_AXI_RUSER_WIDTH of U0 : label is 1; + attribute C_AXI_TYPE : integer; + attribute C_AXI_TYPE of U0 : label is 1; + attribute C_AXI_WUSER_WIDTH : integer; + attribute C_AXI_WUSER_WIDTH of U0 : label is 1; + attribute C_COMMON_CLOCK : integer; + attribute C_COMMON_CLOCK of U0 : label is 1; + attribute C_COUNT_TYPE : integer; + attribute C_COUNT_TYPE of U0 : label is 0; + attribute C_DATA_COUNT_WIDTH : integer; + attribute C_DATA_COUNT_WIDTH of U0 : label is 9; + attribute C_DEFAULT_VALUE : string; + attribute C_DEFAULT_VALUE of U0 : label is "BlankString"; + attribute C_DIN_WIDTH : integer; + attribute C_DIN_WIDTH of U0 : label is 32; + attribute C_DIN_WIDTH_AXIS : integer; + attribute C_DIN_WIDTH_AXIS of U0 : label is 1; + attribute C_DIN_WIDTH_RACH : integer; + attribute C_DIN_WIDTH_RACH of U0 : label is 32; + attribute C_DIN_WIDTH_RDCH : integer; + attribute C_DIN_WIDTH_RDCH of U0 : label is 64; + attribute C_DIN_WIDTH_WACH : integer; + attribute C_DIN_WIDTH_WACH of U0 : label is 1; + attribute C_DIN_WIDTH_WDCH : integer; + attribute C_DIN_WIDTH_WDCH of U0 : label is 64; + attribute C_DIN_WIDTH_WRCH : integer; + attribute C_DIN_WIDTH_WRCH of U0 : label is 2; + attribute C_DOUT_RST_VAL : string; + attribute C_DOUT_RST_VAL of U0 : label is "0"; + attribute C_DOUT_WIDTH : integer; + attribute C_DOUT_WIDTH of U0 : label is 16; + attribute C_ENABLE_RLOCS : integer; + attribute C_ENABLE_RLOCS of U0 : label is 0; + attribute C_ENABLE_RST_SYNC : integer; + attribute C_ENABLE_RST_SYNC of U0 : label is 1; + attribute C_EN_SAFETY_CKT : integer; + attribute C_EN_SAFETY_CKT of U0 : label is 0; + attribute C_ERROR_INJECTION_TYPE : integer; + attribute C_ERROR_INJECTION_TYPE of U0 : label is 0; + attribute C_ERROR_INJECTION_TYPE_AXIS : integer; + attribute C_ERROR_INJECTION_TYPE_AXIS of U0 : label is 0; + attribute C_ERROR_INJECTION_TYPE_RACH : integer; + attribute C_ERROR_INJECTION_TYPE_RACH of U0 : label is 0; + attribute C_ERROR_INJECTION_TYPE_RDCH : integer; + attribute C_ERROR_INJECTION_TYPE_RDCH of U0 : label is 0; + attribute C_ERROR_INJECTION_TYPE_WACH : integer; + attribute C_ERROR_INJECTION_TYPE_WACH of U0 : label is 0; + attribute C_ERROR_INJECTION_TYPE_WDCH : integer; + attribute C_ERROR_INJECTION_TYPE_WDCH of U0 : label is 0; + attribute C_ERROR_INJECTION_TYPE_WRCH : integer; + attribute C_ERROR_INJECTION_TYPE_WRCH of U0 : label is 0; + attribute C_FAMILY : string; + attribute C_FAMILY of U0 : label is "zynquplus"; + attribute C_FULL_FLAGS_RST_VAL : integer; + attribute C_FULL_FLAGS_RST_VAL of U0 : label is 0; + attribute C_HAS_ALMOST_EMPTY : integer; + attribute C_HAS_ALMOST_EMPTY of U0 : label is 0; + attribute C_HAS_ALMOST_FULL : integer; + attribute C_HAS_ALMOST_FULL of U0 : label is 0; + attribute C_HAS_AXIS_TDATA : integer; + attribute C_HAS_AXIS_TDATA of U0 : label is 1; + attribute C_HAS_AXIS_TDEST : integer; + attribute C_HAS_AXIS_TDEST of U0 : label is 0; + attribute C_HAS_AXIS_TID : integer; + attribute C_HAS_AXIS_TID of U0 : label is 0; + attribute C_HAS_AXIS_TKEEP : integer; + attribute C_HAS_AXIS_TKEEP of U0 : label is 0; + attribute C_HAS_AXIS_TLAST : integer; + attribute C_HAS_AXIS_TLAST of U0 : label is 0; + attribute C_HAS_AXIS_TREADY : integer; + attribute C_HAS_AXIS_TREADY of U0 : label is 1; + attribute C_HAS_AXIS_TSTRB : integer; + attribute C_HAS_AXIS_TSTRB of U0 : label is 0; + attribute C_HAS_AXIS_TUSER : integer; + attribute C_HAS_AXIS_TUSER of U0 : label is 1; + attribute C_HAS_AXI_ARUSER : integer; + attribute C_HAS_AXI_ARUSER of U0 : label is 0; + attribute C_HAS_AXI_AWUSER : integer; + attribute C_HAS_AXI_AWUSER of U0 : label is 0; + attribute C_HAS_AXI_BUSER : integer; + attribute C_HAS_AXI_BUSER of U0 : label is 0; + attribute C_HAS_AXI_ID : integer; + attribute C_HAS_AXI_ID of U0 : label is 0; + attribute C_HAS_AXI_RD_CHANNEL : integer; + attribute C_HAS_AXI_RD_CHANNEL of U0 : label is 1; + attribute C_HAS_AXI_RUSER : integer; + attribute C_HAS_AXI_RUSER of U0 : label is 0; + attribute C_HAS_AXI_WR_CHANNEL : integer; + attribute C_HAS_AXI_WR_CHANNEL of U0 : label is 1; + attribute C_HAS_AXI_WUSER : integer; + attribute C_HAS_AXI_WUSER of U0 : label is 0; + attribute C_HAS_BACKUP : integer; + attribute C_HAS_BACKUP of U0 : label is 0; + attribute C_HAS_DATA_COUNT : integer; + attribute C_HAS_DATA_COUNT of U0 : label is 0; + attribute C_HAS_DATA_COUNTS_AXIS : integer; + attribute C_HAS_DATA_COUNTS_AXIS of U0 : label is 0; + attribute C_HAS_DATA_COUNTS_RACH : integer; + attribute C_HAS_DATA_COUNTS_RACH of U0 : label is 0; + attribute C_HAS_DATA_COUNTS_RDCH : integer; + attribute C_HAS_DATA_COUNTS_RDCH of U0 : label is 0; + attribute C_HAS_DATA_COUNTS_WACH : integer; + attribute C_HAS_DATA_COUNTS_WACH of U0 : label is 0; + attribute C_HAS_DATA_COUNTS_WDCH : integer; + attribute C_HAS_DATA_COUNTS_WDCH of U0 : label is 0; + attribute C_HAS_DATA_COUNTS_WRCH : integer; + attribute C_HAS_DATA_COUNTS_WRCH of U0 : label is 0; + attribute C_HAS_INT_CLK : integer; + attribute C_HAS_INT_CLK of U0 : label is 0; + attribute C_HAS_MASTER_CE : integer; + attribute C_HAS_MASTER_CE of U0 : label is 0; + attribute C_HAS_MEMINIT_FILE : integer; + attribute C_HAS_MEMINIT_FILE of U0 : label is 0; + attribute C_HAS_OVERFLOW : integer; + attribute C_HAS_OVERFLOW of U0 : label is 0; + attribute C_HAS_PROG_FLAGS_AXIS : integer; + attribute C_HAS_PROG_FLAGS_AXIS of U0 : label is 0; + attribute C_HAS_PROG_FLAGS_RACH : integer; + attribute C_HAS_PROG_FLAGS_RACH of U0 : label is 0; + attribute C_HAS_PROG_FLAGS_RDCH : integer; + attribute C_HAS_PROG_FLAGS_RDCH of U0 : label is 0; + attribute C_HAS_PROG_FLAGS_WACH : integer; + attribute C_HAS_PROG_FLAGS_WACH of U0 : label is 0; + attribute C_HAS_PROG_FLAGS_WDCH : integer; + attribute C_HAS_PROG_FLAGS_WDCH of U0 : label is 0; + attribute C_HAS_PROG_FLAGS_WRCH : integer; + attribute C_HAS_PROG_FLAGS_WRCH of U0 : label is 0; + attribute C_HAS_RD_DATA_COUNT : integer; + attribute C_HAS_RD_DATA_COUNT of U0 : label is 0; + attribute C_HAS_RD_RST : integer; + attribute C_HAS_RD_RST of U0 : label is 0; + attribute C_HAS_RST : integer; + attribute C_HAS_RST of U0 : label is 0; + attribute C_HAS_SLAVE_CE : integer; + attribute C_HAS_SLAVE_CE of U0 : label is 0; + attribute C_HAS_SRST : integer; + attribute C_HAS_SRST of U0 : label is 1; + attribute C_HAS_UNDERFLOW : integer; + attribute C_HAS_UNDERFLOW of U0 : label is 0; + attribute C_HAS_VALID : integer; + attribute C_HAS_VALID of U0 : label is 0; + attribute C_HAS_WR_ACK : integer; + attribute C_HAS_WR_ACK of U0 : label is 0; + attribute C_HAS_WR_DATA_COUNT : integer; + attribute C_HAS_WR_DATA_COUNT of U0 : label is 0; + attribute C_HAS_WR_RST : integer; + attribute C_HAS_WR_RST of U0 : label is 0; + attribute C_IMPLEMENTATION_TYPE : integer; + attribute C_IMPLEMENTATION_TYPE of U0 : label is 6; + attribute C_IMPLEMENTATION_TYPE_AXIS : integer; + attribute C_IMPLEMENTATION_TYPE_AXIS of U0 : label is 1; + attribute C_IMPLEMENTATION_TYPE_RACH : integer; + attribute C_IMPLEMENTATION_TYPE_RACH of U0 : label is 1; + attribute C_IMPLEMENTATION_TYPE_RDCH : integer; + attribute C_IMPLEMENTATION_TYPE_RDCH of U0 : label is 1; + attribute C_IMPLEMENTATION_TYPE_WACH : integer; + attribute C_IMPLEMENTATION_TYPE_WACH of U0 : label is 1; + attribute C_IMPLEMENTATION_TYPE_WDCH : integer; + attribute C_IMPLEMENTATION_TYPE_WDCH of U0 : label is 1; + attribute C_IMPLEMENTATION_TYPE_WRCH : integer; + attribute C_IMPLEMENTATION_TYPE_WRCH of U0 : label is 1; + attribute C_INIT_WR_PNTR_VAL : integer; + attribute C_INIT_WR_PNTR_VAL of U0 : label is 0; + attribute C_INTERFACE_TYPE : integer; + attribute C_INTERFACE_TYPE of U0 : label is 0; + attribute C_MEMORY_TYPE : integer; + attribute C_MEMORY_TYPE of U0 : label is 4; + attribute C_MIF_FILE_NAME : string; + attribute C_MIF_FILE_NAME of U0 : label is "BlankString"; + attribute C_MSGON_VAL : integer; + attribute C_MSGON_VAL of U0 : label is 1; + attribute C_OPTIMIZATION_MODE : integer; + attribute C_OPTIMIZATION_MODE of U0 : label is 0; + attribute C_OVERFLOW_LOW : integer; + attribute C_OVERFLOW_LOW of U0 : label is 0; + attribute C_POWER_SAVING_MODE : integer; + attribute C_POWER_SAVING_MODE of U0 : label is 0; + attribute C_PRELOAD_LATENCY : integer; + attribute C_PRELOAD_LATENCY of U0 : label is 2; + attribute C_PRELOAD_REGS : integer; + attribute C_PRELOAD_REGS of U0 : label is 1; + attribute C_PRIM_FIFO_TYPE : string; + attribute C_PRIM_FIFO_TYPE of U0 : label is "512x36"; + attribute C_PRIM_FIFO_TYPE_AXIS : string; + attribute C_PRIM_FIFO_TYPE_AXIS of U0 : label is "1kx18"; + attribute C_PRIM_FIFO_TYPE_RACH : string; + attribute C_PRIM_FIFO_TYPE_RACH of U0 : label is "512x36"; + attribute C_PRIM_FIFO_TYPE_RDCH : string; + attribute C_PRIM_FIFO_TYPE_RDCH of U0 : label is "512x72"; + attribute C_PRIM_FIFO_TYPE_WACH : string; + attribute C_PRIM_FIFO_TYPE_WACH of U0 : label is "512x36"; + attribute C_PRIM_FIFO_TYPE_WDCH : string; + attribute C_PRIM_FIFO_TYPE_WDCH of U0 : label is "512x72"; + attribute C_PRIM_FIFO_TYPE_WRCH : string; + attribute C_PRIM_FIFO_TYPE_WRCH of U0 : label is "512x36"; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL : integer; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL of U0 : label is 2; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_AXIS : integer; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_AXIS of U0 : label is 1022; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_RACH : integer; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_RACH of U0 : label is 1022; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_RDCH : integer; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_RDCH of U0 : label is 1022; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_WACH : integer; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_WACH of U0 : label is 1022; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_WDCH : integer; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_WDCH of U0 : label is 1022; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_WRCH : integer; + attribute C_PROG_EMPTY_THRESH_ASSERT_VAL_WRCH of U0 : label is 1022; + attribute C_PROG_EMPTY_THRESH_NEGATE_VAL : integer; + attribute C_PROG_EMPTY_THRESH_NEGATE_VAL of U0 : label is 3; + attribute C_PROG_EMPTY_TYPE : integer; + attribute C_PROG_EMPTY_TYPE of U0 : label is 0; + attribute C_PROG_EMPTY_TYPE_AXIS : integer; + attribute C_PROG_EMPTY_TYPE_AXIS of U0 : label is 0; + attribute C_PROG_EMPTY_TYPE_RACH : integer; + attribute C_PROG_EMPTY_TYPE_RACH of U0 : label is 0; + attribute C_PROG_EMPTY_TYPE_RDCH : integer; + attribute C_PROG_EMPTY_TYPE_RDCH of U0 : label is 0; + attribute C_PROG_EMPTY_TYPE_WACH : integer; + attribute C_PROG_EMPTY_TYPE_WACH of U0 : label is 0; + attribute C_PROG_EMPTY_TYPE_WDCH : integer; + attribute C_PROG_EMPTY_TYPE_WDCH of U0 : label is 0; + attribute C_PROG_EMPTY_TYPE_WRCH : integer; + attribute C_PROG_EMPTY_TYPE_WRCH of U0 : label is 0; + attribute C_PROG_FULL_THRESH_ASSERT_VAL : integer; + attribute C_PROG_FULL_THRESH_ASSERT_VAL of U0 : label is 510; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_AXIS : integer; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_AXIS of U0 : label is 1023; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_RACH : integer; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_RACH of U0 : label is 1023; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_RDCH : integer; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_RDCH of U0 : label is 1023; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_WACH : integer; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_WACH of U0 : label is 1023; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_WDCH : integer; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_WDCH of U0 : label is 1023; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_WRCH : integer; + attribute C_PROG_FULL_THRESH_ASSERT_VAL_WRCH of U0 : label is 1023; + attribute C_PROG_FULL_THRESH_NEGATE_VAL : integer; + attribute C_PROG_FULL_THRESH_NEGATE_VAL of U0 : label is 509; + attribute C_PROG_FULL_TYPE : integer; + attribute C_PROG_FULL_TYPE of U0 : label is 0; + attribute C_PROG_FULL_TYPE_AXIS : integer; + attribute C_PROG_FULL_TYPE_AXIS of U0 : label is 0; + attribute C_PROG_FULL_TYPE_RACH : integer; + attribute C_PROG_FULL_TYPE_RACH of U0 : label is 0; + attribute C_PROG_FULL_TYPE_RDCH : integer; + attribute C_PROG_FULL_TYPE_RDCH of U0 : label is 0; + attribute C_PROG_FULL_TYPE_WACH : integer; + attribute C_PROG_FULL_TYPE_WACH of U0 : label is 0; + attribute C_PROG_FULL_TYPE_WDCH : integer; + attribute C_PROG_FULL_TYPE_WDCH of U0 : label is 0; + attribute C_PROG_FULL_TYPE_WRCH : integer; + attribute C_PROG_FULL_TYPE_WRCH of U0 : label is 0; + attribute C_RACH_TYPE : integer; + attribute C_RACH_TYPE of U0 : label is 0; + attribute C_RDCH_TYPE : integer; + attribute C_RDCH_TYPE of U0 : label is 0; + attribute C_RD_DATA_COUNT_WIDTH : integer; + attribute C_RD_DATA_COUNT_WIDTH of U0 : label is 10; + attribute C_RD_DEPTH : integer; + attribute C_RD_DEPTH of U0 : label is 1024; + attribute C_RD_FREQ : integer; + attribute C_RD_FREQ of U0 : label is 1; + attribute C_RD_PNTR_WIDTH : integer; + attribute C_RD_PNTR_WIDTH of U0 : label is 10; + attribute C_REG_SLICE_MODE_AXIS : integer; + attribute C_REG_SLICE_MODE_AXIS of U0 : label is 0; + attribute C_REG_SLICE_MODE_RACH : integer; + attribute C_REG_SLICE_MODE_RACH of U0 : label is 0; + attribute C_REG_SLICE_MODE_RDCH : integer; + attribute C_REG_SLICE_MODE_RDCH of U0 : label is 0; + attribute C_REG_SLICE_MODE_WACH : integer; + attribute C_REG_SLICE_MODE_WACH of U0 : label is 0; + attribute C_REG_SLICE_MODE_WDCH : integer; + attribute C_REG_SLICE_MODE_WDCH of U0 : label is 0; + attribute C_REG_SLICE_MODE_WRCH : integer; + attribute C_REG_SLICE_MODE_WRCH of U0 : label is 0; + attribute C_SELECT_XPM : integer; + attribute C_SELECT_XPM of U0 : label is 0; + attribute C_SYNCHRONIZER_STAGE : integer; + attribute C_SYNCHRONIZER_STAGE of U0 : label is 2; + attribute C_UNDERFLOW_LOW : integer; + attribute C_UNDERFLOW_LOW of U0 : label is 0; + attribute C_USE_COMMON_OVERFLOW : integer; + attribute C_USE_COMMON_OVERFLOW of U0 : label is 0; + attribute C_USE_COMMON_UNDERFLOW : integer; + attribute C_USE_COMMON_UNDERFLOW of U0 : label is 0; + attribute C_USE_DEFAULT_SETTINGS : integer; + attribute C_USE_DEFAULT_SETTINGS of U0 : label is 0; + attribute C_USE_DOUT_RST : integer; + attribute C_USE_DOUT_RST of U0 : label is 1; + attribute C_USE_ECC : integer; + attribute C_USE_ECC of U0 : label is 0; + attribute C_USE_ECC_AXIS : integer; + attribute C_USE_ECC_AXIS of U0 : label is 0; + attribute C_USE_ECC_RACH : integer; + attribute C_USE_ECC_RACH of U0 : label is 0; + attribute C_USE_ECC_RDCH : integer; + attribute C_USE_ECC_RDCH of U0 : label is 0; + attribute C_USE_ECC_WACH : integer; + attribute C_USE_ECC_WACH of U0 : label is 0; + attribute C_USE_ECC_WDCH : integer; + attribute C_USE_ECC_WDCH of U0 : label is 0; + attribute C_USE_ECC_WRCH : integer; + attribute C_USE_ECC_WRCH of U0 : label is 0; + attribute C_USE_EMBEDDED_REG : integer; + attribute C_USE_EMBEDDED_REG of U0 : label is 1; + attribute C_USE_FIFO16_FLAGS : integer; + attribute C_USE_FIFO16_FLAGS of U0 : label is 0; + attribute C_USE_FWFT_DATA_COUNT : integer; + attribute C_USE_FWFT_DATA_COUNT of U0 : label is 0; + attribute C_USE_PIPELINE_REG : integer; + attribute C_USE_PIPELINE_REG of U0 : label is 0; + attribute C_VALID_LOW : integer; + attribute C_VALID_LOW of U0 : label is 0; + attribute C_WACH_TYPE : integer; + attribute C_WACH_TYPE of U0 : label is 0; + attribute C_WDCH_TYPE : integer; + attribute C_WDCH_TYPE of U0 : label is 0; + attribute C_WRCH_TYPE : integer; + attribute C_WRCH_TYPE of U0 : label is 0; + attribute C_WR_ACK_LOW : integer; + attribute C_WR_ACK_LOW of U0 : label is 0; + attribute C_WR_DATA_COUNT_WIDTH : integer; + attribute C_WR_DATA_COUNT_WIDTH of U0 : label is 9; + attribute C_WR_DEPTH : integer; + attribute C_WR_DEPTH of U0 : label is 512; + attribute C_WR_DEPTH_AXIS : integer; + attribute C_WR_DEPTH_AXIS of U0 : label is 1024; + attribute C_WR_DEPTH_RACH : integer; + attribute C_WR_DEPTH_RACH of U0 : label is 16; + attribute C_WR_DEPTH_RDCH : integer; + attribute C_WR_DEPTH_RDCH of U0 : label is 1024; + attribute C_WR_DEPTH_WACH : integer; + attribute C_WR_DEPTH_WACH of U0 : label is 16; + attribute C_WR_DEPTH_WDCH : integer; + attribute C_WR_DEPTH_WDCH of U0 : label is 1024; + attribute C_WR_DEPTH_WRCH : integer; + attribute C_WR_DEPTH_WRCH of U0 : label is 16; + attribute C_WR_FREQ : integer; + attribute C_WR_FREQ of U0 : label is 1; + attribute C_WR_PNTR_WIDTH : integer; + attribute C_WR_PNTR_WIDTH of U0 : label is 9; + attribute C_WR_PNTR_WIDTH_AXIS : integer; + attribute C_WR_PNTR_WIDTH_AXIS of U0 : label is 10; + attribute C_WR_PNTR_WIDTH_RACH : integer; + attribute C_WR_PNTR_WIDTH_RACH of U0 : label is 4; + attribute C_WR_PNTR_WIDTH_RDCH : integer; + attribute C_WR_PNTR_WIDTH_RDCH of U0 : label is 10; + attribute C_WR_PNTR_WIDTH_WACH : integer; + attribute C_WR_PNTR_WIDTH_WACH of U0 : label is 4; + attribute C_WR_PNTR_WIDTH_WDCH : integer; + attribute C_WR_PNTR_WIDTH_WDCH of U0 : label is 10; + attribute C_WR_PNTR_WIDTH_WRCH : integer; + attribute C_WR_PNTR_WIDTH_WRCH of U0 : label is 4; + attribute C_WR_RESPONSE_LATENCY : integer; + attribute C_WR_RESPONSE_LATENCY of U0 : label is 1; + attribute is_du_within_envelope : string; + attribute is_du_within_envelope of U0 : label is "true"; + attribute x_interface_info : string; + attribute x_interface_info of clk : signal is "xilinx.com:signal:clock:1.0 core_clk CLK"; + attribute x_interface_parameter : string; + attribute x_interface_parameter of clk : signal is "XIL_INTERFACENAME core_clk, FREQ_HZ 100000000, FREQ_TOLERANCE_HZ 0, PHASE 0.0, INSERT_VIP 0"; + attribute x_interface_info of empty : signal is "xilinx.com:interface:fifo_read:1.0 FIFO_READ EMPTY"; + attribute x_interface_info of full : signal is "xilinx.com:interface:fifo_write:1.0 FIFO_WRITE FULL"; + attribute x_interface_info of rd_en : signal is "xilinx.com:interface:fifo_read:1.0 FIFO_READ RD_EN"; + attribute x_interface_info of wr_en : signal is "xilinx.com:interface:fifo_write:1.0 FIFO_WRITE WR_EN"; + attribute x_interface_info of din : signal is "xilinx.com:interface:fifo_write:1.0 FIFO_WRITE WR_DATA"; + attribute x_interface_info of dout : signal is "xilinx.com:interface:fifo_read:1.0 FIFO_READ RD_DATA"; +begin +U0: entity work.fifo_data_to_stream_fifo_generator_v13_2_7 + port map ( + almost_empty => NLW_U0_almost_empty_UNCONNECTED, + almost_full => NLW_U0_almost_full_UNCONNECTED, + axi_ar_data_count(4 downto 0) => NLW_U0_axi_ar_data_count_UNCONNECTED(4 downto 0), + axi_ar_dbiterr => NLW_U0_axi_ar_dbiterr_UNCONNECTED, + axi_ar_injectdbiterr => '0', + axi_ar_injectsbiterr => '0', + axi_ar_overflow => NLW_U0_axi_ar_overflow_UNCONNECTED, + axi_ar_prog_empty => NLW_U0_axi_ar_prog_empty_UNCONNECTED, + axi_ar_prog_empty_thresh(3 downto 0) => B"0000", + axi_ar_prog_full => NLW_U0_axi_ar_prog_full_UNCONNECTED, + axi_ar_prog_full_thresh(3 downto 0) => B"0000", + axi_ar_rd_data_count(4 downto 0) => NLW_U0_axi_ar_rd_data_count_UNCONNECTED(4 downto 0), + axi_ar_sbiterr => NLW_U0_axi_ar_sbiterr_UNCONNECTED, + axi_ar_underflow => NLW_U0_axi_ar_underflow_UNCONNECTED, + axi_ar_wr_data_count(4 downto 0) => NLW_U0_axi_ar_wr_data_count_UNCONNECTED(4 downto 0), + axi_aw_data_count(4 downto 0) => NLW_U0_axi_aw_data_count_UNCONNECTED(4 downto 0), + axi_aw_dbiterr => NLW_U0_axi_aw_dbiterr_UNCONNECTED, + axi_aw_injectdbiterr => '0', + axi_aw_injectsbiterr => '0', + axi_aw_overflow => NLW_U0_axi_aw_overflow_UNCONNECTED, + axi_aw_prog_empty => NLW_U0_axi_aw_prog_empty_UNCONNECTED, + axi_aw_prog_empty_thresh(3 downto 0) => B"0000", + axi_aw_prog_full => NLW_U0_axi_aw_prog_full_UNCONNECTED, + axi_aw_prog_full_thresh(3 downto 0) => B"0000", + axi_aw_rd_data_count(4 downto 0) => NLW_U0_axi_aw_rd_data_count_UNCONNECTED(4 downto 0), + axi_aw_sbiterr => NLW_U0_axi_aw_sbiterr_UNCONNECTED, + axi_aw_underflow => NLW_U0_axi_aw_underflow_UNCONNECTED, + axi_aw_wr_data_count(4 downto 0) => NLW_U0_axi_aw_wr_data_count_UNCONNECTED(4 downto 0), + axi_b_data_count(4 downto 0) => NLW_U0_axi_b_data_count_UNCONNECTED(4 downto 0), + axi_b_dbiterr => NLW_U0_axi_b_dbiterr_UNCONNECTED, + axi_b_injectdbiterr => '0', + axi_b_injectsbiterr => '0', + axi_b_overflow => NLW_U0_axi_b_overflow_UNCONNECTED, + axi_b_prog_empty => NLW_U0_axi_b_prog_empty_UNCONNECTED, + axi_b_prog_empty_thresh(3 downto 0) => B"0000", + axi_b_prog_full => NLW_U0_axi_b_prog_full_UNCONNECTED, + axi_b_prog_full_thresh(3 downto 0) => B"0000", + axi_b_rd_data_count(4 downto 0) => NLW_U0_axi_b_rd_data_count_UNCONNECTED(4 downto 0), + axi_b_sbiterr => NLW_U0_axi_b_sbiterr_UNCONNECTED, + axi_b_underflow => NLW_U0_axi_b_underflow_UNCONNECTED, + axi_b_wr_data_count(4 downto 0) => NLW_U0_axi_b_wr_data_count_UNCONNECTED(4 downto 0), + axi_r_data_count(10 downto 0) => NLW_U0_axi_r_data_count_UNCONNECTED(10 downto 0), + axi_r_dbiterr => NLW_U0_axi_r_dbiterr_UNCONNECTED, + axi_r_injectdbiterr => '0', + axi_r_injectsbiterr => '0', + axi_r_overflow => NLW_U0_axi_r_overflow_UNCONNECTED, + axi_r_prog_empty => NLW_U0_axi_r_prog_empty_UNCONNECTED, + axi_r_prog_empty_thresh(9 downto 0) => B"0000000000", + axi_r_prog_full => NLW_U0_axi_r_prog_full_UNCONNECTED, + axi_r_prog_full_thresh(9 downto 0) => B"0000000000", + axi_r_rd_data_count(10 downto 0) => NLW_U0_axi_r_rd_data_count_UNCONNECTED(10 downto 0), + axi_r_sbiterr => NLW_U0_axi_r_sbiterr_UNCONNECTED, + axi_r_underflow => NLW_U0_axi_r_underflow_UNCONNECTED, + axi_r_wr_data_count(10 downto 0) => NLW_U0_axi_r_wr_data_count_UNCONNECTED(10 downto 0), + axi_w_data_count(10 downto 0) => NLW_U0_axi_w_data_count_UNCONNECTED(10 downto 0), + axi_w_dbiterr => NLW_U0_axi_w_dbiterr_UNCONNECTED, + axi_w_injectdbiterr => '0', + axi_w_injectsbiterr => '0', + axi_w_overflow => NLW_U0_axi_w_overflow_UNCONNECTED, + axi_w_prog_empty => NLW_U0_axi_w_prog_empty_UNCONNECTED, + axi_w_prog_empty_thresh(9 downto 0) => B"0000000000", + axi_w_prog_full => NLW_U0_axi_w_prog_full_UNCONNECTED, + axi_w_prog_full_thresh(9 downto 0) => B"0000000000", + axi_w_rd_data_count(10 downto 0) => NLW_U0_axi_w_rd_data_count_UNCONNECTED(10 downto 0), + axi_w_sbiterr => NLW_U0_axi_w_sbiterr_UNCONNECTED, + axi_w_underflow => NLW_U0_axi_w_underflow_UNCONNECTED, + axi_w_wr_data_count(10 downto 0) => NLW_U0_axi_w_wr_data_count_UNCONNECTED(10 downto 0), + axis_data_count(10 downto 0) => NLW_U0_axis_data_count_UNCONNECTED(10 downto 0), + axis_dbiterr => NLW_U0_axis_dbiterr_UNCONNECTED, + axis_injectdbiterr => '0', + axis_injectsbiterr => '0', + axis_overflow => NLW_U0_axis_overflow_UNCONNECTED, + axis_prog_empty => NLW_U0_axis_prog_empty_UNCONNECTED, + axis_prog_empty_thresh(9 downto 0) => B"0000000000", + axis_prog_full => NLW_U0_axis_prog_full_UNCONNECTED, + axis_prog_full_thresh(9 downto 0) => B"0000000000", + axis_rd_data_count(10 downto 0) => NLW_U0_axis_rd_data_count_UNCONNECTED(10 downto 0), + axis_sbiterr => NLW_U0_axis_sbiterr_UNCONNECTED, + axis_underflow => NLW_U0_axis_underflow_UNCONNECTED, + axis_wr_data_count(10 downto 0) => NLW_U0_axis_wr_data_count_UNCONNECTED(10 downto 0), + backup => '0', + backup_marker => '0', + clk => clk, + data_count(8 downto 0) => NLW_U0_data_count_UNCONNECTED(8 downto 0), + dbiterr => NLW_U0_dbiterr_UNCONNECTED, + din(31 downto 0) => din(31 downto 0), + dout(15 downto 0) => dout(15 downto 0), + empty => empty, + full => full, + injectdbiterr => '0', + injectsbiterr => '0', + int_clk => '0', + m_aclk => '0', + m_aclk_en => '0', + m_axi_araddr(31 downto 0) => NLW_U0_m_axi_araddr_UNCONNECTED(31 downto 0), + m_axi_arburst(1 downto 0) => NLW_U0_m_axi_arburst_UNCONNECTED(1 downto 0), + m_axi_arcache(3 downto 0) => NLW_U0_m_axi_arcache_UNCONNECTED(3 downto 0), + m_axi_arid(0) => NLW_U0_m_axi_arid_UNCONNECTED(0), + m_axi_arlen(7 downto 0) => NLW_U0_m_axi_arlen_UNCONNECTED(7 downto 0), + m_axi_arlock(0) => NLW_U0_m_axi_arlock_UNCONNECTED(0), + m_axi_arprot(2 downto 0) => NLW_U0_m_axi_arprot_UNCONNECTED(2 downto 0), + m_axi_arqos(3 downto 0) => NLW_U0_m_axi_arqos_UNCONNECTED(3 downto 0), + m_axi_arready => '0', + m_axi_arregion(3 downto 0) => NLW_U0_m_axi_arregion_UNCONNECTED(3 downto 0), + m_axi_arsize(2 downto 0) => NLW_U0_m_axi_arsize_UNCONNECTED(2 downto 0), + m_axi_aruser(0) => NLW_U0_m_axi_aruser_UNCONNECTED(0), + m_axi_arvalid => NLW_U0_m_axi_arvalid_UNCONNECTED, + m_axi_awaddr(31 downto 0) => NLW_U0_m_axi_awaddr_UNCONNECTED(31 downto 0), + m_axi_awburst(1 downto 0) => NLW_U0_m_axi_awburst_UNCONNECTED(1 downto 0), + m_axi_awcache(3 downto 0) => NLW_U0_m_axi_awcache_UNCONNECTED(3 downto 0), + m_axi_awid(0) => NLW_U0_m_axi_awid_UNCONNECTED(0), + m_axi_awlen(7 downto 0) => NLW_U0_m_axi_awlen_UNCONNECTED(7 downto 0), + m_axi_awlock(0) => NLW_U0_m_axi_awlock_UNCONNECTED(0), + m_axi_awprot(2 downto 0) => NLW_U0_m_axi_awprot_UNCONNECTED(2 downto 0), + m_axi_awqos(3 downto 0) => NLW_U0_m_axi_awqos_UNCONNECTED(3 downto 0), + m_axi_awready => '0', + m_axi_awregion(3 downto 0) => NLW_U0_m_axi_awregion_UNCONNECTED(3 downto 0), + m_axi_awsize(2 downto 0) => NLW_U0_m_axi_awsize_UNCONNECTED(2 downto 0), + m_axi_awuser(0) => NLW_U0_m_axi_awuser_UNCONNECTED(0), + m_axi_awvalid => NLW_U0_m_axi_awvalid_UNCONNECTED, + m_axi_bid(0) => '0', + m_axi_bready => NLW_U0_m_axi_bready_UNCONNECTED, + m_axi_bresp(1 downto 0) => B"00", + m_axi_buser(0) => '0', + m_axi_bvalid => '0', + m_axi_rdata(63 downto 0) => B"0000000000000000000000000000000000000000000000000000000000000000", + m_axi_rid(0) => '0', + m_axi_rlast => '0', + m_axi_rready => NLW_U0_m_axi_rready_UNCONNECTED, + m_axi_rresp(1 downto 0) => B"00", + m_axi_ruser(0) => '0', + m_axi_rvalid => '0', + m_axi_wdata(63 downto 0) => NLW_U0_m_axi_wdata_UNCONNECTED(63 downto 0), + m_axi_wid(0) => NLW_U0_m_axi_wid_UNCONNECTED(0), + m_axi_wlast => NLW_U0_m_axi_wlast_UNCONNECTED, + m_axi_wready => '0', + m_axi_wstrb(7 downto 0) => NLW_U0_m_axi_wstrb_UNCONNECTED(7 downto 0), + m_axi_wuser(0) => NLW_U0_m_axi_wuser_UNCONNECTED(0), + m_axi_wvalid => NLW_U0_m_axi_wvalid_UNCONNECTED, + m_axis_tdata(7 downto 0) => NLW_U0_m_axis_tdata_UNCONNECTED(7 downto 0), + m_axis_tdest(0) => NLW_U0_m_axis_tdest_UNCONNECTED(0), + m_axis_tid(0) => NLW_U0_m_axis_tid_UNCONNECTED(0), + m_axis_tkeep(0) => NLW_U0_m_axis_tkeep_UNCONNECTED(0), + m_axis_tlast => NLW_U0_m_axis_tlast_UNCONNECTED, + m_axis_tready => '0', + m_axis_tstrb(0) => NLW_U0_m_axis_tstrb_UNCONNECTED(0), + m_axis_tuser(3 downto 0) => NLW_U0_m_axis_tuser_UNCONNECTED(3 downto 0), + m_axis_tvalid => NLW_U0_m_axis_tvalid_UNCONNECTED, + overflow => NLW_U0_overflow_UNCONNECTED, + prog_empty => NLW_U0_prog_empty_UNCONNECTED, + prog_empty_thresh(9 downto 0) => B"0000000000", + prog_empty_thresh_assert(9 downto 0) => B"0000000000", + prog_empty_thresh_negate(9 downto 0) => B"0000000000", + prog_full => NLW_U0_prog_full_UNCONNECTED, + prog_full_thresh(8 downto 0) => B"000000000", + prog_full_thresh_assert(8 downto 0) => B"000000000", + prog_full_thresh_negate(8 downto 0) => B"000000000", + rd_clk => '0', + rd_data_count(9 downto 0) => NLW_U0_rd_data_count_UNCONNECTED(9 downto 0), + rd_en => rd_en, + rd_rst => '0', + rd_rst_busy => rd_rst_busy, + rst => '0', + s_aclk => '0', + s_aclk_en => '0', + s_aresetn => '0', + s_axi_araddr(31 downto 0) => B"00000000000000000000000000000000", + s_axi_arburst(1 downto 0) => B"00", + s_axi_arcache(3 downto 0) => B"0000", + s_axi_arid(0) => '0', + s_axi_arlen(7 downto 0) => B"00000000", + s_axi_arlock(0) => '0', + s_axi_arprot(2 downto 0) => B"000", + s_axi_arqos(3 downto 0) => B"0000", + s_axi_arready => NLW_U0_s_axi_arready_UNCONNECTED, + s_axi_arregion(3 downto 0) => B"0000", + s_axi_arsize(2 downto 0) => B"000", + s_axi_aruser(0) => '0', + s_axi_arvalid => '0', + s_axi_awaddr(31 downto 0) => B"00000000000000000000000000000000", + s_axi_awburst(1 downto 0) => B"00", + s_axi_awcache(3 downto 0) => B"0000", + s_axi_awid(0) => '0', + s_axi_awlen(7 downto 0) => B"00000000", + s_axi_awlock(0) => '0', + s_axi_awprot(2 downto 0) => B"000", + s_axi_awqos(3 downto 0) => B"0000", + s_axi_awready => NLW_U0_s_axi_awready_UNCONNECTED, + s_axi_awregion(3 downto 0) => B"0000", + s_axi_awsize(2 downto 0) => B"000", + s_axi_awuser(0) => '0', + s_axi_awvalid => '0', + s_axi_bid(0) => NLW_U0_s_axi_bid_UNCONNECTED(0), + s_axi_bready => '0', + s_axi_bresp(1 downto 0) => NLW_U0_s_axi_bresp_UNCONNECTED(1 downto 0), + s_axi_buser(0) => NLW_U0_s_axi_buser_UNCONNECTED(0), + s_axi_bvalid => NLW_U0_s_axi_bvalid_UNCONNECTED, + s_axi_rdata(63 downto 0) => NLW_U0_s_axi_rdata_UNCONNECTED(63 downto 0), + s_axi_rid(0) => NLW_U0_s_axi_rid_UNCONNECTED(0), + s_axi_rlast => NLW_U0_s_axi_rlast_UNCONNECTED, + s_axi_rready => '0', + s_axi_rresp(1 downto 0) => NLW_U0_s_axi_rresp_UNCONNECTED(1 downto 0), + s_axi_ruser(0) => NLW_U0_s_axi_ruser_UNCONNECTED(0), + s_axi_rvalid => NLW_U0_s_axi_rvalid_UNCONNECTED, + s_axi_wdata(63 downto 0) => B"0000000000000000000000000000000000000000000000000000000000000000", + s_axi_wid(0) => '0', + s_axi_wlast => '0', + s_axi_wready => NLW_U0_s_axi_wready_UNCONNECTED, + s_axi_wstrb(7 downto 0) => B"00000000", + s_axi_wuser(0) => '0', + s_axi_wvalid => '0', + s_axis_tdata(7 downto 0) => B"00000000", + s_axis_tdest(0) => '0', + s_axis_tid(0) => '0', + s_axis_tkeep(0) => '0', + s_axis_tlast => '0', + s_axis_tready => NLW_U0_s_axis_tready_UNCONNECTED, + s_axis_tstrb(0) => '0', + s_axis_tuser(3 downto 0) => B"0000", + s_axis_tvalid => '0', + sbiterr => NLW_U0_sbiterr_UNCONNECTED, + sleep => '0', + srst => srst, + underflow => NLW_U0_underflow_UNCONNECTED, + valid => NLW_U0_valid_UNCONNECTED, + wr_ack => NLW_U0_wr_ack_UNCONNECTED, + wr_clk => '0', + wr_data_count(8 downto 0) => NLW_U0_wr_data_count_UNCONNECTED(8 downto 0), + wr_en => wr_en, + wr_rst => '0', + wr_rst_busy => wr_rst_busy + ); +end STRUCTURE; diff --git a/src/hdl/modules/qlaser_dacs_pulse_channel.vhdl b/src/hdl/modules/qlaser_dacs_pulse_channel.vhdl new file mode 100644 index 0000000..e57c63d --- /dev/null +++ b/src/hdl/modules/qlaser_dacs_pulse_channel.vhdl @@ -0,0 +1,269 @@ +--------------------------------------------------------------- +-- File : qlaser_dacs_pulse_channel.vhd +-- Description : Single channel of pulse output +---------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.qlaser_pkg.all; + +entity qlaser_dacs_pulse_channel is +port ( + reset : in std_logic; + clk : in std_logic; + + enable : in std_logic; -- Set when DAC interface is running + start : in std_logic; -- Set when pulse generation sequence begins (trigger) + cnt_time : in std_logic_vector(23 downto 0); -- Time since trigger. + + busy : out std_logic; -- Status signal + + -- CPU interface + cpu_addr : in std_logic_vector(11 downto 0); -- Address input + cpu_wdata : in std_logic_vector(31 downto 0); -- Data input + cpu_wr : in std_logic; -- Write enable + cpu_sel : in std_logic; -- Block select + cpu_rdata : out std_logic_vector(31 downto 0); -- Data output + cpu_rdata_dv : out std_logic; -- Acknowledge output + + -- AXI-stream output + axis_tready : in std_logic; -- axi_stream ready from downstream module + axis_tdata : out std_logic_vector(15 downto 0); -- axi stream output data + axis_tvalid : out std_logic; -- axi_stream output data valid + axis_tlast : out std_logic -- axi_stream output set on last data +); +end entity; + +---------------------------------------------------------------- +-- Single channel pulse generator with two RAMs +---------------------------------------------------------------- +architecture channel of qlaser_dacs_pulse_channel is +-- Constants declearations +constant C_RAM_SELECT : integer := 11; -- Select bit for which RAM for CPU read/write +constant C_NUM_PULSE : integer := 16; -- Number of output data values from pulse RAM (16x24-bit) + +constant C_START_TIME : integer := 24; -- Start time for pulse generation +constant C_BITS_ADDR_START : integer := 12; -- Number of bits for starting address +constant C_BITS_ADDR_LENGTH : integer := 10; -- Number of bits for length address used by an edge of a pulse +constant C_BITS_GAIN_FACTOR : integer := 16; -- Number of bits in gain table +constant C_BITS_TIME_FACTOR : integer := 16; -- Number of bits in time table +constant C_BITS_TIME_INT : integer := 14; -- Starting bit for time integer part of the time factor, counting from MSB +constant C_BITS_TIME_FRAC : integer := 5; -- Starting bit for time fractional part of the time factor, counting from MSB +constant C_BITS_ADDR_TOP : integer := 17; -- Number of bits for the "flat top", the top of the pulse + +constant C_LENGTH_WAVEFORM : integer := 1024; -- Number of output data values from waveform RAM (1024x16-bit) +constant C_BITS_ADDR_WAVE : integer := 10; -- Number of bits in address for waveform RAM + +constant C_PC_INCR : integer := 4; -- Width of pulse counter increment + +-- Signal declarations for pulse RAM +signal ram_pulse_we : std_logic_vector( 0 downto 0); -- Write enable for pulse RAM +signal ram_pulse_addra : std_logic_vector( 9 downto 0); -- Address for pulse RAM +signal ram_pulse_dina : std_logic_vector(31 downto 0); -- Data for pulse RAM +signal ram_pulse_douta : std_logic_vector(31 downto 0); -- Data out from pulse RAM +signal ram_pulse_addrb : std_logic_vector( 9 downto 0); -- Address for pulse RAM +signal ram_pulse_doutb : std_logic_vector(31 downto 0); -- Data out from pulse RAM + +-- Signal declarations for waveform RAM +signal ram_waveform_wea : std_logic_vector( 0 downto 0); -- Write enable for waveform RAM +signal ram_waveform_addra : std_logic_vector(10 downto 0); -- Address for waveform RAM +signal ram_waveform_dina : std_logic_vector(31 downto 0); -- Data for waveform RAM +signal ram_waveform_douta : std_logic_vector(31 downto 0); -- Data out from waveform RAM +signal ram_waveform_addrb : std_logic_vector(11 downto 0); -- Address for waveform RAM +signal ram_waveform_doutb : std_logic_vector(15 downto 0); -- Data out from waveform RAM + +-- State variable type declaration for main state machine +type t_sm_state is ( + S_RESET, -- Wait for 'enable'. Stay here until JESD interface is up and running, + S_IDLE, -- Wait for 'start' + S_WAIT, -- Wait for cnt_time, external input, to match pulse position RAM output + S_WAVE_UP, -- Output the rising edge of a waveform + S_WAVE_FLAT,-- Output the flat top part of a waveform + S_WAVE_DOWN -- Output the falling edge of a waveform +); +signal sm_state : t_sm_state; +signal sm_wavedata : std_logic_vector(15 downto 0); -- Waveform RAM data +signal sm_wavedata_dv : std_logic; -- Signal to indicate that waveform RAM data is valid +signal sm_busy : std_logic; -- Signal to indicate that s.m. is not idle + +-- Misc signals +signal ram_pulse_douta_d1 : std_logic_vector(31 downto 0); -- Delay distrib RAM output to match pipeline of Block RAM +signal cpu_rdata_dv_e1 : std_logic; +signal cpu_rdata_dv_e2 : std_logic; +signal cpu_rdata_ramsel_d1 : std_logic; +signal cpu_rdata_ramsel_d2 : std_logic; + +-- Pipeline delays +signal start_d1 : std_logic; +signal enable_d1 : std_logic; + +begin + + ---------------------------------------------------------------- + -- Pulse Definition Block RAM. + -- Synch write, Synch read + -- Port A is for CPU read/write. 1024x32-bit + -- Port B is for pulse time data output. 1024x32-bit + ---------------------------------------------------------------- + u_ram_pulse : entity work.bram_pulse_definition + port map( + -- Port A CPU Bus + clka => clk, -- input std_logic + wea => ram_pulse_we, -- input slv( 0 to 0 ) + addra => ram_pulse_addra, -- input slv( 9 downto 0 ) + dina => ram_pulse_dina, -- input slv( 31 downto 0 ) + douta => ram_pulse_douta, -- output slv( 31 downto 0 ), + -- Port B waveform input + clkb => clk, + web => (others=>'0'), + addrb => ram_pulse_addrb, -- input slv( 9 downto 0 ) + dinb => (others=>'0'), + doutb => ram_pulse_doutb -- output slv( 31 downto 0 ) + ); + + + ---------------------------------------------------------------- + -- Waveform table Block RAM. + -- Synch write, Synch read + -- Port A is for CPU read/write. 2048x32-bit + -- Port B is for waveform data. 4096x16-bit + ---------------------------------------------------------------- + u_ram_waveform : entity work.bram_waveform + port map ( + -- Port A CPU Bus + clka => clk , -- input std_logic + wea => ram_waveform_wea , -- input slv(0 downto 0) + addra => ram_waveform_addra , -- input slv(10 downto 0) + dina => ram_waveform_dina , -- input slv(31 downto 0) + douta => ram_waveform_douta , -- output slv(31 downto 0) + + -- Port B waveform output + clkb => clk , -- input std_logic + web => (others=>'0') , -- input slv(0 downto 0) + addrb => ram_waveform_addrb , -- input slv(11 downto 0) + dinb => (others=>'0') , -- input slv(15 downto 0) + doutb => ram_waveform_doutb -- output slv(15 downto 0) + ); + + ---------------------------------------------------------------- + -- CPU Read/Write RAM + -- MSB of cpu_addr is used to select one of the two RAMs + -- to read/write, and the remainder are a 9-bit or 4-bit RAM address. + ---------------------------------------------------------------- + pr_ram_rw : process (reset, clk) + begin + if (reset = '1') then + + ram_pulse_addra <= (others=>'0'); + ram_pulse_dina <= (others=>'0'); + ram_pulse_we <= (others=>'0'); + + ram_waveform_wea <= (others=>'0'); + ram_waveform_addra <= (others=>'0'); + ram_waveform_dina <= (others=>'0'); + + cpu_rdata <= (others=>'0'); + cpu_rdata_dv <= '0'; + cpu_rdata_dv_e1 <= '0'; + cpu_rdata_dv_e2 <= '0'; + cpu_rdata_ramsel_d1 <= '0'; + cpu_rdata_ramsel_d2 <= '0'; + + elsif rising_edge(clk) then + + + ------------------------------------------------- + -- CPU writing RAM + ------------------------------------------------- + if (cpu_wr = '1') and (cpu_sel = '1') then + + -- 0 for pulse definition, 1 for waveform table + if (cpu_addr(9) = '1') then + + ram_pulse_addra <= (others=>'0'); + ram_pulse_dina <= (others=>'0'); + ram_pulse_we <= (others=>'0'); + + ram_waveform_wea(0) <= '1'; + ram_waveform_addra <= cpu_addr(10 downto 0); + ram_waveform_dina <= cpu_wdata; + + else + + ram_pulse_addra <= cpu_addr(9 downto 0); + ram_pulse_dina <= cpu_wdata; + ram_pulse_we <= std_logic_vector(to_unsigned(1, ram_pulse_we'length)); + ram_waveform_wea <= (others=>'0'); + ram_waveform_addra <= (others=>'0'); + ram_waveform_dina <= (others=>'0'); + + end if; + + cpu_rdata_dv_e1 <= '0'; + cpu_rdata_dv_e2 <= '0'; + cpu_rdata_ramsel_d1 <= '0'; + cpu_rdata_ramsel_d2 <= '0'; + + + ------------------------------------------------- + -- CPU read + ------------------------------------------------- + elsif (cpu_wr = '0') and (cpu_sel = '1') then + + if (cpu_addr(C_RAM_SELECT) = '1') then -- Waveform + ram_pulse_addra <= (others=>'0'); + ram_waveform_addra <= cpu_addr(10 downto 0); + else -- Pulse + ram_pulse_addra <= cpu_addr(9 downto 0); + ram_pulse_douta_d1 <= ram_pulse_douta; -- Delay distrib RAM output to match pipeline of Block RAM + ram_waveform_addra <= (others=>'0'); + end if; + + ram_pulse_we <= (others=>'0'); + ram_waveform_wea(0) <= '0'; + + cpu_rdata_dv_e2 <= '1'; -- DV for cycle, when RAM output occurs + cpu_rdata_dv_e1 <= cpu_rdata_dv_e2; -- DV for next cycle + cpu_rdata_ramsel_d1 <= cpu_addr(9); -- Save the select bit one cycle later + cpu_rdata_ramsel_d2 <= cpu_rdata_ramsel_d1; + + else + ram_pulse_addra <= (others=>'0'); + ram_pulse_we <= (others=>'0'); + ram_waveform_addra <= (others=>'0'); + ram_waveform_wea(0) <= '0'; + + cpu_rdata_dv_e2 <= '0'; + cpu_rdata_dv_e1 <= cpu_rdata_dv_e2; -- DV for next cycle + cpu_rdata_ramsel_d1 <= '0'; + cpu_rdata_ramsel_d2 <= cpu_rdata_ramsel_d1; + + end if; + + ------------------------------------------------- + -- Output the delayed RAM data + -- This adds a pipeline delay to the cpu_rdata_dv to account for + -- the delay in reading data from the RAM + ------------------------------------------------- + if (cpu_rdata_dv_e1 = '1') then + + cpu_rdata_dv <= '1'; + + -- Select source of output data + if (cpu_rdata_ramsel_d2 = '1') then -- Output is from waveform table + cpu_rdata <= ram_waveform_douta; + + elsif (cpu_rdata_ramsel_d2 = '0') then + cpu_rdata <= ram_pulse_douta_d1; + end if; + + else + cpu_rdata <= (others=>'0'); + cpu_rdata_dv <= '0'; + end if; + + end if; + + end process; +end channel; \ No newline at end of file diff --git a/src/hdl/pkg/iopakb.vhd b/src/hdl/pkg/iopakb.vhd new file mode 100644 index 0000000..b984952 --- /dev/null +++ b/src/hdl/pkg/iopakb.vhd @@ -0,0 +1,9531 @@ +-- ---------------------------------------------------------------------------- +-- +-- Copyright (c) Mentor Graphics Corporation, 1982-1996, All Rights Reserved. +-- UNPUBLISHED, LICENSED SOFTWARE. +-- CONFIDENTIAL AND PROPRIETARY INFORMATION WHICH IS THE +-- PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS. +-- +-- +-- PackageName : std_iopak +-- Title : Package Body for STD_IOPAK +-- Purpose : This package contains additional support for +-- : performing text IO. +-- : +-- Comments : +-- : +-- Assumptions : none +-- Limitations : none +-- Known Errors: none +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- Mentor Graphics Corporation owns the sole copyright to this software. +-- Under International Copyright laws you (1) may not make a copy of this +-- software except for the purposes of maintaining a single archive copy, +-- (2) may not derive works herefrom, (3) may not distribute this work to +-- others. These rights are provided for information clarification, +-- other restrictions of rights may apply as well. +-- +-- This is an "Unpublished" work. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> License NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- This software is further protected by specific source code and/or +-- object code licenses provided by Mentor Graphics Corporation. Use of this +-- software other than as provided in the licensing agreement constitues +-- an infringement. No modification or waiver of any right(s) shall be +-- given other than by the written authorization of an officer of The +-- Mentor Graphics Corporation. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> Proprietary Information <<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- This source code contains proprietary information of Mentor Graphics +-- Corporation and shall not be disclosed other than as provided in the software +-- licensing agreement. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Warrantee <<<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- Mentor Graphics Corporation MAKES NO WARRANTY OF ANY KIND WITH REGARD TO +-- THE USE OF THIS SOFTWARE, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS +-- FOR A PARTICULAR PURPOSE. +-- ---------------------------------------------------------------------------- +-- Modification History : +-- ---------------------------------------------------------------------------- +-- Version No: | Author: | Mod. Date: | Changes Made: +-- v1.000 | M.K.Dhodhi | 10/26/91 | Production Release +-- v1.100 | M.K.Dhodhi | 11/19/91 | Compatible w/ Vantage 3.650 Release +-- v1.110 | wdb | 01/27/92 | compatible w/Intermetrics +-- v1.110 | M.K.Dhodhi | 02/13/92 | fixing bug in T0_String input time +-- | fixing comment in SOX_Machine +-- v1.110 | M.K.Dhodhi | 03/06/92 | production release +-- v1.200 | M.K.Dhodhi | 04/21/92 | stand alone version +-- v1.130 | M.K.Dhodhi | 08/03/92 | production release +-- v1.140 | M.K.Dhodhi | 11/05/92 | fixing real 0.0 case for To_String +-- | | an extra loop in default time. +-- v1.150 | M.K.Dhodhi | 11/17/92 | extending fscan upto 20 arguments. +-- | fixing default 0 time. +-- v1.160 | M.K.Dhodhi | 02/11/93 | fixing Find_Char +-- v1.610 | wrm | 03/30/93 | fixed error assertions in From_String, From_XString +-- v1.700 B | W.R. Migatz | 05/03/93 | Beta release - changes to all f routines (not fprint) +-- | modified str*cpy and str*cmp +-- | fixed memory leak +-- v1.700 | W.R. Migatz | 05/25/93 | production release - change to fscan with %t to allow time unit +-- v1.800 | W.R. Migatz | 07/28/93 | combining into 1 file, mentor support, and From_String(time) bug fix +-- v2.000 | W.R. Migatz | 07/21/94 | production release - fix bug in fprint, fs ps ns timing changes +-- v2.100 | W.R. Migatz | 01/10/96 | production release +-- | Initialization banner removed +-- v2.110 | W.R. Migatz | 04/02/96 | Fixed Find_Char and To_String(TIME) bugs +-- | Find_char did not stop at a NUL character +-- | To_String(TIME) did not handle a precision of 0 +-- v2.2 | B. Caslis | 07/25/96 | Updated for Mentor Graphics Release +-- ---------------------------------------------------------------------------- + +PACKAGE BODY std_iopak is + + -- ************************************************************************ + -- Display Banner + -- ************************************************************************ + + FUNCTION DisplayBanner return BOOLEAN is + + BEGIN + ASSERT FALSE + report LF & + "-- Initializing Std_Developerskit (Std_IOpak package v2.10)" & LF & + "-- Copyright by Mentor Graphics Corporation" & LF & + "-- [Please ignore any warnings associated with this banner.]" + severity NOTE; + return TRUE; + END; + + --CONSTANT StdIOpakBanner : BOOLEAN := DisplayBanner; + CONSTANT StdIOpakBanner : BOOLEAN := TRUE; + + TYPE char_to_hex_table is array (character'low To character'high) of Integer; + TYPE char_to_oct_table is array (character'low TO character'high) of integer; + SUBTYPE INT8 is INTEGER RANGE 0 to 7; + + CONSTANT WarningsOn : BOOLEAN := TRUE; + CONSTANT END_OF_LINE_MARKER : STRING(1 TO 2) := LF & ' '; + CONSTANT invalid_input : INTEGER := -201; +-- ------------------------------------------------------------------------------ +-- ------------------------------------------------------------------------------ +-- P L E A S E N O T E +-- Following routines are hidden, they are not visible to the user of +-- this package but are used internally +-- ----------------------------------------------------------------------------- +--+----------------------------------------------------------------------------- +--| Procedure Name : S_Machine +--| hidden +--| Overloading : None +--| +--| Purpose : Finite State automaton to recognise a string format. +--| format will be broken into field width, precision +--| and justification (left or right). +--| +--| Parameters : fwidth -- output, INTEGER, field width +--| precision -- output, INTEGER, precison +--| justify -- OUTPUT, BIT +--| '0' right justified, +--| '1' left justified +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : +--| +--| NOTE : +--| This procedure is +--| called in the function To_String. +--| +--| Use : +--| VARIABLE fmt : STRING(1 TO format'LENGTH) := format; +--| VARIABLE fw : INTEGER; +--| VARIABLE precis : INTEGER; +--| VARIABLE justfy : BIT; +--| +--| S_Machine(fw, precis, justy, fmt); +--| +--|----------------------------------------------------------------------------- + PROCEDURE S_Machine ( VARIABLE fwidth : OUT INTEGER; + VARIABLE precison : OUT INTEGER; + VARIABLE justify : OUT BIT; + CONSTANT format : IN STRING + ) IS + VARIABLE state : INT8 := 0; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE ch : CHARACTER; + VARIABLE index : INTEGER := 1; + VARIABLE fw : INTEGER := 0; + VARIABLE pr : INTEGER := 0; + + BEGIN + -- make sure first character is '%' if not error + ch := fmt(index); + IF (fmt(index) /= '%') THEN + ASSERT false + REPORT " Format Error --- first character of format " & + " is not '%' as expected." + SEVERITY ERROR; + RETURN; + END IF; + justify := '0'; -- default is right justification + + WHILE (state /= 3) LOOP + IF (index < format'LENGTH) THEN + index := index + 1; + ch := fmt(index); + CASE state IS + WHEN 0 => + IF (ch ='-') THEN + state := 1; -- justify + ELSIF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; -- digits + ELSIF (ch = 's') THEN + state := 3; -- end state + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = '%') THEN + state := 5; + ELSE + state := 6; -- error + END IF; + + WHEN 1 => + justify := '1'; -- left justfy + IF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = 's') THEN + state := 3; + justify := '0'; -- %-s is equivalent to %s + ELSE + state := 6; -- error + END IF; + + WHEN 2 => -- + IF (ch >= '0' AND ch <= '9') THEN + fw := fw * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = 's') THEN + state := 3; + ELSIF (ch = '.') THEN + state := 4; + ELSE + state := 6; -- error + END IF; + + WHEN 3 => -- s state + -- s format successfully recognized exit now. + EXIT; + + WHEN 4 => -- . state + IF (ch >= '0' AND ch <= '9') THEN + pr := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSE + state := 6; -- error + END IF; + + WHEN 5 => -- print % + EXIT; + + WHEN 6 => -- error state + -- print error message + ASSERT false + REPORT " Format error --- expected %s format " + SEVERITY ERROR; + EXIT; + + WHEN 7 => + -- precision + IF (ch >= '0' AND ch <= '9') THEN + pr := pr * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 7; + ELSIF (ch = 's') THEN + state := 3; + ELSE + state := 6; -- error + END IF; + END CASE; + ELSE + assert false + report " Format Error: Observed =" & fmt &LF + & " Expected = %s (detected by S_Machine) " + severity ERROR; + exit; + END IF; + + END LOOP; + + IF (fw > max_string_len) THEN + fwidth := max_string_len; + ELSE + fwidth := fw; + END IF; + + precison := pr; + RETURN; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : SOX_Machine +--| hidden +--| Overloading : None +--| +--| Purpose : Finite State automaton to recognise a binary_vector +--| to a string format. +--| format will be broken into field width, precision +--| and justification (left or right) and notation (binary, +--| octal or hex ). +--| +--| Parameters : fwidth -- output, INTEGER, field width +--| precision -- output, INTEGER, precison +--| justify -- OUTPUT, BIT +--| '0' right justified, +--| '1' left justified +--| str_type -- output, character, +--| -- can be any of the characters s, O (o), X (x) +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : +--| +--| NOTE : +--| This procedure is +--| called in the function To_String. +--| +--| Use : +--| VARIABLE fmt : STRING(1 TO format'LENGTH) := format; +--| VARIABLE fw : INTEGER; +--| VARIABLE precis : INTEGER; +--| VARIABLE justfy : BIT; +--| VARIABLE sttype : Character; +--| +--| SOX_Machine(fw, precis, justy, sttype,fmt); +--| +--|----------------------------------------------------------------------------- + PROCEDURE SOX_Machine ( VARIABLE fwidth : OUT INTEGER; + VARIABLE precison : OUT INTEGER; + VARIABLE justify : OUT BIT; + VARIABLE str_type : OUT character; + CONSTANT format : IN STRING + ) IS + VARIABLE state : INT8 := 0; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE ch : CHARACTER; + VARIABLE index : INTEGER := 1; + VARIABLE fw : INTEGER := 0; + VARIABLE pr : INTEGER := 0; + + BEGIN + -- make sure first character is '%' if not error + ch := fmt(index); + IF (fmt(index) /= '%') THEN + ASSERT false + REPORT " Format Error --- first character of format " & + " is not '%' as expected." + SEVERITY ERROR; + RETURN; + END IF; + justify := '0'; -- default is right justification + + WHILE (state /= 3) LOOP + IF (index < format'LENGTH) THEN + index := index + 1; + ch := fmt(index); + CASE state IS + WHEN 0 => + IF (ch ='-') THEN + state := 1; -- justify + ELSIF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; -- digits + ELSIF ((ch = 's') OR (ch = 'o') OR (ch ='O') + OR (ch = 'x') OR (ch = 'X')) THEN + state := 3; -- end state + str_type := ch; + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = '%') THEN + state := 5; + ELSE + state := 6; -- error + END IF; + + WHEN 1 => + justify := '1'; -- left justfy + IF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; + ELSIF (ch = '.') THEN + state := 4; + ELSIF ((ch = 's') OR (ch = 'o') OR (ch ='O') + OR (ch = 'x') OR (ch = 'X')) THEN + state := 3; + justify := '0'; -- %- is equivalent to % + ELSE + state := 6; -- error + END IF; + + WHEN 2 => -- + IF (ch >= '0' AND ch <= '9') THEN + fw := fw * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 2; + ELSIF ((ch = 's') OR (ch = 'o') OR (ch ='O') + OR (ch = 'x') OR (ch = 'X')) THEN + state := 3; -- end state + str_type := ch; + ELSIF (ch = '.') THEN + state := 4; + ELSE + state := 6; -- error + END IF; + + WHEN 3 => -- sox state + -- sox format successfully recognized exit now. + EXIT; + + WHEN 4 => -- . state + IF (ch >= '0' AND ch <= '9') THEN + pr := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSE + state := 6; -- error + END IF; + + WHEN 5 => -- print % + EXIT; + + WHEN 6 => -- error state + -- print error message + ASSERT false + REPORT " Format error --- expected %s format " + SEVERITY ERROR; + EXIT; + + WHEN 7 => + -- precision + IF (ch >= '0' AND ch <= '9') THEN + pr := pr * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 7; + ELSIF ((ch = 's') OR (ch = 'o') OR (ch ='O') + OR (ch = 'x') OR (ch = 'X')) THEN + state := 3; -- end state + str_type := ch; + ELSE + state := 6; -- error + END IF; + END CASE; + ELSE + assert false + report " Format Error: Observed =" & fmt &LF + & " Expected = %s or %o r %x (detected by SOX_Machine) " + severity ERROR; + exit; + END IF; + + END LOOP; + + IF (fw > max_string_len) THEN + fwidth := max_string_len; + ELSE + fwidth := fw; + END IF; + + precison := pr; + RETURN; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : F_Machine +--| hidden +--| Overloading : None +--| +--| Purpose : Finite State automaton to recognise real number format. +--| format will be broken into field width, precision +--| and justification (left or right). +--| +--| Parameters : fwidth -- output, INTEGER, field width +--| precision -- output, INTEGER, Precision +--| justify -- OUTPUT, BIT +--| '0' right justified, +--| '1' left justified +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : INTEGER, length of output string. +--| +--| NOTE : +--| This procedure is +--| called in the funtion To_String when need to +--| a real number string. +--| +--| Use : +--| VARIABLE fmt : STRING(1 TO format'LENGTH) := format; +--| VARIABLE fw : INTEGER; +--| VARIABLE precis : INTEGER; +--| VARIABLE justfy : BIT; +--| +--| F_Machine(fw, precis, justy, fmt); +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE F_Machine ( VARIABLE fwidth : OUT INTEGER; + VARIABLE precison : OUT INTEGER; + VARIABLE justify : OUT BIT; + CONSTANT format : IN STRING + ) IS + VARIABLE state : INT8 := 0; -- starting state + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE ch : CHARACTER; + VARIABLE index : INTEGER := 1; + VARIABLE fw : INTEGER := 0; + VARIABLE pr : INTEGER := 0; + + BEGIN + + -- make sure first character is '%' if not error + ch := fmt(index); + IF (fmt(index) /= '%') THEN + ASSERT false + REPORT " Format Error --- first character of format " & + " is not '%' as expected." + SEVERITY ERROR; + return; + END IF; + justify := '0'; -- default is right justification + + WHILE (state /= 3) LOOP + IF (index < format'LENGTH) THEN + index := index + 1; + ch := fmt(index); + CASE state IS + WHEN 0 => + IF (ch ='-') THEN + state := 1; -- justify + ELSIF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; -- digits + ELSIF (ch = 'f') THEN + state := 3; -- end state + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = '%') THEN + state := 5; + ELSE + state := 6; -- error + END IF; + + WHEN 1 => + justify := '1'; -- left justfy + IF (ch >= '0' AND ch <= '9') THEN + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 2; + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = 'f') THEN + state := 3; + justify := '0'; -- %-f is equivalent to %f + ELSE + state := 6; -- error + END IF; + + WHEN 2 => -- + IF (ch >= '0' AND ch <= '9') THEN + fw := fw * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = 'f') THEN + state := 3; + ELSIF (ch = '.') THEN + state := 4; + ELSE + state := 6; + END IF; + + WHEN 3 => -- f state + -- fromat successfully recognized, exit now. + EXIT; + + WHEN 4 => -- . state + IF (ch >= '0' AND ch <= '9') THEN + pr := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSE + state := 6; -- error + END IF; + + WHEN 5 => -- print % + EXIT; + + WHEN 6 => -- error state + -- print error message + ASSERT false + REPORT " Format Error --- expected %f format. " + SEVERITY ERROR; + EXIT; + + WHEN 7 => + -- precision + IF (ch >= '0' AND ch <= '9') THEN + pr := pr * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSIF (ch = 'f') THEN + state := 3; + ELSE + state := 6; -- error + END IF; + END CASE; + ELSE + assert false + report " Format Error: Observed =" & fmt &LF + & " Expected = %f (detected by F_Machine) " + severity ERROR; + exit; + END IF; + + END LOOP; + + IF (fw > max_string_len) THEN + fwidth := max_string_len; + ELSE + fwidth := fw; + END IF; + + IF (pr=0) THEN + precison := 6; -- use default precision + ELSE + precison := pr; + END IF; + RETURN; + END F_Machine; +--+----------------------------------------------------------------------------- +--| Function Name : D_Machine +--| hidden +--| Overloading : None +--| +--| Purpose : Finite State automaton to recognise integer format. +--| format will be broken into field width, precision +--| and justification (left or right). +--| +--| Parameters : fwidth -- output, INTEGER, field width +--| precision -- output, INTEGER, Precision +--| justify -- OUTPUT, BIT +--| '0' right justified, +--| '1' left justified +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : INTEGER, length of output string. +--| +--| NOTE : +--| This procedure is +--| called in the funtion To_String when need to +--| a real number string. +--| +--| Use : +--| VARIABLE fmt : STRING(1 TO format'LENGTH) := format; +--| VARIABLE fw : INTEGER; +--| VARIABLE precis : INTEGER; +--| VARIABLE justfy : BIT; +--| +--| D_Machine(fw, precis, justy, fmt); +--| +--|----------------------------------------------------------------------------- + PROCEDURE D_Machine ( VARIABLE fwidth : OUT INTEGER; + VARIABLE precison : OUT INTEGER; + VARIABLE justify : OUT BIT; + CONSTANT format : IN STRING + ) IS + VARIABLE state : INT8 := 0; -- starting state + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE ch : CHARACTER; + VARIABLE index : INTEGER := 1; + VARIABLE fw : INTEGER := 0; + VARIABLE pr : INTEGER := 0; + + BEGIN + -- make sure first character is '%' if not error + ch := fmt(index); + IF (fmt(index) /= '%') THEN + ASSERT false + REPORT " Format Error --- first character of format " & + " is not '%' as expected." + SEVERITY ERROR; + return; + END IF; + justify := '0'; -- default is right justification + WHILE (state /= 3) LOOP + IF (index < format'LENGTH) THEN + index := index + 1; + ch := fmt(index); + CASE state IS + WHEN 0 => IF (ch ='-') THEN + state := 1; -- justify + ELSIF (ch >= '0' AND ch <= '9') THEN -- to_digit + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 2; -- digits state + ELSIF (ch = 'd') THEN + state := 3; -- end state + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = '%') THEN + state := 5; + ELSE + state := 6; -- error + END IF; + + WHEN 1 => justify := '1'; -- left justfy + IF (ch >= '0' AND ch <= '9') THEN -- to_digit + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = 'd') THEN + state := 3; + justify := '0'; -- %-d is equivalent to %d + ELSE + state := 6; -- error + END IF; + + WHEN 2 => -- digits state + IF (ch >= '0' AND ch <= '9') THEN + fw := fw * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = 'd') THEN + state := 3; + ELSIF (ch = '.') THEN + state := 4; + ELSE + state := 6; + END IF; + + WHEN 3 => -- d state + -- fromat successfully recognized, exit now. + EXIT; + + WHEN 4 => -- . state + IF (ch >= '0' AND ch <= '9') THEN + pr := CHARACTER'POS(ch) - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSE + state := 6; -- error + END IF; + + WHEN 5 => -- print % + EXIT; + + WHEN 6 => -- error state + -- print error message + ASSERT false + REPORT " Format Error --- expected %f format. " + SEVERITY ERROR; + EXIT; + + WHEN 7 => -- precision + IF (ch >= '0' AND ch <= '9') THEN + pr := pr * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSIF (ch = 'd') THEN + state := 3; + ELSE + state := 6; -- error + END IF; + END CASE; + ELSE + assert false + report " Format Error: Observed =" & fmt &LF + & " Expected = %d (detected by D_Machine) " + severity ERROR; + exit; + END IF; + END LOOP; + -- decide field width (fwidth) + IF (fw > max_string_len) THEN + fwidth := max_string_len; + ELSE + fwidth := fw; + END IF; + precison := pr; -- set precision + RETURN; + END D_Machine; + ---------------------------------------------------------- + -- Function Name : i_TRUNC + -- hidden + -- Parameters : + -- in :: Real_val : real; + -- Returns : Integer portions of a real number + -- Purpose : TO obtain the integer part of a general real + -- Notes : + ---------------------------------------------------------- + FUNCTION i_TRUNC ( CONSTANT real_val : IN real + ) RETURN integer IS + VARIABLE rval : real; + VARIABLE i : integer; + begin + -- find the integer value rounded to integer number less than + -- the real value. if the real number is 0.0 then return 0 + if (real_val = 0.0) then + i := 0; + else + rval := real_val - 0.5; + i := INTEGER(rval); + end if; + RETURN i; + END i_TRUNC; + + ------------------------------------------------------- + -- Function Name : i_FRAC + -- hidden + -- Parameters : + -- in :: Real_val : real; + -- Returns : Fractional portion of the real and no of fractional + -- digits present + -- Purpose : to obtain the fractional part of a general real + -- Notes : + ---------------------------------------------------------- + PROCEDURE i_FRAC ( CONSTANT real_val : IN real; + VARIABLE f_val : OUT INTEGER; + VARIABLE f_digits : OUT INTEGER + ) IS + VARIABLE rval : real; + VARIABLE ival : integer; + VARIABLE i : integer := 0; + begin + ival := i_TRUNC(real_val); + rval := real_val - REAL(ival); + i := INTEGER(rval * 1000000.0); + IF (i>=0 and i<=9) THEN + f_digits := 1; + ELSIF (i>=10 and i<=99) THEN + f_digits := 2; + + ELSIF (i>=10 and i<=99) THEN + f_digits := 2; + + ELSIF (i>=100 and i<=999) THEN + f_digits := 3; + + ELSIF (i>=1000 and i<=9999) THEN + f_digits := 4; + + ELSIF (i>=10000 and i<=99999) THEN + f_digits := 5; + + ELSIF (i>=100000 and i<=999999) THEN + f_digits := 6; + ELSE + f_digits := 0; + END IF; + + f_val := i; + return; + + end i_FRAC; +--|----------------------------------------------------------------------------- + +--+----------------------------------------------------------------------------- +--| Function Name : Is_White +--| hidden. +--| Overloading : None +--| +--| Purpose : Test whether a character is a blank, a tab or +--| a newline character. +--| +--| Parameters : +--| c - input Character. +--| +--| Result :Booelan -- True if the argument c is a blank or a tab(HT), +--| or a line feed (LF), or carriage return (CR). false otherwise. +--| +--| +--| See Also : Is_Space +--|----------------------------------------------------------------------------- + FUNCTION Is_White ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + VARIABLE result : BOOLEAN; + BEGIN + IF ( (c = ' ') OR (c = HT) OR (c = CR) OR (c=LF) ) THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : Find_NonBlank +--| hidden +--| Overloading : for extra parameter - index (see below) +--| +--| Purpose : Find first non_blank character in a string. +--| +--| Parameters : +--| str_in - input , +--| +--| Result : Natural, index of non_blank character. If string +--| has all the white character then str_in'LENGTH is +--| returned; +--| +--| NOTE : +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 10) := " TRUE"; +--| VARIABLE idx: Natural +--| +--| idx := Find_NonBlank (s_flag); +--| +--|----------------------------------------------------------------------------- + FUNCTION Find_NonBlank ( CONSTANT str_in : IN STRING + ) RETURN NATURAL IS + VARIABLE str_copy : STRING (1 TO str_in'LENGTH) := str_in; + VARIABLE index : Natural := 1; + VARIABLE ch : character; + + BEGIN + loop + EXIT WHEN ( (index > str_in'LENGTH) or (str_copy(index) = NUL) ); + if Is_White(str_copy(index)) then + index := index + 1; + else + EXIT; + end if; + end loop; + return index; +-- +-- old code +-- +-- ch := str_copy(index); +-- while ( ( index < str_in'LENGTH) AND (Is_White(ch) ) ) LOOP +-- index := index + 1; +-- ch := str_copy(index); +-- end LOOP; +-- return index; + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : Find_NonBlank +--| hidden +--| Overloading : for no index parameter - see abov +--| +--| Purpose : Find first non_blank character in a string, starting +--| from position indicated by index. +--| +--| Parameters : str_in - input string , +--| index - input NATURAL +--| +--| Result : Natural, index of non_blank character. If string +--| has all the white character then str_in'LENGTH is +--| returned; +--| +--| NOTE : assumes string has left index of 1 +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 10) := " TRUE"; +--| VARIABLE idx: Natural +--| +--| idx := Find_NonBlank (s_flag); +--| +--|----------------------------------------------------------------------------- + FUNCTION Find_NonBlank ( CONSTANT str_in : IN STRING; + CONSTANT index : IN NATURAL + ) RETURN NATURAL IS + + VARIABLE ch : character; + VARIABLE indx : integer := index; + + BEGIN + loop + EXIT WHEN ( (indx > str_in'LENGTH) or (str_in(indx) = NUL) ); + if Is_White(str_in(indx)) then + indx := indx + 1; + else + EXIT; + end if; + end loop; + return indx; + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : get_token +--| hidden +--| Overloading : None +--| +--| Purpose : To get a token from a format string. +--| used in fprint procedure. +--| +--| +--| Parameters : +--| format -- input, STRING, +--| index -- input_output, INTEGER, +--| at input it represents the beginning +--| position of the word in the format +--| string. When procedure terminates +--| index represent the end of word. +--| token -- output, STRING, holds the result. +--| +--| NOTE : +--| +--| --------------------------------------------------------------------------- + PROCEDURE get_token ( CONSTANT format : IN STRING; + VARIABLE index : INOUT INTEGER; + VARIABLE token : OUT STRING + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE indx : INTEGER := index; + VARIABLE res_str : STRING(1 TO max_token_len); + -- % - fw.precison s + VARIABLE i : INTEGER := 1; + BEGIN + -- make sure it is a format string + ASSERT (fmt(indx) = '%') + REPORT " get_token --- not a format string " + SEVERITY ERROR; + res_str(i) := fmt(indx); + + fmt_loop: LOOP + i := i + 1; + indx := indx + 1; + res_str(i) := fmt(indx); + EXIT fmt_loop WHEN ( fmt(indx) = 's'); + END LOOP; + + index := indx; + token(1 TO i) := res_str(1 to i); -- fixing bug + RETURN; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : print_str_buf +--| +--| Overloading : None +--| +--| Purpose : Prints a string according to format specification to a +--| buffer string. +--| +--| Parameters : +--| buf - input_output, string, +--| index - input_output, integer +--| format - input STRING, +--| arg - input STRING, +--| +--| Result : formated LINE. +--| +--| NOTE : This will be called in the fprint to print each +--| individual argument. +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE print_str_buf (VARIABLE buf : INOUT string; + VARIABLE index : INOUT integer; + CONSTANT format : IN STRING; + CONSTANT arg : IN STRING + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE arg_copy : STRING(1 TO arg'LENGTH) := arg; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE non_nul_str : STRING(1 TO arg'LENGTH); + VARIABLE len : INTEGER := 0; + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- call procedure S_Machine to split the format string + S_Machine(fw, precis, justfy, fmt); + + IF ((precis = 0) OR (precis > arg'LENGTH)) THEN + precis := arg'LENGTH; + END IF; + + -- check for the null argument + IF ((arg'LENGTH = 0) AND (fw = 0)) THEN + return; + + ELSIF ((arg'LENGTH = 0) AND (fw /= 0)) THEN + result(1 TO fw) := (OTHERS => ' '); + + ELSIF (arg'LENGTH /= 0) THEN -- argument is not null + + -- copy arg until NUL character encountered or precis to the non_nul_str; + + FOR i IN 1 TO precis LOOP + EXIT when (arg_copy(i) = NUL); + len := len + 1; + non_nul_str(len) := arg_copy(i); + END LOOP; + + IF (len > fw) THEN + fw := len; + END IF; + + IF (justfy = '1') THEN + result(1 TO len) := non_nul_str(1 to len); --modifying + FOR i IN len + 1 TO fw LOOP + result(i) := ' '; + END LOOP; + ELSE + FOR i IN 1 TO fw - len LOOP + result(i) := ' '; + END LOOP; + result(fw - len + 1 TO fw) := non_nul_str(1 to len); -- modifying + END IF; + END IF; + + for i IN 1 TO fw LOOP + EXIT when (index > buf'LENGTH); + buf(index) := result(i); + index := index + 1; + END LOOP; + + IF (index <= buf'LENGTH) THEN + buf(index) := ' '; -- leave one blank between two strings. + index := index - 1; + END IF; + RETURN; + + -- That's all + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : print_str +--| +--| Overloading : None +--| +--| Purpose : Prints a string according to format specification. +--| +--| Parameters : +--| ll - input_output, LINE, +--| format - input STRING, +--| arg - input STRING, +--| +--| Result : formated LINE. +--| +--| NOTE : This will be called in the fprint to print each +--| individual argument. +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE print_str (VARIABLE ll : INOUT LINE; + CONSTANT format : IN STRING; + CONSTANT arg : IN STRING + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE arg_copy : STRING(1 TO arg'LENGTH) := arg; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE non_nul_str : STRING(1 TO arg'LENGTH); + VARIABLE len : INTEGER := 0; + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- call procedure S_Machine to split the format string + S_Machine(fw, precis, justfy, fmt); + + IF ((precis = 0) OR (precis > arg'LENGTH)) THEN + precis := arg'LENGTH; + END IF; + + -- check for the null argument + IF ((arg'LENGTH = 0) AND (fw = 0)) THEN + return; + + ELSIF ((arg'LENGTH = 0) AND (fw /= 0)) THEN + result(1 TO fw) := (OTHERS => ' '); + + ELSIF (arg'LENGTH /= 0) THEN -- argument is not null + -- copy arg until NUL character to the non_nul_str; + FOR i IN 1 TO precis LOOP + EXIT when (arg_copy(i) = NUL); + len := len + 1; + non_nul_str(len) := arg_copy(i); + END LOOP; + + IF ( len > fw) THEN + fw := len; + END IF; + + IF (justfy = '1') THEN + result(1 TO len) := non_nul_str(1 to len); -- modifying + FOR i IN len + 1 TO fw LOOP + result(i) := ' '; + END LOOP; + ELSE + FOR i IN 1 TO fw - len LOOP + result(i) := ' '; + END LOOP; + result(fw - len + 1 TO fw) := non_nul_str(1 to len); -- modifying + END IF; + END IF; + WRITE(ll, result(1 TO fw)); + RETURN; + + -- That's all + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : print_str +--| +--| Overloading : None +--| +--| Purpose : writes a string according to format specification to an +--| ascii_text file +--| +--| Parameters : +--| asc_file - input, ASCII_TEXT, +--| format - input STRING, +--| arg - input STRING, +--| +--| Result : formated LINE. +--| +--| NOTE : This will be called in the fprint to print each +--| individual argument. +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE print_str (VARIABLE asc_file : OUT ASCII_TEXT; + CONSTANT format : IN STRING; + CONSTANT arg : IN STRING + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE arg_copy : STRING(1 TO arg'LENGTH) := arg; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE non_nul_str : STRING(1 TO arg'LENGTH); + VARIABLE len : INTEGER := 0; + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- call procedure S_Machine to split the format string + S_Machine(fw, precis, justfy, fmt); + + IF ((precis = 0) OR (precis > arg'LENGTH)) THEN + precis := arg'LENGTH; + END IF; + + -- check for the null argument + IF ((arg'LENGTH = 0) AND (fw = 0)) THEN + return; + + ELSIF ((arg'LENGTH = 0) AND (fw /= 0)) THEN + result(1 TO fw) := (OTHERS => ' '); + + ELSIF (arg'LENGTH /= 0) THEN -- argument is not null + -- copy arg until NUL character encountered or precison to the non_nul_str; + FOR i IN 1 TO precis LOOP + EXIT when (arg_copy(i) = NUL); + len := len + 1; + non_nul_str(len) := arg_copy(i); + END LOOP; + + IF (len > fw) THEN + fw := len; + END IF; + + IF (justfy = '1') THEN + result(1 TO len) := non_nul_str(1 to len); -- modifying + FOR i IN len + 1 TO fw LOOP + result(i) := ' '; + END LOOP; + ELSE + FOR i IN 1 TO fw - len LOOP + result(i) := ' '; + END LOOP; + result(fw - len + 1 TO fw) := non_nul_str(1 to len); -- modifying + END IF; + END IF; + + FOR i IN 1 TO fw LOOP + WRITE(asc_file, result(i)); + END LOOP; + + RETURN; + + -- That's all + END; + + + +-- ----------------------------------------------------------------------------- +-- ----------------------------------------------------------------------------- +-- V I S I B L E ROUTINES START HERE +-------------------------------------------------------------------------------- +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a boolean. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : A boolean true or false. +--| +--| NOTE : +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 5) := " TRUE"; +--| VARIABLE OK : BOOLEAN +--| +--| OK := From_String (s_flag); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN boolean IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : boolean ; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String -- input string has zero length. Boolean case" + severity ERROR; + RETURN FALSE; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN FALSE; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN FALSE; + END IF; + ch := str_copy(index); + CASE ch IS + WHEN 'F' => IF ((str'length - index) < 4 ) THEN + result := FALSE; + assert false + report " From_String --- input string has too few characters." + severity ERROR; + ELSIF ( ((str'length - index) = 4 ) AND + (str_copy(index TO index+4) = "FALSE") ) THEN + result := FALSE; + ELSIF ( (str_copy(index TO index + 4) = "FALSE") + AND( (str_copy(index + 5) = NUL) OR + Is_White( str_copy(index + 5) ) ) ) THEN + result := FALSE; + ELSE + result := FALSE; + assert false + report " From_String --- mismatch in boolean " + severity ERROR; + END IF; + + WHEN 'T' => IF ((str'length - index) < 3 ) THEN + result := FALSE; + assert false + report " From_String --- input string has too few characters " + severity ERROR; + ELSIF ( (( str'length - index ) = 3) AND + (str_copy(index TO index + 3 ) = "TRUE")) THEN + result := TRUE; + ELSIF ((str_copy(index TO index + 3) = "TRUE") + AND( (str_copy(index + 4) = NUL) OR + Is_White( str_copy(index + 4) ) ) ) THEN + result := TRUE; + ELSE + result := FALSE; + assert false + report "From_String --- mismatch in boolean " + severity ERROR; + END IF; + + WHEN OTHERS => result := FALSE; + assert false + report " From_String --- cannot find a boolean " + severity ERROR; + + END CASE; + RETURN result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a bit. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : bit. +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_val : bit; +--| +--| b_val := From_String (" 100"); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN bit IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := str; + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : bit ; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has zero length" + severity ERROR; + RETURN '0'; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN '0'; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN '0'; + END IF; + + ch := str_copy(index); + CASE ch IS + WHEN '1' => result := '1'; + WHEN '0' => result := '0'; + WHEN OTHERS => assert false + REPORT "From_String(str(" & To_String(index) & ") => " + & To_String(ch) & ") is an invalid character " + severity ERROR; + result := '0'; + END CASE; + RETURN RESULT; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a Severity_Level. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Severity_Level +--| +--| NOTE : +--| +--| Use : +--| VARIABLE str10 : String(1 TO 10) := " WARNING"; +--| VARIABLE sev : severity_level; +--| +--| sev := From_String (str10); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN severity_level IS + + VARIABLE str_copy : STRING (1 TO str'LENGTH):= To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : SEVERITY_LEVEL ; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has zero length " + severity ERROR; + RETURN NOTE; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN NOTE; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN NOTE; + END IF; + + ch := str_copy(index); + CASE ch IS + WHEN 'N' => result := NOTE; + IF ((str'length - index) < 3 ) THEN + assert false + report " From_String --- input string has too few characters." + severity ERROR; + + ELSIF ( (( str'length - index ) = 3) AND + (str_copy(index TO index + 3 ) = "NOTE")) THEN + result := NOTE; + ELSIF ((str_copy(index TO index + 3) = "NOTE") + AND( (str_copy(index + 4) = NUL) OR + Is_White( str_copy(index + 4) ) ) ) THEN + result := NOTE; + ELSE + assert false + report " From_String --- mismatch in string " + severity ERROR; + END IF; + + WHEN 'W' => result := NOTE; + IF ((str'length - index) < 6 ) THEN + assert false + report " From_String --- input string has too few characters." + severity ERROR; + + ELSIF ( (( str'length - index ) = 6) AND + (str_copy(index TO index + 6) = "WARNING")) THEN + result := WARNING; + ELSIF ((str_copy(index TO index + 6) = "WARNING") + AND( (str_copy(index + 7) = NUL) OR + Is_White( str_copy(index + 7) ) ) ) THEN + result := WARNING; + ELSE + assert false + report " From_String --- mismatch in string " + severity ERROR; + END IF; + + WHEN 'E' => result := NOTE; + IF ((str'length - index) < 4 ) THEN + assert false + report " From_String --- input string has too few characters." + severity ERROR; + + ELSIF ( (( str'length - index ) = 4) AND + (str_copy(index TO index + 4) = "ERROR")) THEN + result := ERROR; + ELSIF ((str_copy(index TO index + 4) = "ERROR") + AND( (str_copy(index + 5) = NUL) OR + Is_White( str_copy(index + 5) ) ) ) THEN + result := ERROR; + ELSE + assert false + report " From_String --- mismatch in string " + severity ERROR; + END IF; + + WHEN 'F' => result := NOTE; + IF ((str'length - index) < 6 ) THEN + assert false + report " From_String --- input string has too few characters." + severity ERROR; + + ELSIF ( (( str'length - index ) = 6) AND + (str_copy(index TO index + 6) = "FAILURE")) THEN + result := FAILURE; + ELSIF ((str_copy(index TO index + 6) = "FAILURE") + AND( (str_copy(index + 7) = NUL) OR + Is_White( str_copy(index + 7) ) ) ) THEN + result := FAILURE; + ELSE + assert false + report " From_String --- mismatch in string " + severity ERROR; + END IF; + + WHEN OTHERS => result := NOTE; + assert false + report " From_String --- cannot find a severity-level " + severity ERROR; + END CASE; + return result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a character. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Character +--| +--| NOTE : +--| +--| Use : +--| VARIABLE str10 : String(1 TO 10) := "WARNING "; +--| VARIABLE ch : character; +--| +--| ch := From_String (str10); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN character IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := str; + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : character; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has a null range " + severity ERROR; + RETURN NUL; + + END IF; + -- left most character of the string is returned + result := str_copy(1); + IF (result = NUL) THEN + assert false + report " From_String --- First character is a NUL " + severity ERROR; + END IF; + return result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an Integer. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Integer +--| +--| NOTE : +--| +--| Use : +--| VARIABLE n : Integer; +--| +--| n := From_String ("32 56"); +--| This statement will set n to integer 32. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN INTEGER IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := str; + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : INTEGER := 0; + VARIABLE neg_sign : boolean := false; + VARIABLE invalid : boolean := false; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has zero length " + severity ERROR; + RETURN INTEGER'LEFT; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN INTEGER'LEFT; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN INTEGER'LEFT; + END IF; + ch := str_copy(index); + -- check for - sign or + sign + IF (ch = '-') Then + neg_sign := NOT neg_sign; + index := index + 1; + ch := str_copy(index); -- get_char + elsif (ch = '+') then + index := index + 1; + ch := str_copy(index); -- get_char + END IF; + + -- Strip off leading zero's + While ( (ch = '0') AND (index < str'LENGTH)) LOOP + index := index + 1; + ch := str_copy(index); -- get_char + END LOOP; + For i in index TO str'LENGTH LOOP + ch := str_copy(i); + if (Is_Digit(ch)) then + result := result * 10 + ( CHARACTER'POS(ch) + - CHARACTER'POS('0') ); -- to digit + elsif ((Is_White(ch)) OR (ch = NUL)) THEN + exit; + else + invalid := TRUE; + result := INTEGER'LEFT; + ASSERT FALSE + REPORT "From_String(str(" & To_String(i) & ") => " + & To_String(ch) & ") is an invalid character " + SEVERITY ERROR; + exit; + end if; + end loop; + if ( neg_sign AND (not invalid) )THEN + result := - result; + END IF; + return result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a real. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : real value +--| +--| NOTE : +--| +--| Use : +--| VARIABLE n : real ; +--| +--| n := From_String (" -354.78"); +--| This statement will set n to real value -354.78. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN REAL IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := str; + VARIABLE index : Natural; + VARIABLE digit_val : Integer; + VARIABLE power : Integer; + VARIABLE integ_part : Integer := 0; + VARIABLE fract_part : Integer := 0; + VARIABLE r : real := 0.0; + VARIABLE ch : character; + VARIABLE neg_sign : boolean := false; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has zero length " + severity ERROR; + RETURN REAL'LEFT; + + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN REAL'LEFT; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN REAL'LEFT; + END IF; + ch := str_copy(index); + -- check for - sign or + sign + IF (ch = '-') Then + neg_sign := NOT neg_sign; + index := index + 1; + ch := str_copy(index); -- get_char + elsif (ch = '+') then + index := index + 1; + ch := str_copy(index); -- get_char + END IF; + + -- Strip off leading zero's + While ( (ch = '0') AND (index < str'LENGTH)) LOOP + index := index + 1; + ch := str_copy(index); -- get_char + END LOOP; + + -- convert the integeral part by going through the loop + -- until '.' is encountered + + WHILE ((ch /= '.') AND (index < str'LENGTH)) LOOP + + if (Is_digit(ch)) THEN + integ_part := integ_part * 10 + ( CHARACTER'POS(ch) + - CHARACTER'POS('0') ); -- to digit + else + ASSERT FALSE + REPORT "From_String(str(" & To_String(index) & ") => " + & To_String(ch) & ") is an invalid character " + SEVERITY ERROR; + return real'LEFT; + end if; + index := index + 1; + ch := str_copy(index); + END LOOP; + -- convert the fractional part to real value + -- + if ( ch = '.') THEN + index := index + 1; + END IF; + power := 0; + For i IN index TO str'LENGTH LOOP + ch := str_copy(i); + if (Is_digit(ch)) THEN + power := power + 1; + fract_part := fract_part * 10 + ( CHARACTER'POS(ch) + - CHARACTER'POS('0') ); -- to digit + elsif ((Is_White(ch)) OR (ch = NUL)) THEN + exit; + else + ASSERT FALSE + REPORT "From_String(str(" & To_String(i) & ") => " + & To_String(ch) & ") is an invalid character " + SEVERITY ERROR; + return real'LEFT; + end if; + end loop; + + r := real(integ_part) + real(fract_part) / 10.0 ** power; + if neg_sign THEN + r := - r; + END IF; + return r; + END; +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_ulogic. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_ulogic +--| +--| NOTE : +--| +--| Use : +--| VARIABLE u_val : std_ulogic ; +--| +--| u_val := From_String (" 100"); +--| This statement will set u_val equal to the value '1'. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_ulogic IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE result : std_ulogic; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has zero length " + severity ERROR; + RETURN 'U'; + END IF; + -- find the position of the first non-white character. + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN 'U'; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN 'U'; + END IF; + ch := str_copy(index); + CASE ch IS + WHEN 'U' => result := 'U'; + WHEN 'X' => result := 'X'; + WHEN '0' => result := '0'; + WHEN '1' => result := '1'; + WHEN 'Z' => result := 'Z'; + WHEN 'W' => result := 'W'; + WHEN 'L' => result := 'L'; + WHEN 'H' => result := 'H'; + WHEN '-' => result := '-'; + WHEN OTHERS => + result := 'U'; + ASSERT FALSE + REPORT "From_String(str(" & To_String(index) & ") => " + & To_String(ch) & ") is an invalid character " + SEVERITY ERROR; + END CASE; + return result; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_ulogic_vector. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_ulogic_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE u_vector : std_ulogic_vector( 7 DOWNTO 0) ; +--| +--| u_vector := From_String (" 0-ZU1010 1010"); +--| This statement will set u_vector equal to "0-ZU1010". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_ulogic_vector IS + VARIABLE str_copy : STRING ( 1 to str'LENGTH ) := To_Upper(str); + VARIABLE invalid : boolean := false; + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE i, idx : Integer; + VARIABLE r : std_ulogic_vector(1 TO str'length); + VARIABLE result : std_ulogic_vector(str'length-1 downto 0); + BEGIN + if (StrLen (str) = 0) THEN + assert false report " From String --- input string has zero length "; + return ""; + end if; + -- find the position of the first non-white character. + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN ""; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN ""; + END IF; + i := 0; + FOR idx IN index TO str'length LOOP + i := i + 1; + ch := str_copy(idx); + CASE ch IS + WHEN 'U' => r(i) := 'U'; + WHEN 'X' => r(i) := 'X'; + WHEN '0' => r(i) := '0'; + WHEN '1' => r(i) := '1'; + WHEN 'Z' => r(i) := 'Z'; + WHEN 'W' => r(i) := 'W'; + WHEN 'L' => r(i) := 'L'; + WHEN 'H' => r(i) := 'H'; + WHEN '-' => r(i) := '-'; + WHEN NUL => i := i - 1; -- last index was the non-NUL + exit; + WHEN OTHERS => IF (NOT Is_White(ch)) THEN + -- a non binary value was passed + ASSERT (invalid) + REPORT "From_String(str(" & To_String(idx) & ") => " + & To_String(ch) & ") is an invalid character " + SEVERITY ERROR; + invalid := TRUE; + else + i := i - 1; -- last index was the non-white + EXIT; -- found a white space ! + END IF; + END CASE; + END LOOP; + if invalid THEN + for k in 1 to i loop + r(k) := 'U'; -- fill with 'U's + end loop; + end if; + result (i-1 downto 0) := r(1 to i); + return result(i-1 downto 0); + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_logic_vector. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_logic_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE logic_vect : std_logic_vector( 7 DOWNTO 0) ; +--| +--| logic_vect := From_String (" 0-ZU1010 1010"); +--| This statement will set logic_vect equal to "0-ZU1010". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_logic_vector IS + VARIABLE str_copy : STRING ( 1 to str'LENGTH ) := To_Upper(str); + VARIABLE invalid : boolean := false; + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE i, idx : Integer; + VARIABLE r : std_logic_vector(1 TO str'length); + VARIABLE result : std_logic_vector(str'length-1 downto 0); + BEGIN + if (StrLen (str) = 0) THEN + assert false report " From String --- input string has zero length "; + return ""; + end if; + -- find the position of the first non-white character. + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN ""; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_String -- first non_white character is a NUL "; + RETURN ""; + END IF; + + i := 0; + FOR idx IN index TO str'length LOOP + i := i + 1; + ch := str_copy(idx); + CASE ch IS + WHEN 'U' => r(i) := 'U'; + WHEN 'X' => r(i) := 'X'; + WHEN '0' => r(i) := '0'; + WHEN '1' => r(i) := '1'; + WHEN 'Z' => r(i) := 'Z'; + WHEN 'W' => r(i) := 'W'; + WHEN 'L' => r(i) := 'L'; + WHEN 'H' => r(i) := 'H'; + WHEN '-' => r(i) := '-'; + WHEN NUL => i := i - 1; -- last index was the non-NUL + exit; + WHEN OTHERS => IF (NOT Is_White(ch)) THEN + -- a non binary value was passed + ASSERT (invalid) + REPORT "From_String(str(" & To_String(idx) & ") => " + & To_String(ch) & ") is an invalid character" + SEVERITY ERROR; + invalid := TRUE; + ELSE + i := i - 1; -- last index was the non-white + EXIT; -- found a white space ! + END IF; + END CASE; + END LOOP; + if invalid THEN + for k in 1 to i loop + r(k) := 'U'; -- fill with 'U's + end loop; + end if; + result (i-1 downto 0) := r(1 to i); + return result(i-1 downto 0); + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_BinString +--| +--| Overloading : None +--| +--| Purpose : Convert from a Binary String to a bit_vector. +--| +--| Parameters : +--| str - input , binary string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 7 DOWNTO 0) ; +--| +--| b_vect := From_BinString (" 01101111 1010"); +--| This statement will set b_vect equal to "01101111". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_BinString ( CONSTANT str : IN STRING + ) RETURN bit_vector IS + VARIABLE str_copy : STRING (1 TO str'LENGTH) := To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE i, idx : Integer; + VARIABLE invalid : boolean := false; + VARIABLE r : bit_vector(1 TO str'length); + VARIABLE result : bit_vector(str'length - 1 DOWNTO 0) ; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_BinString --- input string has a zero length "; + RETURN ""; + ELSIF (str(str'LEFT) = NUL) THEN + assert false + report " From_BinString --- input string has nul character " + &" at the LEFT position " + severity ERROR; + RETURN ""; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_BinString --- input string is empty "; + RETURN ""; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_BinString -- first non_white character is a NUL "; + RETURN ""; + END IF; + + i := 0; + FOR idx IN index TO str'length LOOP + i := i + 1; + ch := str_copy(idx); + CASE ch IS + WHEN '0' => r(i) := '0'; + WHEN '1' => r(i) := '1'; + WHEN NUL => i := i - 1; -- last index was the non-NUL + exit; + WHEN OTHERS => IF (NOT IS_White(ch)) THEN + -- a non binary value was passed + ASSERT (invalid) + REPORT "From_BinString(str(" & To_String(idx) & ") => " + & To_String(ch) & ") is an invalid character" + SEVERITY ERROR; + invalid := TRUE; + else + i := i - 1; -- last index was the non-NUL + exit; + end if; + END CASE; + END LOOP; + -- check for invalid character in the string + if ( invalid ) THEN + r(1 TO i) := (OTHERS => '0'); + end if; + result(i-1 DOWNTO 0) := r(1 TO i); + return result(i - 1 DOWNTO 0); -- return slice of result + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_OctString +--| +--| Overloading : None +--| +--| Purpose : Convert from an Octal String to a bit_vector. +--| +--| Parameters : +--| str - input , Octal string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 15 DOWNTO 4) ; +--| +--| b_vect := From_OctString (" 1735 1010"); +--| This statement will set b_vect equal to "001111011101". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_OctString ( CONSTANT str : IN STRING + ) RETURN bit_vector IS + CONSTANT len : Integer := 3 * str'LENGTH; + CONSTANT oct_dig_len : Integer := 3; + VARIABLE str_copy : STRING (1 TO str'LENGTH) := To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE i, idx : Integer; + VARIABLE invalid : boolean := false; + VARIABLE r : bit_vector( 1 TO len) ; + VARIABLE result : bit_vector(len - 1 DOWNTO 0) ; + CONSTANT bin_zero : bit_vector(1 to 3) := "000"; -- this done for Mentor unsupported feature + CONSTANT bin_one : bit_vector(1 to 3) := "001"; + CONSTANT bin_two : bit_vector(1 to 3) := "010"; + CONSTANT bin_three : bit_vector(1 to 3) := "011"; + CONSTANT bin_four : bit_vector(1 to 3) := "100"; + CONSTANT bin_five : bit_vector(1 to 3) := "101"; + CONSTANT bin_six : bit_vector(1 to 3) := "110"; + CONSTANT bin_seven : bit_vector(1 to 3) := "111"; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_OctString --- input string has zero length "; + RETURN ""; + ELSIF (str(str'LEFT) = NUL) THEN + assert false + report " From_OctString --- input string has nul character" + & " at the LEFT position " + severity ERROR; + RETURN ""; -- null bit_vector + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_OctString --- input string is empty "; + RETURN ""; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_OctString -- first non_white character is a NUL "; + RETURN ""; + END IF; + + i := 0; + FOR idx IN index TO str'length LOOP + ch := str_copy(idx); + EXIT WHEN ((Is_White(ch)) OR (ch = NUL)); + CASE ch IS + WHEN '0' => r(i+1 TO i+oct_dig_len) := bin_zero; + WHEN '1' => r(i+1 TO i+oct_dig_len) := bin_one; + WHEN '2' => r(i+1 TO i+oct_dig_len) := bin_two; + WHEN '3' => r(i+1 TO i+oct_dig_len) := bin_three; + WHEN '4' => r(i+1 TO i+oct_dig_len) := bin_four; + WHEN '5' => r(i+1 TO i+oct_dig_len) := bin_five; + WHEN '6' => r(i+1 TO i+oct_dig_len) := bin_six; + WHEN '7' => r(i+1 TO i+oct_dig_len) := bin_seven; + WHEN NUL => exit; + WHEN OTHERS => -- a non binary value was passed + ASSERT (invalid) + REPORT "From_OctString(str(" & To_String(idx) & ") => " + & To_String(ch) & ") is an invalid character" + SEVERITY ERROR; + invalid := TRUE; + END CASE; + i := i + oct_dig_len; + END LOOP; + -- check for invalid character in the string + if ( invalid ) THEN + r(1 TO i) := (OTHERS => '0'); + end if; + result(i - 1 DOWNTO 0) := r(1 TO i); + return result(i-1 DOWNTO 0); -- return slice of result + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : From_HexString +--| +--| Overloading : None +--| +--| Purpose : Convert from a Hex String to a bit_vector. +--| +--| Parameters : +--| str - input , Hex string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 15 DOWNTO 4) ; +--| +--| b_vect := From_HexString (" 3DD 1010"); +--| This statement will set b_vect equal to "001111011101". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_HexString ( CONSTANT str : IN STRING + ) RETURN bit_vector IS + + CONSTANT len : Integer := 4 * str'LENGTH; + CONSTANT hex_dig_len : Integer := 4; + VARIABLE str_copy : STRING (1 TO str'LENGTH) := To_Upper(str); + VARIABLE index : Natural; + VARIABLE ch : character; + VARIABLE i, idx : Integer; + VARIABLE invalid : boolean := false; + VARIABLE r : bit_vector(1 TO len) ; + VARIABLE result : bit_vector(len - 1 DOWNTO 0); + CONSTANT bin_zero : bit_vector(1 to 4) := "0000"; -- this done for Mentor unsupported feature + CONSTANT bin_one : bit_vector(1 to 4) := "0001"; + CONSTANT bin_two : bit_vector(1 to 4) := "0010"; + CONSTANT bin_three : bit_vector(1 to 4) := "0011"; + CONSTANT bin_four : bit_vector(1 to 4) := "0100"; + CONSTANT bin_five : bit_vector(1 to 4) := "0101"; + CONSTANT bin_six : bit_vector(1 to 4) := "0110"; + CONSTANT bin_seven : bit_vector(1 to 4) := "0111"; + CONSTANT bin_eight : bit_vector(1 to 4) := "1000"; + CONSTANT bin_nine : bit_vector(1 to 4) := "1001"; + CONSTANT bin_ten : bit_vector(1 to 4) := "1010"; + CONSTANT bin_eleven : bit_vector(1 to 4) := "1011"; + CONSTANT bin_twelve : bit_vector(1 to 4) := "1100"; + CONSTANT bin_thirteen : bit_vector(1 to 4) := "1101"; + CONSTANT bin_fourteen : bit_vector(1 to 4) := "1110"; + CONSTANT bin_fifteen : bit_vector(1 to 4) := "1111"; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_HexString --- input string has zero length "; + RETURN ""; + + ELSIF (str(str'LEFT) = NUL) THEN + assert false + report " From_HexString --- input string has nul character" + & " at the LEFT position " + severity ERROR; + RETURN ""; -- null bit_vector + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_HexString --- input string is empty "; + RETURN ""; + ELSIF (str_copy(index)=NUL) THEN + assert false report " From_HexString -- first non_white character is a NUL "; + RETURN ""; + END IF; + + i := 0; + FOR idx IN index TO str'length LOOP + ch := str_copy(idx); + EXIT WHEN ((Is_White(ch)) OR (ch = NUL)); + CASE ch IS + WHEN '0' => r(i+1 TO i+ hex_dig_len) := bin_zero; + WHEN '1' => r(i+1 TO i+ hex_dig_len) := bin_one; + WHEN '2' => r(i+1 TO i+ hex_dig_len) := bin_two; + WHEN '3' => r(i+1 TO i+ hex_dig_len) := bin_three; + WHEN '4' => r(i+1 TO i+ hex_dig_len) := bin_four; + WHEN '5' => r(i+1 TO i+ hex_dig_len) := bin_five; + WHEN '6' => r(i+1 TO i+ hex_dig_len) := bin_six; + WHEN '7' => r(i+1 TO i+ hex_dig_len) := bin_seven; + WHEN '8' => r(i+1 TO i+ hex_dig_len) := bin_eight; + WHEN '9' => r(i+1 TO i+ hex_dig_len) := bin_nine; + WHEN 'A' | 'a' => r(i+1 TO i+ hex_dig_len) := bin_ten; + WHEN 'B' | 'b' => r(i+1 TO i+ hex_dig_len) := bin_eleven; + WHEN 'C' | 'c' => r(i+1 TO i+ hex_dig_len) := bin_twelve; + WHEN 'D' | 'd' => r(i+1 TO i+ hex_dig_len) := bin_thirteen; + WHEN 'E' | 'e' => r(i+1 TO i+ hex_dig_len) := bin_fourteen; + WHEN 'F' | 'f' => r(i+1 TO i+ hex_dig_len) := bin_fifteen; + WHEN NUL => exit; + WHEN OTHERS => -- a non binary value was passed + ASSERT (invalid) + REPORT "From_HexString(str(" & To_String(idx) & ") => " + & To_String(ch) & ") is an invalid character" + SEVERITY ERROR; + invalid := TRUE; + END CASE; + i := i + hex_dig_len; + END LOOP; + -- check for invalid character in the string + if ( invalid ) THEN + r(1 TO i) := (OTHERS => '0'); + end if; + result(i - 1 DOWNTO 0) := r(1 TO i); + return result(i - 1 DOWNTO 0); -- return slice of result + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.1 +--| Overloading : None +--| +--| Purpose : Convert a boolean to a String. +--| +--| Parameters : +--| val - input value, BOOLEAN, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a boolean. +--| +--| NOTE : +--| Default is right justified +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 5); +--| VARIABLE good : BOOLEAN := TRUE; +--| +--| s_flag := To_String ( good, "%5s" ); +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BOOLEAN; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE buf_str : STRING(1 TO 5) := (OTHERS => ' '); + VARIABLE str_len : INTEGER; + VARIABLE fw : INTEGER; + VARIABLE precis1 : INTEGER; + VARIABLE justfy : BIT; + CONSTANT FALSE_STR : STRING(1 to 5) := "FALSE"; -- for mentor unsupported feature + CONSTANT TRUE_STR : STRING(1 to 4) := "TRUE"; + + BEGIN + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- procedure S_Machine will issue the proper error messages. + S_Machine(fw, precis1, justfy, fmt); + + CASE val IS + WHEN FALSE + => + str_len := 5; + buf_str(1 TO str_len) := FALSE_STR; + + IF ((precis1 = 0) OR (precis1 > str_len)) THEN + precis1 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis1; + END IF; + + IF (precis1 >= fw) THEN + return(buf_str(1 TO precis1)); + ELSE + result(precis1 + 1 TO fw) := (OTHERS => ' '); + + END IF; + WHEN TRUE + => + str_len := 4; + buf_str(1 TO str_len) := TRUE_STR; + + IF ((precis1 = 0) OR (precis1 > str_len)) THEN + precis1 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis1; + END IF; + + IF (precis1 >= fw) THEN + return(buf_str(1 TO precis1)); + ELSE + result(precis1 + 1 TO fw) := (OTHERS => ' '); + + END IF; + + END CASE; + + IF (justfy = '1') THEN -- left jsutify + return (buf_str(1 TO precis1) & result(precis1 + 1 TO fw)); + ELSE -- right justified + return( result(precis1 + 1 TO fw) & buf_str(1 TO precis1)); + END IF; + + -- That's all + + END; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.2 +--| Overloading : None +--| +--| Purpose : Convert a bit Value to a String. +--| +--| Parameters : +--| val - input bit. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a bit. +--| +--| +--| Use : +--| VARIABLE bit_string : String(1 TO 5); +--| +--| bit_string := To_String ( '1', "%1s"); +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BIT; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis, justfy, fmt); + + IF (fw < 1) THEN + fw := 1; + END IF; + -- fill result from 1 to fw with blanks + result(1 TO fw) := (OTHERS => ' '); + + CASE val IS + + WHEN '1' => + IF (justfy = '1') THEN -- left justify + result(1) := '1'; + ELSE -- right justify + result (fw) := '1'; + END if; + + WHEN '0' => IF (justfy = '1') THEN -- left justify + result(1) := '0'; + ELSE -- right justify + result (fw) := '0'; + END if; + END CASE; + RETURN result(1 TO fw); -- return a slice. + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.3 +--| Overloading : None +--| +--| Purpose : Convert a Character to a String. +--| +--| Parameters : +--| val - input character. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Note : This function allows to see the non-printable characters. +--| FOR non_printable characters if precision is less than +--| 3 it will be automatically set to 3. +--| +--| Default precision will be set to eigther 3 or 1 +--| +--| Result : STRING representation of a character. +--| +--| +--| Use : +--| VARIABLE ascii_char : String(1 TO 5); +--| +--| ascii_char := To_String ( d, "%3s"); +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN CHARACTER; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + VARIABLE str2 : STRING(1 to 2); + VARIABLE str3 : STRING(1 to 3); + + + + BEGIN + -- + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis, justfy, fmt); + + -- since purpose of this routine to see input characters even if + -- they are non_printable, precision 3 for non_printable and 1 for + -- graphic characters. + + IF ((val >= NUL AND val <= USP) AND (fw < 3)) THEN + fw := 3; + ELSIF ((val = DEL) AND (fw < 3)) THEN + fw := 3; + ELSIF (fw = 0) THEN + fw := 1; + END IF; + + FOR i IN 1 TO fw LOOP + result(i) := ' '; + END LOOP; + + CASE val is + WHEN NUL => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "NUL"; + ELSE -- right justify + str3 := "NUL"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN SOH => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "SOH"; + ELSE -- right justify + str3 := "SOH"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN STX => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "STX"; + ELSE -- right justify + str3 := "STX"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN ETX => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "ETX"; + ELSE -- right justify + str3 := "ETX"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN EOT => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "EOT"; + ELSE -- right justify + str3 := "EOT"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN ENQ => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "ENQ"; + ELSE -- right justify + str3 := "ENQ"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN ACK => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "ACK"; + ELSE -- right justify + str3 := "ACK"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN BEL => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "BEL"; + ELSE -- right justify + str3 := "BEL"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN BS => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "BS"; + ELSE -- right justify + str2 := "BS"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN HT => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "HT"; + ELSE -- right justify + str2 := "HT"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN LF => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "LF"; + ELSE -- right justify + str2 := "LF"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN VT => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "VT"; + ELSE -- right justify + str2 := "VT"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN FF => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "FF"; + ELSE -- right justify + str2 := "FF"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN CR => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "CR"; + ELSE -- right justify + str2 := "CR"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN SO => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "SO"; + ELSE -- right justify + str2 := "SO"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN SI => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "SI"; + ELSE -- right justify + str2 := "SI"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN DLE => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DLE"; + ELSE -- right justify + str3 := "DLE"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN DC1 => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DC1"; + ELSE -- right justify + str3 := "DC1"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN DC2 => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DC2"; + ELSE -- right justify + str3 := "DC2"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN DC3 => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DC3"; + ELSE -- right justify + str3 := "DC3"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN DC4 => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DC4"; + ELSE -- right justify + str3 := "DC4"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN NAK => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "NAK"; + ELSE -- right justify + str3 := "NAK"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN SYN => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "SYN"; + ELSE -- right justify + str3 := "SYN"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN ETB => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "ETB"; + ELSE -- right justify + str3 := "ETB"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN CAN => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "CAN"; + ELSE -- right justify + str3 := "CAN"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN EM => + IF (justfy = '1') THEN -- left justify + result(1 TO 2) := "EM"; + ELSE -- right justify + str2 := "EM"; -- fix for mentor unsupported feature + result (fw - 1 TO fw) := str2; + END if; + WHEN SUB => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "SUB"; + ELSE -- right justify + str3 := "SUB"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN ESC => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "ESC"; + ELSE -- right justify + str3 := "ESC"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN FSP => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "FSP"; + ELSE -- right justify + str3 := "FSP"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN GSP => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "GSP"; + ELSE -- right justify + str3 := "GSP"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN RSP => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "RSP"; + ELSE -- right justify + str3 := "RSP"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN USP => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "USP"; + ELSE -- right justify + str3 := "USP"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN DEL => + IF (justfy = '1') THEN -- left justify + result(1 TO 3) := "DEL"; + ELSE -- right justify + str3 := "DEL"; -- fix for mentor unsupported feature + result (fw - 2 TO fw) := str3; + END if; + WHEN OTHERS => + IF (justfy = '1') THEN -- left justify + result(1) := val; + ELSE -- right justify + result (fw) := val; + END if; + END CASE; + RETURN result(1 TO fw); -- return a slice + END; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.4 +--| Overloading : None +--| +--| Purpose : Convert a severity-level to a string. +--| +--| Parameters : +--| val - input severity-level. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a severity-level. +--| +--| Use : +--| VARIABLE s_level : String(1 TO 7); +--| VARIABLE message : SEVERITY_LEVEL := NOTE; +--| +--| s_level := To_String (message, "%7s"); +--|------------------------------------------------------------------ + FUNCTION To_String ( CONSTANT val : IN SEVERITY_LEVEL; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE buf_str : STRING(1 TO 10); -- severity-level is maximum 7 characters + VARIABLE str_len : INTEGER; + VARIABLE fw : INTEGER; + VARIABLE precis2 : INTEGER; + VARIABLE justfy : BIT; + CONSTANT NOTE_STR : STRING(1 to 4) := "NOTE"; -- fix for mentor unsupported feature + CONSTANT WARNING_STR : STRING(1 to 7) := "WARNING"; + CONSTANT ERROR_STR : STRING(1 to 5) := "ERROR"; + CONSTANT FAILURE_STR : STRING(1 to 7) := "FAILURE"; + + BEGIN + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis2, justfy, fmt); + + CASE val IS + WHEN NOTE + => + str_len := 4; + buf_str(1 TO str_len) := NOTE_STR; + + IF ((precis2 = 0) OR (precis2 > str_len)) THEN + precis2 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis2; + END IF; + + IF (precis2 >= fw) THEN + return(buf_str(1 TO precis2)); + ELSE + result(precis2 + 1 TO fw) := (OTHERS => ' '); + + END IF; + + WHEN WARNING => + str_len := 7; + buf_str(1 TO str_len) := WARNING_STR; + + IF ((precis2 = 0) OR (precis2 > str_len)) THEN + precis2 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis2; + END IF; + + IF (precis2 >= fw) THEN + return(buf_str(1 TO precis2)); + ELSE + result(precis2 + 1 TO fw) := (OTHERS => ' '); + END IF; + + WHEN ERROR => + str_len := 5; + buf_str(1 TO str_len) := ERROR_STR; + + IF ((precis2 = 0) OR (precis2 > str_len)) THEN + precis2 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis2; + END IF; + + IF (precis2 >= fw) THEN + return(buf_str(1 TO precis2)); + ELSE + result(precis2 + 1 TO fw) := (OTHERS => ' '); + END IF; + + WHEN FAILURE => + str_len := 7; + buf_str(1 TO str_len) := FAILURE_STR; + + IF ((precis2 = 0) OR (precis2 > str_len)) THEN + precis2 := str_len; + END IF; + + IF (fw = 0) THEN + fw := precis2; + END IF; + + IF (precis2 >= fw) THEN + return(buf_str(1 TO precis2)); + ELSE + result(precis2 + 1 TO fw) := (OTHERS => ' '); + END IF; + + END CASE; + IF (justfy = '1') THEN -- left jsutify + return ( buf_str(1 TO precis2) & result(precis2 + 1 TO fw)); + ELSE -- right justified + return (result(precis2 + 1 TO fw) & buf_str(1 TO precis2)); + END IF; + + -- That's all + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.5 +--| Overloading : None +--| +--| Purpose : Convert an integer into a String according +--| format specification. +--| +--| Parameters : +--| val - input value, INTEGER, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of an integer. +--| +--| NOTE : Format string has same meaning a in C language. +--| That if format is "%d " will convert an integer to +--| a string of length equal to number of digits in the +--| given inetger argument. While "%10d " return +--| a string of length 10 and if the number of digits +--| in the integer are less than 10 it will pad the +--| string with blank on the left because default +--| justification is right. if number of digits are +--| larger than 10 it will return 10 leftmost digits. +--| +--| +--| +--| USE : +--| VARIABLE str : STRING(1 TO 10); +--| VARIABLE val : INTEGER := 2750; +--| +--| str := TO_String(val, "%10d"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN INTEGER; + CONSTANT format : IN STRING := "%d" + ) RETURN STRING IS + VARIABLE buf : string(max_string_len DOWNTO 1) ; -- implicitly == NUL + VARIABLE rbuf : string(max_string_len DOWNTO 1) ; + VARIABLE result : string(1 TO max_string_len) ; + VARIABLE str_index : integer := 0; + VARIABLE ival : integer; + VARIABLE format_cpy : STRING(1 TO format'LENGTH) := format; + VARIABLE indx : INTEGER; + VARIABLE fw : INTEGER; -- field width + VARIABLE precis : INTEGER; + VARIABLE justy : BIT := '0'; + + BEGIN + -- convert to positive number + ival := ABS(val); + IF ival = 0 then + str_index := str_index + 1; + buf(str_index) := '0'; + ELSE + int_loop : LOOP + str_index := str_index + 1; + CASE (ival MOD 10) IS + WHEN 0 => buf (str_index) := '0'; + WHEN 1 => buf (str_index) := '1'; + WHEN 2 => buf (str_index) := '2'; + WHEN 3 => buf (str_index) := '3'; + WHEN 4 => buf (str_index) := '4'; + WHEN 5 => buf (str_index) := '5'; + WHEN 6 => buf (str_index) := '6'; + WHEN 7 => buf (str_index) := '7'; + WHEN 8 => buf (str_index) := '8'; + WHEN 9 => buf (str_index) := '9'; + WHEN OTHERS => null; -- do nothing + END CASE; + ival := ival / 10; + EXIT int_loop WHEN ival=0; + END LOOP; + END IF; + + -- call procedure D_Machine to split the format string into + -- field width, and justification(left or right) and precision + D_Machine(fw, precis, justy, format_cpy); + + IF (precis > str_index) THEN -- pad with zeros to make up precision + buf(precis DOWNTO str_index + 1) := (OTHERS => '0'); + str_index := precis; + END IF; + + -- Handle the negative numbers here... + IF val < 0 then + str_index := str_index + 1; + buf (str_index) := '-'; + END IF; + + -- return the result according to field width and justification + IF (fw > str_index) THEN + case justy IS + WHEN '0' => + buf(fw DOWNTO str_index + 1) := (OTHERS => ' '); + return buf(fw DOWNTO 1); + WHEN '1' => + rbuf(fw - str_index DOWNTO 1) := (OTHERS => ' '); + result(1 TO str_index) := buf(str_index DOWNTO 1); + indx := str_index; + FOR i IN fw DOWNTO str_index+1 LOOP + indx := indx + 1; + result(indx) := ' '; + END LOOP; + return result(1 TO fw); + WHEN OTHERS => + ASSERT NOT WarningsOn + report " To_String --- error in justification " + SEVERITY WARNING; + return buf(str_index DOWNTO 1); + end case; + ELSE -- fw is lessthan or equal to std_index + return buf(str_index DOWNTO 1); + END IF; + + -- That's all + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.6 +--| Overloading : None +--| +--| Purpose : Convert a real number to a String. +--| +--| Parameters : +--| val - input value, REAL, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a real number. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 10); +--| VARIABLE val : REAL := 67.560 +--| +--| str := TO_String(val, "%10.3f"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN REAL; + CONSTANT format : IN STRING := "%f" + ) RETURN STRING IS + VARIABLE tbuf : string(max_string_len DOWNTO 1) ; -- implicitly == NUL + VARIABLE rbuf : string(max_string_len DOWNTO 1); + VARIABLE result : string(1 TO max_string_len); + VARIABLE str_index : Natural := 0; + VARIABLE rval : real; + VARIABLE int_val : INTEGER; + VARIABLE frac_digits : INTEGER; + VARIABLE fract_val : INTEGER; + VARIABLE format_cpy : string(1 TO format'length) := format; + VARIABLE fw_actual : integer; -- actual field width + VARIABLE indx : integer; + VARIABLE pr_actual : integer; -- actual precision + VARIABLE fw : integer; -- field width + VARIABLE precis : integer; -- precision + VARIABLE justy : BIT := '0'; -- justification + VARIABLE neg_sign : BOOLEAN := false ; + BEGIN + -- Handle the negative numbers here... + if val < 0.0 then + neg_sign := NOT neg_sign; + end if; + + rval := ABS (val); + int_val := i_TRUNC(rval); + i_Frac(rval, fract_val, frac_digits); + + -- call procedure F_Machine to split the format string into + -- field width, precision, and justification + + F_Machine(fw, precis, justy, format_cpy); + + -- convert fractional part to a string + IF fract_val = 0 then + str_index := str_index + 1; + tbuf(str_index) := '0'; + ELSE + fract_loop : LOOP + str_index := str_index + 1; + + CASE (fract_val MOD 10) IS + WHEN 0 => tbuf (str_index) := '0'; + WHEN 1 => tbuf (str_index) := '1'; + WHEN 2 => tbuf (str_index) := '2'; + WHEN 3 => tbuf (str_index) := '3'; + WHEN 4 => tbuf (str_index) := '4'; + WHEN 5 => tbuf (str_index) := '5'; + WHEN 6 => tbuf (str_index) := '6'; + WHEN 7 => tbuf (str_index) := '7'; + WHEN 8 => tbuf (str_index) := '8'; + WHEN 9 => tbuf (str_index) := '9'; + WHEN OTHERS => null; -- do nothing + END CASE; + fract_val := fract_val / 10; + EXIT fract_loop WHEN fract_val=0; + END LOOP; + END IF; + -- add leading zeros of fractional part + + FOR i IN 1 to 6 - frac_digits LOOP + str_index := str_index + 1; + tbuf(str_index) := '0'; + END LOOP; + + pr_actual := str_index; -- actual precision of give real number + + IF (precis > str_index) THEN + rbuf(precis - str_index DOWNTO 1) := (OTHERS => '0'); + rbuf(precis DOWNTO precis - str_index + 1) := tbuf(str_index DOWNTO 1); + ELSE + rbuf(precis DOWNTO 1) := tbuf(str_index DOWNTO str_index - precis + 1); + END IF; + + -- decimal point + str_index := precis + 1; + rbuf(str_index) := '.'; + + -- integer part of a real number + + IF int_val = 0 then + str_index := str_index + 1; + rbuf(str_index) := '0'; + ELSE + int_loop : LOOP + str_index := str_index + 1; + + CASE (int_val MOD 10) IS + WHEN 0 => rbuf (str_index) := '0'; + WHEN 1 => rbuf (str_index) := '1'; + WHEN 2 => rbuf (str_index) := '2'; + WHEN 3 => rbuf (str_index) := '3'; + WHEN 4 => rbuf (str_index) := '4'; + WHEN 5 => rbuf (str_index) := '5'; + WHEN 6 => rbuf (str_index) := '6'; + WHEN 7 => rbuf (str_index) := '7'; + WHEN 8 => rbuf (str_index) := '8'; + WHEN 9 => rbuf (str_index) := '9'; + WHEN OTHERS => null; -- do nothing + END CASE; + int_val := int_val / 10; + EXIT int_loop WHEN int_val=0; + END LOOP; + END IF; + -- negative sign + IF neg_sign THEN + str_index := str_index + 1; + rbuf(str_index) := '-'; + END IF; + fw_actual := str_index; -- actual field width of real + IF (fw <= fw_actual) THEN + return rbuf(fw_actual DOWNTO 1); + ELSIF (justy = '0') THEN -- right justify + For i In fw DOWNTO fw_actual + 1 LOOP + rbuf(i) := ' '; + END LOOP; + return rbuf(fw DOWNTO 1); + ELSIF (justy = '1' ) THEN -- left justify + result(1 TO fw_actual) := rbuf(fw_actual DOWNTO 1); + indx := fw_actual; + For i In fw - fw_actual DOWNTO 1 LOOP + indx := indx + 1; + result(indx) := ' '; + END LOOP; + return result(1 TO indx); + END IF; + -- That's all + END; +--+----------------------------------------------------------------------------- +--| Function Name : To_OctString +--| hidden +--| Overloading : None +--| +--| Purpose : Convert a bit_vector to a octal String. +--| +--| Parameters : +--| val - input, BIT_VECTOR, +--| +--| Result : STRING representation of a bit_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : BIT_VECTOR (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_OctString ( CONSTANT val : IN BIT_VECTOR; + CONSTANT format : IN STRING := "%o" + ) RETURN STRING IS + CONSTANT reslen : INTEGER := val'LENGTH; + CONSTANT oct_bits : INTEGER := 3; + VARIABLE last_bits : INTEGER; + VARIABLE oct_len : NATURAL; + VARIABLE loc_result : STRING(1 TO reslen); + VARIABLE oct_result : STRING(1 TO reslen) := (OTHERS => ' '); +-- VARIABLE oct_str : STRING(1 TO oct_bits); -- Intermetrics can't handle this on the case statement below! + VARIABLE oct_str : STRING(1 TO 3 ); + VARIABLE bv : BIT_VECTOR(1 TO reslen) := val; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + VARIABLE str_type : CHARACTER; + VARIABLE index : INTEGER; + + BEGIN + -- + -- convert Bit_Vector to string without taking care of format + + FOR i IN reslen DOWNTO 1 LOOP + IF ( bv(i) = '1') THEN + loc_result(i) := '1'; + ELSE -- bv(i) = '0' + loc_result(i) := '0'; + END IF; + END LOOP; + + -- call procedure SOX_Machine to split the format string into + -- field width, precision, and justification(left or right), and + -- string_type ( binary, octal or hex) + + SOX_Machine(fw, precis, justfy, str_type, fmt); + -- set the field width and precison propoerly + IF ((precis = 0) OR (precis > reslen)) THEN + precis := reslen; + END IF; + + last_bits := precis MOD oct_bits; + IF (last_bits = 0) THEN + oct_len := precis / oct_bits; + ELSE + oct_len := precis /oct_bits + 1; + END IF; + + index := precis; + FOR i IN oct_len DOWNTO 1 LOOP + IF ( i = 1) AND (last_bits /= 0) THEN + oct_str(1 TO oct_bits - last_bits) := (OTHERS => '0'); + oct_str(oct_bits - last_bits + 1 TO oct_bits) := loc_result(1 TO last_bits); + ELSE + oct_str := loc_result(index - 2 TO index); + END IF; + CASE oct_str IS + WHEN "000" => oct_result(i) := '0'; + WHEN "001" => oct_result(i) := '1'; + WHEN "010" => oct_result(i) := '2'; + WHEN "011" => oct_result(i) := '3'; + WHEN "100" => oct_result(i) := '4'; + WHEN "101" => oct_result(i) := '5'; + WHEN "110" => oct_result(i) := '6'; + WHEN "111" => oct_result(i) := '7'; + WHEN OTHERS => null; + END CASE; + index := index - oct_bits; + END LOOP; + + IF (fw < oct_len) THEN + fw := oct_len; + END IF; + + IF (oct_len >= fw) THEN + return(oct_result(1 TO oct_len)); + ELSE + result(oct_len+1 TO fw) := (OTHERS => ' '); + END IF; + + -- Now according to justification return the result; + IF (justfy = '1') THEN -- left justify + return (oct_result(1 TO oct_len) & result(oct_len+1 TO fw)); + ELSE -- right justify + return( result(oct_len + 1 TO fw) & oct_result(1 TO oct_len)); + END IF; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_HexString +--| hidden +--| Overloading : None +--| +--| Purpose : Convert a bit_vector to a octal String. +--| +--| Parameters : +--| val - input, BIT_VECTOR, +--| +--| Result : STRING representation of a bit_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : BIT_VECTOR (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%4x"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_HexString ( CONSTANT val : IN BIT_VECTOR; + CONSTANT format : IN STRING := "%x" + ) RETURN STRING IS + CONSTANT reslen : INTEGER := val'LENGTH; + CONSTANT hex_bits : INTEGER := 4; + VARIABLE last_bits : INTEGER; + VARIABLE hex_len : NATURAL; + VARIABLE loc_result : STRING(1 TO reslen); + VARIABLE hex_result : STRING(1 TO reslen) := (OTHERS => ' '); +-- VARIABLE hex_str : STRING(1 TO hex_bits); -- Intermetrics can't handle this on the case statement below! + VARIABLE hex_str : STRING(1 TO 4 ); + VARIABLE bv : BIT_VECTOR(1 TO reslen) := val; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + VARIABLE str_type : CHARACTER; + VARIABLE index : INTEGER; + + BEGIN + -- + -- convert Bit_Vector to string without taking care of format + + FOR i IN reslen DOWNTO 1 LOOP + IF ( bv(i) = '1') THEN + loc_result(i) := '1'; + ELSE -- bv(i) = '0' + loc_result(i) := '0'; + END IF; + END LOOP; + + -- call procedure SOX_Machine to split the format string into + -- field width, precision, and justification(left or right), and + -- string_type ( binary, octal or hex) + + SOX_Machine(fw, precis, justfy, str_type, fmt); + -- set the field width and precison propoerly + IF ((precis = 0) OR (precis > reslen)) THEN + precis := reslen; + END IF; + + last_bits := precis MOD hex_bits; + IF (last_bits = 0) THEN + hex_len := precis / hex_bits; + ELSE + hex_len := precis /hex_bits + 1; + END IF; + + index := precis; + FOR i IN hex_len DOWNTO 1 LOOP + IF ( i = 1) AND (last_bits /= 0) THEN + hex_str(1 TO hex_bits - last_bits) := (OTHERS => '0'); + hex_str(hex_bits - last_bits + 1 TO hex_bits) := loc_result(1 TO last_bits); + ELSE + hex_str := loc_result(index - 3 TO index); + END IF; + CASE hex_str IS + WHEN "0000" => hex_result(i) := '0'; + WHEN "0001" => hex_result(i) := '1'; + WHEN "0010" => hex_result(i) := '2'; + WHEN "0011" => hex_result(i) := '3'; + WHEN "0100" => hex_result(i) := '4'; + WHEN "0101" => hex_result(i) := '5'; + WHEN "0110" => hex_result(i) := '6'; + WHEN "0111" => hex_result(i) := '7'; + WHEN "1000" => hex_result(i) := '8'; + WHEN "1001" => hex_result(i) := '9'; + WHEN "1010" => hex_result(i) := 'A'; + WHEN "1011" => hex_result(i) := 'B'; + WHEN "1100" => hex_result(i) := 'C'; + WHEN "1101" => hex_result(i) := 'D'; + WHEN "1110" => hex_result(i) := 'E'; + WHEN "1111" => hex_result(i) := 'F'; + WHEN OTHERS => null; + END CASE; + index := index - hex_bits; + END LOOP; + + IF (fw < hex_len) THEN + fw := hex_len; + END IF; + + IF (hex_len >= fw) THEN + return(hex_result(1 TO hex_len)); + ELSE + result(hex_len+1 TO fw) := (OTHERS => ' '); + END IF; + + -- Now according to justification return the result; + IF (justfy = '1') THEN -- left justify + return (hex_result(1 TO hex_len) & result(hex_len+1 TO fw)); + ELSE -- right justify + return( result(hex_len + 1 TO fw) & hex_result(1 TO hex_len)); + END IF; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.8 +--| Overloading : None +--| +--| Purpose : Convert a bit_vector to a String. +--| +--| Parameters : +--| val - input, BIT_VECTOR, +--| +--| Result : STRING representation of a bit_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : BIT_VECTOR (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BIT_VECTOR; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + CONSTANT reslen : INTEGER := val'LENGTH; + VARIABLE loc_result : STRING(1 TO reslen); + VARIABLE bv : BIT_VECTOR(1 TO reslen) := val; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + VARIABLE str_type : CHARACTER; + VARIABLE index : INTEGER; + + BEGIN + -- call procedure SOX_Machine to split the format string into + -- field width, precision, and justification(left or right), and + -- string_type ( binary, octal or hex) + SOX_Machine(fw, precis, justfy, str_type, fmt); + CASE str_type IS + WHEN 's' => + -- convert Bit_Vector to string without taking care of format + FOR i IN reslen DOWNTO 1 LOOP + IF ( bv(i) = '1') THEN + loc_result(i) := '1'; + ELSE -- bv(i) = '0' + loc_result(i) := '0'; + END IF; + END LOOP; + -- set the field width and precison propoerly + IF ((precis = 0) OR (precis > reslen)) THEN + precis := reslen; + END IF; + + IF (fw < val'LENGTH) THEN + fw := val'LENGTH; + END IF; + + IF (precis >= fw) THEN + return(loc_result(1 TO precis)); + ELSE + result(precis+1 TO fw) := (OTHERS => ' '); + END IF; + + -- Now according to justification return the result; + IF (justfy = '1') THEN -- left justify + return (loc_result(1 TO precis) & result(precis+1 TO fw)); + ELSE -- right justify + return( result(precis+1 TO fw) & loc_result(1 TO precis)); + END IF; + + WHEN 'o' | 'O' => return(To_OctString(val, format)); + + WHEN 'x' | 'X' => return(TO_HexString(val, format)); + + WHEN OTHERS => --ASSERT false + --report " To_String (bit_vector case)-- format error " + --SEVERITY ERROR; + return result; + END CASE; + END To_String; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.10.2 +--| Overloading : None +--| +--| Purpose : Convert an std_ulogic to a String. +--| +--| Parameters : +--| val - input std_ulogic. +--| +--| Result : STRING representation of std_ulogic. +--| +--| Use : +--| VARIABLE str_ovf : STRING(1 TO 4); +--| VARIABLE overflow : std_ulogic; +--| +--| str_ovf := TO_String(vect, "%4s"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_ulogic; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justify : BIT; + + BEGIN + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis, justify, fmt); + + IF (fw < 1) THEN + fw := 1; + END IF; + -- fill result from 1 to fw with blanks + result(1 TO fw) := (OTHERS => ' '); + CASE val IS + WHEN 'U' => IF (justify = '1') THEN -- left justify + result(1) := 'U'; + ELSE -- right justify + result(fw) := 'U'; + END IF; + + WHEN 'X' => IF (justify = '1') THEN -- left justify + result(1) := 'X'; + ELSE -- right justify + result(fw) := 'X'; + END IF; + + WHEN '0' => IF (justify = '1') THEN -- left justify + result(1) := '0'; + ELSE -- right justify + result(fw) := '0'; + END IF; + + WHEN '1' => IF (justify = '1') THEN -- left justify + result(1) := '1'; + ELSE -- right justify + result(fw) := '1'; + END IF; + + WHEN 'Z' => IF (justify = '1') THEN -- left justify + result(1) := 'Z'; + ELSE -- right justify + result(fw) := 'Z'; + END IF; + + WHEN 'W' => IF (justify = '1') THEN -- left justify + result(1) := 'W'; + ELSE -- right justify + result(fw) := 'W'; + END IF; + + WHEN 'L' => IF (justify = '1') THEN -- left justify + result(1) := 'L'; + ELSE -- right justify + result(fw) := 'L'; + END IF; + + WHEN 'H' => IF (justify = '1') THEN -- left justify + result(1) := 'H'; + ELSE -- right justify + result(fw) := 'H'; + END IF; + + WHEN '-' => IF (justify = '1') THEN -- left justify + result(1) := '-'; + ELSE -- right justify + result(fw) := '-'; + END IF; + + WHEN OTHERS => -- An unknown std_ulogic value was passed + ASSERT FALSE + REPORT "To_String - Unknown std_ulogic value" + SEVERITY ERROR; + END CASE; + RETURN result(1 TO fw); + END To_String; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| +--| Overloading : None +--| +--| Purpose : Convert an std_logic_vector to a String. +--| +--| Parameters : +--| val - input std_logic_vector. +--| +--| Result : STRING representation of std_logic_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : std_logic_vector (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_logic_vector; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + CONSTANT reglen : INTEGER := val'LENGTH; + VARIABLE loc_result : STRING(1 TO reglen); + VARIABLE slv : std_logic_vector(1 TO reglen) := val; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- Convert to string without taking care of the format. + FOR i IN reglen DOWNTO 1 LOOP + CASE slv(i) IS + WHEN 'U' => loc_result(i) := 'U'; + WHEN 'X' => loc_result(i) := 'X'; + WHEN '0' => loc_result(i) := '0'; + WHEN '1' => loc_result(i) := '1'; + WHEN 'Z' => loc_result(i) := 'Z'; + WHEN 'W' => loc_result(i) := 'W'; + WHEN 'L' => loc_result(i) := 'L'; + WHEN 'H' => loc_result(i) := 'H'; + WHEN '-' => loc_result(i) := '-'; + WHEN OTHERS => -- An unknown std_logic value was passed + ASSERT FALSE + REPORT "To_String -- Unknown std_logic_vector value" + SEVERITY ERROR; + END CASE; + END LOOP; + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis, justfy, fmt); + -- set the field width and precison propoerly + IF ((precis = 0) OR (precis > reglen)) THEN + precis := reglen; + END IF; + IF (fw < val'LENGTH) THEN + fw := val'LENGTH; + END IF; + IF (precis >= fw) THEN + return(loc_result(1 TO precis)); + ELSE + result(precis+1 TO fw) := (OTHERS => ' '); + END IF; + -- Now according to justification return the result; + IF (justfy = '1') THEN -- left justify + return (loc_result(1 TO precis) & result(precis+1 TO fw)); + ELSE -- right justify + return( result(precis+1 TO fw) & loc_result(1 TO precis)); + END IF; + END To_String; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| +--| Overloading : None +--| +--| Purpose : Convert an std_ulogic_vector to a String. +--| +--| Parameters : +--| val - input std_ulogic_vector. +--| +--| Result : STRING representation of std_ulogic_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : std_ulogic_vector (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_ulogic_vector; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING IS + CONSTANT reglen : INTEGER := val'LENGTH; + VARIABLE loc_result : STRING(1 TO reglen); + VARIABLE slv : std_ulogic_vector(1 TO reglen) := val; + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE result : STRING(1 TO max_string_len); + VARIABLE fw : INTEGER; + VARIABLE precis : INTEGER; + VARIABLE justfy : BIT; + + BEGIN + -- Convert to string without taking care of the format. + FOR i IN reglen DOWNTO 1 LOOP + CASE slv(i) IS + WHEN 'U' => loc_result(i) := 'U'; + WHEN 'X' => loc_result(i) := 'X'; + WHEN '0' => loc_result(i) := '0'; + WHEN '1' => loc_result(i) := '1'; + WHEN 'Z' => loc_result(i) := 'Z'; + WHEN 'W' => loc_result(i) := 'W'; + WHEN 'L' => loc_result(i) := 'L'; + WHEN 'H' => loc_result(i) := 'H'; + WHEN '-' => loc_result(i) := '-'; + WHEN OTHERS => -- An unknown std_logic value was passed + ASSERT FALSE + REPORT "To_String -- Unknown std_logic_vector value" + SEVERITY ERROR; + END CASE; + END LOOP; + -- call procedure S_Machine to split the format string into + -- field width, precision, and justification(left or right). + -- + S_Machine(fw, precis, justfy, fmt); + -- set the field width and precison propoerly + IF ((precis = 0) OR (precis > reglen)) THEN + precis := reglen; + END IF; + IF (fw < val'LENGTH) THEN + fw := val'LENGTH; + END IF; + IF (precis >= fw) THEN + return(loc_result(1 TO precis)); + ELSE + result(precis+1 TO fw) := (OTHERS => ' '); + END IF; + -- Now according to justification return the result; + IF (justfy = '1') THEN -- left justify + return (loc_result(1 TO precis) & result(precis+1 TO fw)); + ELSE -- right justify + return( result(precis+1 TO fw) & loc_result(1 TO precis)); + END IF; + END To_String; +-- +-- character Handling Functions +-- +--+----------------------------------------------------------------------------- +--| Function Name : Is_Alpha +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a letter of the alphabet. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a letter of the +--| alphabet, false otherwise. +--| +--| +--| Use : VARIABLE ch : character; +--| +--| While (Is_Alpha(ch)) LOOP +--| -- do somthing +--| END LOOP; +--| +--| See Also : Is_Digit, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Alpha ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + + VARIABLE result : BOOLEAN := false; + BEGIN + IF ( (c >= 'a' AND c <= 'z') OR ( c >= 'A' AND c <= 'Z')) THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + END Is_Alpha; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Upper +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is an upper case letter. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is an upper case letter of +--| the alphabet, false otherwise. +--| +--| Use : VARIABLE ch : character; +--| +--| IF (IS_Upper(ch)) THEN +--| +--| -- do somthing +--| ELSE +--| -- do alternate action +--| END IF; +--| +--| See Also : Is_Digit, Is_Alpha, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Upper ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + VARIABLE result : BOOLEAN := false; + BEGIN + IF ( c >= 'A' AND c <= 'Z') THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + END Is_Upper; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a lower case letter. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a lower case letter of +--| the alphabet, false otherwise. +--| +--| +--| See Also : Is_Digit, Is_Upper, Is_Alpha +--|----------------------------------------------------------------------------- + FUNCTION Is_Lower ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + VARIABLE result : BOOLEAN := false; + BEGIN + IF ( c >= 'a' AND c <= 'z' ) THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + END Is_Lower; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Digit +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a digit 0-9. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a digit, false +--| otherwise. +--| +--| +--| See Also : Is_Alpha, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Digit ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + VARIABLE result : BOOLEAN; + BEGIN + IF (c >= '0' and c <= '9') THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + END Is_Digit; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Space +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a blank, tab or newline. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a blank or tab(HT), +--| false otherwise. +--| +--| +--| See Also : Is_Digit, Is_Upper, Is_Lower, Is_Alpha +--|----------------------------------------------------------------------------- + FUNCTION Is_Space ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN IS + VARIABLE result : BOOLEAN; + BEGIN + IF (c = ' ' OR c = HT ) THEN + result := TRUE; + ELSE + result := FALSE; + END IF; + RETURN result; + END Is_Space; +--+----------------------------------------------------------------------------- +--| Function Name : To_Upper +--| 1. +--| Overloading : None +--| +--| Purpose :Convert a character to upper case. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : Character converted to upper case. +--| +--| +--| See Also : To_Lower, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Upper ( CONSTANT c : IN CHARACTER + ) RETURN CHARACTER IS + VARIABLE result : CHARACTER := c; + BEGIN + IF ( c >= 'a' and c <= 'z') THEN + result := CHARACTER'VAL( CHARACTER'POS(c) + - CHARACTER'POS('a') + + CHARACTER'POS('A') ); + END IF; + RETURN result; + END To_Upper; +--+----------------------------------------------------------------------------- +--| Function Name : To_Upper +--| 1. +--| Overloading : None +--| +--| Purpose :Convert a string to upper case. +--| +--| Parameters : +--| val - input, string to be converted +--| +--| Result : string . +--| +--| +--| See Also : To_Lower, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Upper ( CONSTANT val : IN String + ) RETURN STRING IS + VARIABLE result : string (1 TO val'LENGTH) := val; + VARIABLE ch : character; + BEGIN + FOR i IN 1 TO val'LENGTH LOOP + ch := result(i); + EXIT WHEN ((ch = NUL) OR (ch = nul)); + IF ( ch >= 'a' and ch <= 'z') THEN + result(i) := CHARACTER'VAL( CHARACTER'POS(ch) + - CHARACTER'POS('a') + + CHARACTER'POS('A') ); + END IF; + END LOOP; + RETURN result; + END To_Upper; +--+----------------------------------------------------------------------------- +--| Function Name : To_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Convert a Character to lower case. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : Character converted to lower case. +--| +--| See Also : To_Upper, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Lower ( CONSTANT c : IN CHARACTER + ) RETURN CHARACTER IS + VARIABLE result : CHARACTER := c; + BEGIN + IF ( c >= 'A' and c <= 'Z') THEN + result := CHARACTER'VAL( CHARACTER'POS(c) + - CHARACTER'POS('A') + + CHARACTER'POS('a') ); + END IF; + RETURN result; + END To_Lower; +--+----------------------------------------------------------------------------- +--| Function Name : To_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Convert a String to lower case. +--| +--| Parameters : +--| val - input string to be converted. +--| +--| Result : string +--| +--| See Also : To_Upper, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Lower ( CONSTANT val : IN STRING + ) RETURN STRING IS + VARIABLE result : string (1 TO val'LENGTH) := val; + VARIABLE ch : character; + BEGIN + FOR i IN 1 TO val'LENGTH LOOP + ch := result(i); + EXIT WHEN ((ch = NUL) OR (ch = nul)); + IF ( ch >= 'A' and ch <= 'Z') THEN + result(i) := CHARACTER'VAL( CHARACTER'POS(ch) + - CHARACTER'POS('A') + + CHARACTER'POS('a') ); + END IF; + END LOOP; + RETURN result; + END To_Lower; +--+----------------------------------------------------------------------------- +--| Function Name : StrCat +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Concatenate two string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Concatenated string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrCat ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN STRING IS + CONSTANT len_l : INTEGER := StrLen(l_str); + CONSTANT len_r : INTEGER := StrLen(r_str); + CONSTANT len_result : INTEGER := len_l + len_r; + VARIABLE l : STRING ( 1 to l_str'length) := l_str; + VARIABLE r : STRING ( 1 to r_str'length) := r_str; + VARIABLE result : STRING (1 to len_result); + BEGIN + If (len_result /= 0) THEN + result (1 to len_l) := l ( 1 to len_l); + result (len_l+1 to len_result) := r ( 1 to len_r ); + RETURN result; + else + return ""; + end if; + + END StrCat; +--+----------------------------------------------------------------------------- +--| Function Name : StrNCat +--| 1.2.2 +--| Overloading : None +--| +--| Purpose : Concatenate upto n characters of r_string to l_string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Concatenated string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNCat ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : INTEGER + ) RETURN STRING IS + CONSTANT len_l : INTEGER := StrLen(l_str); + CONSTANT len_result : INTEGER := len_l + n; + VARIABLE l : STRING ( 1 to l_str'length) := l_str; + VARIABLE r : STRING ( 1 to r_str'length) := r_str; + VARIABLE result : STRING (1 TO len_result); + + BEGIN + IF (len_result = 0) THEN + return ""; + END IF; + IF ((n <= 0) OR (r_str'LENGTH = 0)) THEN + result(1 TO len_l) := l(1 To len_l); + ELSE + result(1 TO len_l) := l(1 TO len_l); + FOR i IN 1 TO n LOOP + result(len_l + i) := r(i); + EXIT when ((r(i) = NUL) OR + (i >= r_str'LENGTH)); + END LOOP; + END IF; + RETURN result; + END StrNCat; +--+----------------------------------------------------------------------------- +--| Function Name : StrCpy +--| 1.2.3 +--| Overloading : None +--| +--| Purpose : Copy r_string to l_string. +--| +--| Parameters : +--| l_str - output, STRING, target string +--| r_str - input, STRING, source string +--| +--| Result : +--| +--| NOTE : If the length of target string is greater than +--| the source string, then target string is padded +--| with space characters on the right side and when +--| the length of target string is shorter than the +--| length of source string only left most characters +--| of the source string will be be copied to the target. +--| +--| +--| USE : +--| Variable s1: string(1 TO 8); +--| +--| StrCpy(s1, "123456789A"); +--| s1 will hold "12345678" +--|----------------------------------------------------------------------------- + PROCEDURE StrCpy ( VARIABLE l_str : OUT STRING; + CONSTANT r_str : IN STRING) IS + VARIABLE l_len : integer := l_str'LENGTH; + VARIABLE r_len : integer := r_str'LENGTH; + VARIABLE r : STRING ( 1 to r_len) := r_str; + VARIABLE result : STRING (1 to l_len); + VARIABLE indx : integer := 1; + BEGIN + +-- removed because it is not needed and because other routines call strcpy +-- and they should not generate a strcpy error +-- assert (l_len > 0) +-- report "StrCpy: target string is of zero length " +-- severity ERROR; + + while ( (indx <= r_len) and (indx <= l_len) and (r(indx) /= NUL) ) loop + result(indx) := r(indx); + indx := indx + 1; + end loop; + if (indx <= l_len) then + result(indx) := NUL; + end if; + l_str := result; + return; + END StrCpy; +--+----------------------------------------------------------------------------- +--| Function Name : StrNCpy +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy at most n characters of r_string to l_string. +--| +--| Parameters : +--| l_str - output, STRING, target +--| r_str - input, STRING, source +--| n - input, Natural, number of characters to +--| to be copied. +--| +--| Result : l_string holds the result. +--| +--| NOTE : If n is less than or equal to zero then a srting +--| filled with blanks is returned. +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE StrNCpy ( VARIABLE l_str : OUT STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : IN NATURAL + ) IS + VARIABLE l_len : integer := l_str'LENGTH; + VARIABLE r_len : integer := r_str'LENGTH; + VARIABLE r : STRING ( 1 to r_len) := r_str; + VARIABLE result : STRING (1 to l_len); + VARIABLE indx : integer := 1; + BEGIN + +-- removed - for reason see strcpy +-- assert (l_len > 0) +-- report "StrNCpy: target string is of zero length " +-- severity ERROR; + + while ( (indx <= r_len) and (indx <= l_len) and (r(indx) /= NUL) and (indx <= n) ) loop + result(indx) := r(indx); + indx := indx + 1; + end loop; + if (indx <= l_len) then + result(indx) := NUL; + end if; + l_str := result; + return; + END StrNCpy; +--+----------------------------------------------------------------------------- +--| Function Name : StrCmp +--| +--| Overloading : None +--| +--| Purpose : Compare left input string to right input string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : INTEGER, returns an integer less than 0 if the left string +--| is less than the right string, returns integer 0 if the +--| the string are equal and returns an integer greater than +--| 0 if the left string is greater than the right string. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION StrCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN INTEGER IS + VARIABLE ls : STRING(1 TO l_str'LENGTH) := l_str; + VARIABLE rs : STRING(1 TO r_str'LENGTH) := r_str; + VARIABLE lv, rv : INTEGER; + VARIABLE i : INTEGER := 1; + BEGIN + WHILE ( (i <= ls'LENGTH) and (i <= rs'LENGTH) and (ls(i) /= NUL) and (rs(i) /= NUL) ) LOOP + if ( ls(i) /= rs(i) ) then + return (CHARACTER'POS(ls(i)) - CHARACTER'POS(rs(i))); + end if; + i := i + 1; + END LOOP; + + if ( i > ls'LENGTH) then + lv := 0; + else + lv := CHARACTER'POS(ls(i)); + end if; + + if ( i > rs'LENGTH) then + rv := 0; + else + rv := CHARACTER'POS(rs(i)); + end if; + + return (lv - rv); + END StrCmp; +--+----------------------------------------------------------------------------- +--| Function Name : StrNCmp +--| +--| Overloading : None +--| +--| Purpose : Compare at most n characters of left input string +--| to right input string. Returns an Integer. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| n - input, Natural, +--| +--| Result : Returns an integer less than 0 if left_most n +--| characters of the left string is less than the +--| right string, returns integer 0 if both strings +--| are equal, and returns an integer greater than 0 +--| if the left string is greater than the right string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : IN Natural + ) RETURN INTEGER IS + VARIABLE ls : STRING(1 TO l_str'LENGTH) := l_str; + VARIABLE rs : STRING(1 TO r_str'LENGTH) := r_str; + VARIABLE i : INTEGER := 1; + VARIABLE lv, rv : INTEGER; + BEGIN + IF ( n <= 0) THEN + RETURN (0); + ELSE + WHILE ( (i <= ls'LENGTH) and (i <= rs'LENGTH) and (ls(i) /= NUL) and (rs(i) /= NUL) and (i <= n) ) LOOP + if ( ls(i) /= rs(i) ) then + return (CHARACTER'POS(ls(i)) - CHARACTER'POS(rs(i))); + end if; + i := i + 1; + END LOOP; + + if ( i > n ) then + return 0; + end if; + + if ( i > ls'LENGTH) then + lv := 0; + else + lv := CHARACTER'POS(ls(i)); + end if; + + if ( i > rs'LENGTH) then + rv := 0; + else + rv := CHARACTER'POS(rs(i)); + end if; + + return (lv - rv); + END IF; + END StrNCmp; +--+----------------------------------------------------------------------------- +--| Function Name : StrNcCmp +--| +--| Overloading : None +--| +--| Purpose : Compare to strings and determine whether left input +--| string is less than, equal to or greater than right +--| input string. The comparison is Not case sensitive. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Returns an integer less than 0 if left_most n +--| characters of the left string is less than the +--| right string, returns integer 0 if both strings +--| are equal, and returns an integer greater than 0 +--| if the left string is greater than the right string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNcCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN INTEGER IS + + VARIABLE ls : STRING(1 TO l_str'LENGTH); + VARIABLE rs : STRING(1 TO r_str'LENGTH); + VARIABLE lv, rv : INTEGER; + VARIABLE i : INTEGER := 1; + + BEGIN + -- convert both strings to upper case + ls := To_Upper(l_str); + rs := To_Upper(r_str); + + WHILE ( (i <= ls'LENGTH) and (i <= rs'LENGTH) and (ls(i) /= NUL) and (rs(i) /= NUL) ) LOOP + if ( ls(i) /= rs(i) ) then + return (CHARACTER'POS(ls(i)) - CHARACTER'POS(rs(i))); + end if; + i := i + 1; + END LOOP; + + if ( i > ls'LENGTH) then + lv := 0; + else + lv := CHARACTER'POS(ls(i)); + end if; + + if ( i > rs'LENGTH) then + rv := 0; + else + rv := CHARACTER'POS(rs(i)); + end if; + + return (lv - rv); + END StrNcCmp; +--+----------------------------------------------------------------------------- +--| Function Name : StrLen +--| +--| Overloading : None +--| +--| Purpose : Returns length of a string. +--| +--| Parameters : +--| l_str - input, STRING, +--| +--| Result : Natural +--| +--| NOTE : +--| This is in fact same as String'LENGTH provided +--| by VHDL. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION StrLen ( CONSTANT l_str : IN STRING + ) RETURN NATURAL IS + VARIABLE len : natural := 0; + BEGIN + length_check : for i in l_str'range loop + EXIT length_check WHEN l_str(i) = NUL; + len := len + 1; + end loop; + return len; + END StrLen; +-- +-- FILE I/O +-- + +--+----------------------------------------------------------------------------- +--| Function Name :Copyfile +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy one ASCII_TEXT file to an other ASCII_TEXT file. +--| +--| Parameters : +--| in_fptr -- input, ASCII_TEXT, source file +--| out_fptr -- output, ASCII_TEXT, destination file +--| +--| NOTE : +--| +--| USE : +--| file romdata : ASCII_TEXT IS IN "NEW_ROM.dat"; +--| file dest_file : ASCII_TEXT IS OUT "SAVE_ROM.dat"; +--| +--| Copyfile(romdata, dest_file); +--|----------------------------------------------------------------------------- + PROCEDURE Copyfile ( VARIABLE in_fptr : IN ASCII_TEXT; + VARIABLE out_fptr : OUT ASCII_TEXT + ) IS + VARIABLE ch : character; + BEGIN + WHILE NOT ENDFILE(in_fptr) LOOP + READ(in_fptr, ch); + WRITE(out_fptr, ch); + END LOOP; + RETURN; + END Copyfile; + +--+----------------------------------------------------------------------------- +--| Function Name :Copyfile +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy one TEXT file to an other TEXT file. +--| +--| Parameters : +--| in_fptr -- input, TEXT, +--| out_fptr -- output, TEXT +--| +--| NOTE : +--| This is combination of READLINE() and WRITELINE() +--| procedures provided in the standard +--| TEXTIO package. +--| +--| USE : +--| file in_f : TEXT IS IN "data_in"; +--| file out_f : TEXT IS OUT "save_data"; +--| +--| Copyfile(in_f, out_f); +--|----------------------------------------------------------------------------- + PROCEDURE Copyfile ( VARIABLE in_fptr : IN TEXT; + VARIABLE out_fptr : OUT TEXT + ) IS + VARIABLE ll : LINE; -- LINE is declared in TEXTIO + + BEGIN + WHILE NOT ENDFILE(in_fptr) LOOP + READLINE(in_fptr, ll); -- call procedure from TEXTIO + WRITELINE(out_fptr, ll); + END LOOP; + DEALLOCATE(ll); + RETURN; + END Copyfile; + +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Convert up to 10 arguments to a file according to +--| the format specifications give by a format string. +--| +--| Parameters : +--| file_ptr - output ASCII_TEXT, destination file +--| format - input STRING, format control specifications. +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : formated TEXT. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE file_ptr : OUT ASCII_TEXT; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := "" ; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := "" ; + CONSTANT arg10 : IN STRING := "" + ) IS + VARIABLE arg : STRING(1 TO max_string_len); + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE index : INTEGER := 0; + VARIABLE ch : CHARACTER; + VARIABLE lookahead : CHARACTER; + VARIABLE tokn : STRING(1 TO max_token_len); + VARIABLE ArgNum : INTEGER RANGE 1 TO 11; + BEGIN + -- + IF (format'LENGTH = 0) THEN + assert false + report " fprint --- format string is null " + severity ERROR; + return; + END IF; + + ArgNum := 1; + WHILE (true) LOOP + index := index + 1; + ch := fmt(index); + + IF (index < format'LENGTH) THEN + lookahead := fmt(index+1); + ELSE + lookahead := ' '; + END IF; + + IF (( ch = '%') AND (lookahead = '%')) THEN + index := index + 1; -- print % character + WRITE(file_ptr, ch); + + ELSIF ((ch = '\') AND (lookahead ='n')) THEN -- new line + index := index + 1; + ch := LF; + WRITE(file_ptr, ch); + + ELSIF (ch = '%') AND (lookahead /= '%') THEN + -- format %s expected + EXIT WHEN (ArgNum > 10); -- only first 10 argments will be printed + tokn := (OTHERS => ' '); -- fill token with blank space + get_token(fmt, index, tokn); + + -- select argument number 1 to 10 + Case ArgNum IS + WHEN 1 => + IF (arg1 /= "") THEN + print_str(file_ptr, tokn, arg1); + ELSE + EXIT; + END IF; + + WHEN 2 => + IF (arg2 /= "") THEN + print_str(file_ptr, tokn, arg2); + ELSE + EXIT; + END IF; + WHEN 3 => + IF (arg3 /= "") THEN + print_str(file_ptr, tokn, arg3); + ELSE + EXIT; + END IF; + WHEN 4 => + IF (arg4 /= "") THEN + print_str(file_ptr, tokn, arg4); + ELSE + EXIT; + END IF; + WHEN 5 => + IF (arg5 /= "") THEN + print_str(file_ptr, tokn, arg5); + ELSE + EXIT; + END IF; + WHEN 6 => + IF (arg6 /= "") THEN + print_str(file_ptr, tokn, arg6); + ELSE + EXIT; + END IF; + WHEN 7 => + IF (arg7 /= "") THEN + print_str(file_ptr, tokn, arg7); + ELSE + EXIT; + END IF; + WHEN 8 => + IF (arg8 /= "") THEN + print_str(file_ptr, tokn, arg8); + ELSE + EXIT; + END IF; + WHEN 9 => + IF (arg9 /= "") THEN + print_str(file_ptr, tokn, arg9); + ELSE + EXIT; + END IF; + WHEN 10 => + IF (arg10 /= "") THEN + print_str(file_ptr, tokn, arg10); + ELSE + EXIT; + END IF; + WHEN 11 => -- should not happen + Assert false + Report "fprint -- ASCII_TEXT, arguments > 10 " + SEVERITY ERROR; + END CASE; + ArgNum := ArgNum + 1; + + ELSIF (ch /= '%') THEN -- printable characters + WRITE(file_ptr, ch); + END IF; + EXIT WHEN (index = format'LENGTH); + END LOOP; -- end of while true loop + + -- That's it + END fprint; + +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Print up to 10 arguments to a file according to +--| the specifications given by a format string. +--| +--| Parameters : +--| file_ptr - output TEXT, destination file +--| line_ptr - INOUT LINE, pointer to a string. +--| format - input STRING, format control specifications. +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : formated TEXT. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE file_ptr : OUT TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := "" ; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := "" ; + CONSTANT arg10 : IN STRING := "" + ) IS + VARIABLE arg : STRING(1 TO max_string_len); + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE index : INTEGER := 0; + VARIABLE ch : CHARACTER; + VARIABLE lookahead : CHARACTER; + VARIABLE tokn : STRING(1 TO max_token_len); + VARIABLE ArgNum : INTEGER RANGE 1 TO 11; + + BEGIN + -- check for null format string + IF (format'LENGTH = 0) THEN + assert false + report " fprint --- format string is null " + severity ERROR; + return; + END IF; + -- initialize index to 0 and ArgNum to 1 + index := 0; + ArgNum := 1; + WHILE (true) LOOP + index := index + 1; + ch := fmt(index); + + IF (index < format'LENGTH) THEN + lookahead := fmt(index+1); + ELSE + lookahead := ' '; + END IF; + + IF (( ch = '%') AND (lookahead = '%')) THEN + index := index + 1; -- print % character + WRITE(line_ptr, ch); + + ELSIF ((ch = '\') AND (lookahead ='n')) THEN -- new line + index := index + 1; + WRITELINE(file_ptr, line_ptr); + DEALLOCATE(line_ptr); + ELSIF (ch = '%') AND (lookahead /= '%') THEN + -- format %s expected + EXIT WHEN (ArgNum > 10); -- only first 10 argments will be printed + tokn := (OTHERS => ' '); -- fill token with blank space + get_token(fmt, index, tokn); + + -- select argument number 1 to 10 + Case ArgNum IS + WHEN 1 => IF (arg1 /= "") THEN + print_str(line_ptr, tokn, arg1); + ELSE + EXIT; + END IF; + + WHEN 2 => IF (arg2 /= "") THEN + print_str(line_ptr, tokn, arg2); + ELSE + EXIT; + END IF; + WHEN 3 => IF (arg3 /= "") THEN + print_str(line_ptr, tokn, arg3); + ELSE + EXIT; + END IF; + + WHEN 4 => IF (arg4 /= "") THEN + print_str(line_ptr, tokn, arg4); + ELSE + EXIT; + END IF; + + WHEN 5 => IF (arg5 /= "") THEN + print_str(line_ptr, tokn, arg5); + ELSE + EXIT; + END IF; + + WHEN 6 => IF (arg6 /= "") THEN + print_str(line_ptr, tokn, arg6); + ELSE + EXIT; + END IF; + + WHEN 7 => IF (arg7 /= "") THEN + print_str(line_ptr, tokn, arg7); + ELSE + EXIT; + END IF; + + WHEN 8 => IF (arg8 /= "") THEN + print_str(line_ptr, tokn, arg8); + ELSE + EXIT; + END IF; + + WHEN 9 => IF (arg9 /= "") THEN + print_str(line_ptr, tokn, arg9); + ELSE + EXIT; + END IF; + + WHEN 10 => IF (arg10 /= "") THEN + print_str(line_ptr, tokn, arg10); + ELSE + EXIT; + END IF; + + WHEN 11 => -- should not happen + Assert false + Report "fprint -- TEXT, arguments > 10 " + SEVERITY ERROR; + END CASE; + -- increment the argument number + ArgNum := ArgNum + 1; + + ELSIF (ch /= '%') THEN -- printable characters + WRITE(line_ptr, ch); + END IF; + EXIT WHEN (index = format'LENGTH); + END LOOP; -- end of while true loop + -- That's it + END fprint; +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.2 +--| Overloading : None +--| +--| Purpose : Print up to 10 arguments to a string buffer according to +--| the specifications given by a format string. +--| +--| Parameters : +--| string_buf - output STRING, +--| format - input STRING +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : STRING representation of arguments. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE string_buf : OUT STRING; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := ""; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := "" ; + CONSTANT arg10 : IN STRING := "" + ) IS + VARIABLE rbuf : STRING(1 TO string_buf'LENGTH); + VARIABLE arg : STRING(1 TO max_string_len); + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; + VARIABLE index : INTEGER := 0; + VARIABLE buf_indx : INTEGER := 0; + VARIABLE ch : CHARACTER; + VARIABLE lookahead : CHARACTER; + VARIABLE tokn : STRING(1 TO max_token_len); + VARIABLE ArgNum : INTEGER RANGE 1 TO 11; + + BEGIN + -- check for null format string + IF (format'LENGTH = 0) THEN + assert false + report " fprint --- format string is null " + severity ERROR; + return; + END IF; + + index := 0; + ArgNum := 1; + WHILE (true) LOOP + index := index + 1; + buf_indx := buf_indx + 1; + ch := fmt(index); + + IF (index < format'LENGTH) THEN + lookahead := fmt(index+1); + ELSE + lookahead := ' '; + END IF; + + IF (( ch = '%') AND (lookahead = '%')) THEN + rbuf(buf_indx) := ch; + index := index + 1; -- print % character + + ELSIF ((ch = '\') AND (lookahead ='n')) THEN -- new line + ch := LF; + rbuf(buf_indx) := ch; + index := index + 1; + + ELSIF (ch = '%') AND (lookahead /= '%') THEN + -- format %s expected + EXIT WHEN (ArgNum > 10); -- only first 10 argments will be printed + tokn := (OTHERS => ' '); -- fill token with blank space + get_token(fmt, index, tokn); + + -- select argument number 1 to 10 + + Case ArgNum IS + WHEN 1 => + IF (arg1 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg1); + ELSE + EXIT; + END IF; + + WHEN 2 => + IF (arg2 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg2); + ELSE + EXIT; + END IF; + WHEN 3 => + IF (arg3 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg3); + ELSE + EXIT; + END IF; + WHEN 4 => + IF (arg4 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg4); + ELSE + EXIT; + END IF; + WHEN 5 => + IF (arg5 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg5); + ELSE + EXIT; + END IF; + WHEN 6 => + IF (arg6 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg6); + ELSE + EXIT; + END IF; + WHEN 7 => + IF (arg7 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg7); + ELSE + EXIT; + END IF; + WHEN 8 => + IF (arg8 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg8); + ELSE + EXIT; + END IF; + WHEN 9 => + IF (arg9 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg9); + ELSE + EXIT; + END IF; + WHEN 10 => + IF (arg10 /= "") THEN + print_str_buf(rbuf, buf_indx, tokn, arg10); + ELSE + EXIT; + END IF; + + WHEN 11 => -- should not happen + Assert false + Report "fprint -- String buffer, arguments > 10 " + SEVERITY ERROR; + END CASE; + -- increment the argument number + ArgNum := ArgNum + 1; + + ELSIF (ch /= '%') THEN -- printable characters + rbuf(buf_indx) := ch; + END IF; + EXIT WHEN ((index >= format'LENGTH) OR ( buf_indx >= string_buf'LENGTH)) ; + END LOOP; -- end of while true loop + + IF (buf_indx > string_buf'LENGTH) THEN + string_buf := rbuf; + ELSIF (buf_indx = string_buf'LENGTH) THEN + string_buf := rbuf; +-- If (rbuf(buf_indx) = ' ') THEN +-- string_buf(buf_indx) := NUL; +-- end if; + ELSE + string_buf(1 TO buf_indx) := rbuf(1 To buf_indx); + string_buf(buf_indx + 1) := NUL; + END IF; + + return; + -- That's it + END fprint; + +--+----------------------------------------------------------------------------- +--| Function Name : ffgetc +--| +--| Overloading : Text, ASCII_TEXT +--| +--| Purpose : to read the next character from a file +--| +--| +--| Parameters : result - output character -- returned char +--| eof - output BOOLEAN -- TRUE if end of file reached +--| stream - in ASCII_TEXT -- file +--| +--| Notes : returns with eof true if end of file is reached +--| +--|----------------------------------------------------------------------------- + + PROCEDURE ffgetc ( VARIABLE result : OUT CHARACTER; + VARIABLE eof : OUT BOOLEAN; + VARIABLE stream : IN ASCII_TEXT + ) IS + + VARIABLE end_file : BOOLEAN; + + BEGIN + end_file := ENDFILE(stream); + if (not end_file) then + READ(stream, result); + end if; + eof := end_file; + return; + END; + + +--+----------------------------------------------------------------------------- +--| Procedure Name : scan_for_match +--|.hidden +--| Overloading : TEXT and ASCII_TEXT +--| +--| Purpose : To scan file skipping over blank spaces and newline +--| characters until a non-whitespace character is found. +--| If that character matches match_char then mismatch is +--| return false otherwise its TRUE. +--| +--| handles all three END_OF_LINE_MARKERS (LF, CR, and CR & LF) +--| +--| Parameters : fptr : IN ASCII_TEXT +--| match_char : IN CHARACTER +--| eof : INOUT BOOLEAN +--| mismatch : OUT BOOLEAN +--| +--|----------------------------------------------------------------------------- + + + procedure scan_for_match ( VARIABLE fptr : IN ASCII_TEXT; + CONSTANT match_char : IN CHARACTER; + VARIABLE eof : INOUT BOOLEAN; + VARIABLE mismatch : OUT BOOLEAN ) is + + VARIABLE ch : CHARACTER; + VARIABLE cont : BOOLEAN; + + begin + if ( END_OF_LINE_MARKER = (LF, ' ') ) then + mismatch := FALSE; + ffgetc (ch, eof, fptr); + while ( (is_space(ch) or ( (ch = LF) and (match_char /= LF) ) ) and (not eof) ) loop + ffgetc (ch, eof, fptr); + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + elsif ( END_OF_LINE_MARKER = (CR, ' ') ) then + mismatch := FALSE; + ffgetc (ch, eof, fptr); + while ( (is_space(ch) or ( (ch = CR) and (match_char /= CR) ) ) and (not eof) ) loop + ffgetc (ch, eof, fptr); + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + else -- END_OF_LINE_MARKER = CR & LF + mismatch := FALSE; + cont := TRUE; + ffgetc (ch, eof, fptr); + while ( cont ) loop + while ( (is_space(ch) or ( ( (ch = CR) or (ch = LF) ) and (match_char /= CR) ) ) and (not eof) ) loop + ffgetc (ch, eof, fptr); + end loop; + CONT := FALSE; + if ( (match_char = CR) and (ch = CR) ) then + ffgetc(ch, eof, fptr); + cont := (ch /= LF); + if (not cont) then + return; + end if; + end if; + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + end if; + return; + end; + + +--+----------------------------------------------------------------------------- +--| Procedure Name : get_fw +--|.hidden +--| Overloading : NONE +--| +--| Purpose : get the field width from the format string +--| assumes index is pointing at first digit +--| will end with index pointing a forth character +--| or first non-digit, which ever comes first +--| +--| Parameters : fmt : IN STRING +--| index : INOUT INTEGER +--| +--| +--|----------------------------------------------------------------------------- + + procedure get_fw ( VARIABLE fmt : IN STRING; + VARIABLE index : INOUT INTEGER; + VARIABLE field_width : INOUT INTEGER ) is + + variable count : integer := 3; + variable fw : integer := 0; + + begin + while ( (count > 0) and is_digit(fmt(index)) ) loop + fw := (fw * 10) + (CHARACTER'POS(fmt(index)) - 48); + index := index + 1; + count := count - 1; + end loop; + field_width := fw; + return; + end; + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| 1.2.3 +--| Overloading : TEXT, ASCII_TEXT, string_buffer +--| +--| Purpose : To read text from a file according to specifications +--| given by the format string and save the results into +--| the corresponding arguments. +--| +--| Parameters : +--| file_ptr - input ASCII_TEXT, +--| format - input STRING, +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg19 - output STRING, +--| arg20 - output STRING +--| arg_count - input integer, -- # of arguments in calling procedure +--| +--| Result : STRING representation given ASCII_TEXT. +--| +--| Note: This procedure extracts upto twenty arguments +--| from a line in a file. +--| If a %s(or whatever) is used without a digit then a space +--| must the string in the file inorder for the next argument to +--| be read in or for a match with the next literal to occur properly +--| +--| NOTE that when there is a %t if a time unit follows in the format string +--| it is skipped over (i.e. not treated as a matching string). +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; -- hold format + VARIABLE index : INTEGER := 1; -- index into fmt + VARIABLE fmt_len : INTEGER; -- length of format + VARIABLE ch : CHARACTER; -- present character read from file + VARIABLE fchar : CHARACTER; -- present format character + VARIABLE look_ahead : CHARACTER; -- next format character + VARIABLE mismatch : BOOLEAN := FALSE; -- TRUE if mismatch between format literal + -- and file character + VARIABLE eof : BOOLEAN := FALSE; -- TRUE if end of file + VARIABLE field_width : integer; -- field width + VARIABLE string_type : CHARACTER; -- type of string specified by format + VARIABLE arg_num : INTEGER := 0; -- number of argument currently being read + VARIABLE arg : string(1 to MAX_STRING_LEN+1); -- used to temporarily hold argument + VARIABLE premature_end : BOOLEAN := FALSE; -- true if end of file reached prematurely + VARIABLE t_follow : string(1 to 5); -- checks for time_unit following %t + VARIABLE ii, jj : INTEGER; + + BEGIN + -- make return strings empty + arg1(arg1'left) := NUL; + arg2(arg2'left) := NUL; + arg3(arg3'left) := NUL; + arg4(arg4'left) := NUL; + arg5(arg5'left) := NUL; + arg6(arg6'left) := NUL; + arg7(arg7'left) := NUL; + arg8(arg8'left) := NUL; + arg9(arg9'left) := NUL; + arg10(arg10'left) := NUL; + arg11(arg11'left) := NUL; + arg12(arg12'left) := NUL; + arg13(arg13'left) := NUL; + arg14(arg14'left) := NUL; + arg15(arg15'left) := NUL; + arg16(arg16'left) := NUL; + arg17(arg17'left) := NUL; + arg18(arg18'left) := NUL; + arg19(arg19'left) := NUL; + arg20(arg20'left) := NUL; + + index := Find_NonBlank(fmt, index); + fmt_len := StrLen(fmt); + if ( index > fmt_len ) then + assert FALSE + report "fscan (ASCII_TEXT) -- empty format string." + severity ERROR; + return; + end if; + + eof := ENDFILE(file_ptr); + + while ( (not eof) and (index <= fmt_len) ) loop + + fchar := fmt(index); + look_ahead := NUL; + mismatch := FALSE; + if (index < fmt_len) then + look_ahead := fmt(index+1); + else + look_ahead := ' '; + end if; + + + if ( (fchar = '\') and (look_ahead = 'n') ) then -- \n + if ( END_OF_LINE_MARKER = (LF, ' ') ) then + scan_for_match (file_ptr, LF, eof, mismatch); + else + scan_for_match (file_ptr, CR, eof, mismatch); + end if; + index := index + 2; + elsif ( (fchar = '%') and (look_ahead = '%') ) then -- check for literal % + scan_for_match (file_ptr, '%', eof, mismatch); + index := index + 2; + elsif (fchar = '%') then + if (arg_num = arg_count) then + assert FALSE + report "fscan (ASCII_TEXT) -- number of format specifications exceed argument count" + severity ERROR; + return; + end if; + arg_num := arg_num + 1; + field_width := 0; + index := index + 1; + if (is_digit(look_ahead)) then + get_fw (fmt, index, field_width); + end if; + if (index <= fmt_len) then + string_type := fmt(index); + index := index + 1; + else + assert FALSE + report "fscan (ASCII_TEXT) -- error in format specification" + severity ERROR; + return; + end if; + + case string_type is + when 'c' => if (field_width = 0) then + field_width := 1; + end if; + ii := 1; + while (field_width > 0) loop + ffgetc(ch, eof, file_ptr); + exit when ( eof ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + end loop; + arg(ii) := NUL; + premature_end := ( eof and (ii = 1) ); + + when 'd' | 'f' | 's' | + 'o' | 'x' | 'X' | + 't' => -- skip over time unit if it follows %t + if ( string_type = 't') then + t_follow := (others => ' '); + ii := index; + jj := 2; + if ( (ii < fmt_len) and is_space(fmt(ii)) ) then + ii := ii + 1; + while ( (ii <= fmt_len) and (not is_space(fmt(ii))) and (jj <= 5) ) loop + t_follow(jj) := fmt(ii); + ii := ii + 1; + jj := jj + 1; + end loop; + if ( strcmp(t_follow, " fs ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ps ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ns ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " us ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ms ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " sec ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " min ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " hr ") = 0 ) then + index := index + 3; + end if; + end if; + end if; + if ( field_width = 0 ) then + field_width := MAX_STRING_LEN + 1; + end if; + ffgetc (ch, eof, file_ptr); -- skip over carrage return and line feed and spaces + while ( (is_space(ch) or (ch = LF) or (ch = CR) ) and (not eof) ) loop + ffgetc(ch, eof, file_ptr); + end loop; + ii := 1; + loop + exit when ( eof or is_space(ch) or (ch = LF) or (ch = CR) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, file_ptr); + end loop; + if ( (string_type = 't') and (not eof) and (field_width > 1) and (ch /= LF) and (ch /= CR) ) then + arg(ii) := ' '; + ii := ii + 1; + field_width := field_width - 1; + ffgetc(ch, eof, file_ptr); + loop + exit when ( eof or is_space(ch) or (ch = LF) or (ch = CR) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, file_ptr); + end loop; + end if; + arg(ii) := NUL; + premature_end := ( eof and (ii = 1) ); + + when others => assert FALSE + report "fscan (ASCII_TEXT) -- error in format specification" + severity ERROR; + return; + end case; + case arg_num is + when 1 => strcpy(arg1, arg); + when 2 => strcpy(arg2, arg); + when 3 => strcpy(arg3, arg); + when 4 => strcpy(arg4, arg); + when 5 => strcpy(arg5, arg); + when 6 => strcpy(arg6, arg); + when 7 => strcpy(arg7, arg); + when 8 => strcpy(arg8, arg); + when 9 => strcpy(arg9, arg); + when 10 => strcpy(arg10, arg); + when 11 => strcpy(arg11, arg); + when 12 => strcpy(arg12, arg); + when 13 => strcpy(arg13, arg); + when 14 => strcpy(arg14, arg); + when 15 => strcpy(arg15, arg); + when 16 => strcpy(arg16, arg); + when 17 => strcpy(arg17, arg); + when 18 => strcpy(arg18, arg); + when 19 => strcpy(arg19, arg); + when 20 => strcpy(arg20, arg); + when others => assert FALSE + report "fscan (ASCII_TEXT) -- internal error" + severity ERROR; + return; + end case; + else -- compare for literal + scan_for_match (file_ptr, fchar, eof, mismatch); + index := index + 1; + end if; + + if (mismatch) then + assert NOT WarningsOn + report "fscan (ASCII_TEXT) -- format string literal mismatch" + severity WARNING; + return; + end if; + + index := Find_NonBlank(fmt, index); + end loop; + + index := Find_NonBlank(fmt, index); + assert ( not (WarningsOn and ( (eof and (index <= fmt_len)) or premature_end) ) ) + report "fscan (ASCII TEXT) -- unexpected end of file" + severity WARNING; + + + END fscan; + + +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING ; + VARIABLE arg19 : OUT STRING + ) IS + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, + arg17, arg18, arg19, dummy_arg20, 19); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING + ) IS + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, + arg17, arg18, dummy_arg19, dummy_arg20, 18); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING + ) IS + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, + arg17, dummy_arg18, dummy_arg19, dummy_arg20, 17); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING + ) IS + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 16); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING + ) IS + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 15); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING + ) IS + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 14); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING + ) IS + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, arg13, + dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 13); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING + ) IS + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 12); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING + ) IS + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, arg11, dummy_arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 11); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING + + ) IS + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, arg10, dummy_arg11, dummy_arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 10); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ) IS + VARIABLE dummy_arg10 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, arg9, dummy_arg10, dummy_arg11, dummy_arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 9); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ) IS + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + arg8, dummy_arg9, dummy_arg10, dummy_arg11, dummy_arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 8); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ) IS + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, + dummy_arg8, dummy_arg9, dummy_arg10, dummy_arg11, dummy_arg12, + dummy_arg13, dummy_arg14, dummy_arg15, dummy_arg16, + dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 7); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ) IS + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, arg6, + dummy_arg7, dummy_arg8, dummy_arg9, dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 6); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ) IS + VARIABLE dummy_arg6 : STRING(1 TO 10); + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, arg5, + dummy_arg6, dummy_arg7, dummy_arg8, dummy_arg9, dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 5); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ) IS + VARIABLE dummy_arg5 : STRING(1 TO 10); + VARIABLE dummy_arg6 : STRING(1 TO 10); + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, arg4, dummy_arg5, + dummy_arg6, dummy_arg7, dummy_arg8, dummy_arg9, dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 4); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ) IS + VARIABLE dummy_arg4 : STRING(1 TO 10); + VARIABLE dummy_arg5 : STRING(1 TO 10); + VARIABLE dummy_arg6 : STRING(1 TO 10); + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, arg3, dummy_arg4, dummy_arg5, + dummy_arg6, dummy_arg7, dummy_arg8, dummy_arg9, dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 3); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ) IS + VARIABLE dummy_arg3 : STRING(1 TO 10); + VARIABLE dummy_arg4 : STRING(1 TO 10); + VARIABLE dummy_arg5 : STRING(1 TO 10); + VARIABLE dummy_arg6 : STRING(1 TO 10); + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, arg2, dummy_arg3, dummy_arg4, + dummy_arg5,dummy_arg6,dummy_arg7,dummy_arg8,dummy_arg9,dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 2); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ) IS + VARIABLE dummy_arg2 : STRING(1 TO 10); + VARIABLE dummy_arg3 : STRING(1 TO 10); + VARIABLE dummy_arg4 : STRING(1 TO 10); + VARIABLE dummy_arg5 : STRING(1 TO 10); + VARIABLE dummy_arg6 : STRING(1 TO 10); + VARIABLE dummy_arg7 : STRING(1 TO 10); + VARIABLE dummy_arg8 : STRING(1 TO 10); + VARIABLE dummy_arg9 : STRING(1 TO 10); + VARIABLE dummy_arg10 : STRING(1 TO 10); + VARIABLE dummy_arg11 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg12 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg13 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg14 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg15 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg16 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg17 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg18 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg19 : STRING(1 TO 10); -- dummy string; + VARIABLE dummy_arg20 : STRING(1 TO 10); -- dummy string; + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, format, arg1, dummy_arg2, dummy_arg3, dummy_arg4, + dummy_arg5,dummy_arg6,dummy_arg7,dummy_arg8,dummy_arg9,dummy_arg10, + dummy_arg11, dummy_arg12, dummy_arg13, dummy_arg14, dummy_arg15, + dummy_arg16, dummy_arg17, dummy_arg18, dummy_arg19, dummy_arg20, 1); + return; + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : ffgetc +--| +--| Overloading : Text, ASCII_TEXT, string_buf +--| +--| Purpose : to read the next character from a file +--| +--| +--| Parameters : result - output character -- returned char +--| eof - output BOOLEAN -- TRUE if end of file reached +--| stream - in TEXT -- file +--| ptr - inout line -- line buffer +--| +--| +--| Result : next character from the specified file. +--| returns LF if the end of the line is reached. +--| return with eof true if end of file is reached +--| +--|----------------------------------------------------------------------------- + + PROCEDURE ffgetc ( VARIABLE result : OUT CHARACTER; + VARIABLE eof : OUT BOOLEAN; + VARIABLE stream : IN TEXT; + VARIABLE ptr : INOUT LINE + ) IS + + BEGIN + eof := FALSE; + if ( ptr = NULL) then + if ( not ENDFILE(stream) ) then + READLINE(stream, ptr); + read(ptr, result); + else + result := NUL; + eof := TRUE; + end if; + elsif ( ptr.all'LENGTH = 0 ) then -- vantage ENDLINE function does not compile + if ( not ENDFILE(stream) ) then + READLINE(stream, ptr); + result := LF; + else + result := NUL; + eof := TRUE; + end if; + else + read(ptr, result); + end if; + return; + END; + + +--+----------------------------------------------------------------------------- +--| Procedure Name : scan_for_match +--|.hidden +--| Overloading : TEXT and ASCII_TEXT and string_buf +--| +--| Purpose : To scan file skipping over blank spaces and newline +--| characters until a non-whitespace character is found. +--| If that character matches match_char then mismatch is +--| return false otherwise its TRUE. +--| +--| Parameters : fptr : IN TEXT +--| lptr : INOUT LINE +--| match_char : IN CHARACTER +--| eof : INOUT BOOLEAN +--| mismatch : OUT BOOLEAN +--| +--|----------------------------------------------------------------------------- + + + procedure scan_for_match ( VARIABLE fptr : IN TEXT; + VARIABLE lptr : INOUT LINE; + CONSTANT match_char : IN CHARACTER; + VARIABLE eof : INOUT BOOLEAN; + VARIABLE mismatch : OUT BOOLEAN ) is + + VARIABLE ch : CHARACTER; + + begin + mismatch := FALSE; + ffgetc (ch, eof, fptr, lptr); + while ( (is_space(ch) or ( (ch = LF) and (match_char /= LF) ) ) and (not eof) ) loop + ffgetc (ch, eof, fptr, lptr); + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + return; + end; + + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| 1.2.3 +--| Overloading : None +--| +--| Purpose : To read text from a file according to specifications +--| given by the format string and save the results into +--| the corresponding arguments. +--| +--| Parameters : +--| file_ptr - input TEXT, +--| line_ptr - input_output LINE, +--| format - input STRING, +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg19 - output STRING, +--| arg20 - output STRING +--| arg_count - input integer, -- # of arguments in calling procedure +--| +--| Result : STRING representation given TEXT. +--| +--| Note: This procedure extracts upto twenty arguments +--| from a line in a file. +--| If a %s(or whatever) is used without a digit then a space +--| must the string in the file inorder for the next argument to +--| be read in or for a match with the next literal to occur properly +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ) IS + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; -- hold format + VARIABLE index : INTEGER := 1; -- index into fmt + VARIABLE fmt_len : INTEGER; -- length of format + VARIABLE ch : CHARACTER; -- present character read from file + VARIABLE fchar : CHARACTER; -- present format character + VARIABLE look_ahead : CHARACTER; -- next format character + VARIABLE mismatch : BOOLEAN := FALSE; -- TRUE if mismatch between format literal + -- and file character + VARIABLE eof : BOOLEAN := FALSE; -- TRUE if end of file + VARIABLE field_width : integer; -- field width + VARIABLE string_type : CHARACTER; -- type of string specified by format + VARIABLE arg_num : INTEGER := 0; -- number of argument currently being read + VARIABLE arg : string(1 to MAX_STRING_LEN+1); -- used to temporarily hold argument + VARIABLE premature_end : BOOLEAN := FALSE; -- true if end of file reached prematurely + VARIABLE t_follow : string(1 to 5); -- used to check for time unit following %t + VARIABLE ii, jj : INTEGER; + + BEGIN + -- make return strings empty + arg1(arg1'left) := NUL; + arg2(arg2'left) := NUL; + arg3(arg3'left) := NUL; + arg4(arg4'left) := NUL; + arg5(arg5'left) := NUL; + arg6(arg6'left) := NUL; + arg7(arg7'left) := NUL; + arg8(arg8'left) := NUL; + arg9(arg9'left) := NUL; + arg10(arg10'left) := NUL; + arg11(arg11'left) := NUL; + arg12(arg12'left) := NUL; + arg13(arg13'left) := NUL; + arg14(arg14'left) := NUL; + arg15(arg15'left) := NUL; + arg16(arg16'left) := NUL; + arg17(arg17'left) := NUL; + arg18(arg18'left) := NUL; + arg19(arg19'left) := NUL; + arg20(arg20'left) := NUL; + + index := Find_NonBlank(fmt, index); + fmt_len := StrLen(fmt); + if ( index > fmt_len ) then + assert FALSE + report "fscan (TEXT) -- empty format string." + severity ERROR; + return; + end if; + + eof := ENDFILE(file_ptr) and ( (line_ptr = NULL) or (line_ptr.all'LENGTH = 0) ); -- vantage ENDLINE function does not compile + + while ( (not eof) and (index <= fmt_len) ) loop + + fchar := fmt(index); + look_ahead := NUL; + mismatch := FALSE; + if (index < fmt_len) then + look_ahead := fmt(index+1); + else + look_ahead := ' '; + end if; + + + if ( (fchar = '\') and (look_ahead = 'n') ) then -- \n + scan_for_match (file_ptr, line_ptr, LF, eof, mismatch); + index := index + 2; + elsif ( (fchar = '%') and (look_ahead = '%') ) then -- check for literal % + scan_for_match (file_ptr, line_ptr, '%', eof, mismatch); + index := index + 2; + elsif (fchar = '%') then + if (arg_num = arg_count) then + assert FALSE + report "fscan (TEXT) -- number of format specifications exceed argument count" + severity ERROR; + return; + end if; + arg_num := arg_num + 1; + field_width := 0; + index := index + 1; + if (is_digit(look_ahead)) then + get_fw (fmt, index, field_width); + end if; + if (index <= fmt_len) then + string_type := fmt(index); + index := index + 1; + else + assert FALSE + report "fscan (TEXT) -- error in format specification" + severity ERROR; + return; + end if; + + case string_type is + when 'c' => if (field_width = 0) then + field_width := 1; + end if; + ii := 1; + while (field_width > 0) loop + ffgetc(ch, eof, file_ptr, line_ptr); + exit when ( eof ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + end loop; + arg(ii) := NUL; + premature_end := ( eof and (ii = 1) ); + + when 'd' | 'f' | 's' | + 'o' | 'x' | 'X' | + 't' => -- skip over time unit if it follows %t + if ( string_type = 't') then + t_follow := (others => ' '); + ii := index; + jj := 2; + if ( (ii < fmt_len) and is_space(fmt(ii)) ) then + ii := ii + 1; + while ( (ii <= fmt_len) and (not is_space(fmt(ii))) and (jj <= 5) ) loop + t_follow(jj) := fmt(ii); + ii := ii + 1; + jj := jj + 1; + end loop; + if ( strcmp(t_follow, " fs ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ps ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ns ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " us ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ms ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " sec ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " min ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " hr ") = 0 ) then + index := index + 3; + end if; + end if; + end if; + if ( field_width = 0 ) then + field_width := MAX_STRING_LEN + 1; + end if; + ffgetc (ch, eof, file_ptr, line_ptr); + while ( (is_space(ch) or (ch = LF) ) and (not eof) ) loop + ffgetc(ch, eof, file_ptr, line_ptr); + end loop; + ii := 1; + loop + exit when ( eof or is_space(ch) or (ch = LF) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, file_ptr, line_ptr); + end loop; + if ( (string_type = 't') and (not eof) and (field_width > 1) and (ch /= LF) ) then + arg(ii) := ' '; + ii := ii + 1; + field_width := field_width - 1; + ffgetc(ch, eof, file_ptr, line_ptr); + loop + exit when ( eof or is_space(ch) or (ch = LF) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, file_ptr, line_ptr); + end loop; + end if; + arg(ii) := NUL; + premature_end := ( eof and (ii = 1) ); + + when others => assert FALSE + report "fscan (TEXT) -- error in format specification" + severity ERROR; + return; + end case; + case arg_num is + when 1 => strcpy(arg1, arg); + when 2 => strcpy(arg2, arg); + when 3 => strcpy(arg3, arg); + when 4 => strcpy(arg4, arg); + when 5 => strcpy(arg5, arg); + when 6 => strcpy(arg6, arg); + when 7 => strcpy(arg7, arg); + when 8 => strcpy(arg8, arg); + when 9 => strcpy(arg9, arg); + when 10 => strcpy(arg10, arg); + when 11 => strcpy(arg11, arg); + when 12 => strcpy(arg12, arg); + when 13 => strcpy(arg13, arg); + when 14 => strcpy(arg14, arg); + when 15 => strcpy(arg15, arg); + when 16 => strcpy(arg16, arg); + when 17 => strcpy(arg17, arg); + when 18 => strcpy(arg18, arg); + when 19 => strcpy(arg19, arg); + when 20 => strcpy(arg20, arg); + when others => assert FALSE + report "fscan (TEXT) -- internal error" + severity ERROR; + return; + end case; + else -- compare for literal + scan_for_match (file_ptr, line_ptr, fchar, eof, mismatch); + index := index + 1; + end if; + + if (mismatch) then + assert NOT WarningsOn + report "fscan (TEXT) -- format string literal mismatch" + severity WARNING; + return; + end if; + + index := Find_NonBlank(fmt, index); + end loop; + + index := Find_NonBlank(fmt, index); + assert ( not (WarningsOn and ( (eof and (index <= fmt_len)) or premature_end) ) ) + report "fscan (TEXT) -- unexpected end of file" + severity WARNING; + + END fscan; + +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING ; + VARIABLE arg19 : OUT STRING + ) IS + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, arg18, + arg19, dumy_arg20, 19); + return; + END fscan; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING + ) IS + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, arg18, + dumy_arg19, dumy_arg20, 18); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING + ) IS + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, dumy_arg18, + dumy_arg19, dumy_arg20, 17); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING + ) IS + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, dumy_arg17, dumy_arg18, + dumy_arg19, dumy_arg20, 16); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING + ) IS + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, dumy_arg16, dumy_arg17, + dumy_arg18, dumy_arg19, dumy_arg20, 15); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING + ) IS + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 14); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING + ) IS + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 13); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING + ) IS + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 12); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING + ) IS + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, dumy_arg12, + dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 11); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING + ) IS + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 10); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ) IS + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 9); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ) IS + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, dumy_arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 8); + return; + END; +--|--------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ) IS + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, dumy_arg8, dumy_arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 7); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ) IS + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 6); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ) IS + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 5); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ) IS + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 4); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ) IS + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 3); + return; + END; + + + +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ) IS + VARIABLE dumy_arg3 : STRING(1 TO 10); + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, arg2, dumy_arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 2); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ) IS + VARIABLE dumy_arg2 : STRING(1 TO 10); + VARIABLE dumy_arg3 : STRING(1 TO 10); + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(file_ptr, line_ptr, format, arg1, dumy_arg2, dumy_arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 1); + return; + END; + + +--+----------------------------------------------------------------------------- +--| Function Name : ffgetc +--| +--| Overloading : Text, ASCII_TEXT, string_buf +--| +--| Purpose : to read the next character from a file +--| +--| +--| Parameters : result - output character -- returned char +--| eof - output BOOLEAN -- TRUE if end of file reached +--| stream - in string -- file +--| ptr - inout INTEGER -- index into string buf +--| +--| Notes : returns with eof true if end of string is reached +--| : assumes a string starting at an index of 1 +--| +--|----------------------------------------------------------------------------- + + PROCEDURE ffgetc ( VARIABLE result : OUT CHARACTER; + VARIABLE eof : OUT BOOLEAN; + VARIABLE stream : IN STRING; + VARIABLE ptr : INOUT INTEGER + ) IS + + VARIABLE end_file : BOOLEAN; -- refers to end of string + + BEGIN + end_file := ( (ptr > stream'LENGTH) or (stream(ptr) = NUL) ); + if (not end_file) then + result := stream(ptr); + ptr := ptr + 1; + end if; + eof := end_file; + return; + END; + + +--+----------------------------------------------------------------------------- +--| Procedure Name : scan_for_match +--|.hidden +--| Overloading : TEXT and ASCII_TEXT and string_buf +--| +--| Purpose : To scan file skipping over blank spaces and newline +--| characters until a non-whitespace character is found. +--| If that character matches match_char then mismatch is +--| return false otherwise its TRUE. +--| +--| handles all three END_OF_LINE_MARKERS (LF, CR, and CR & LF) +--| +--| Parameters : str : IN STRING +--| ptr : INOUT INTEGER +--| match_char : IN CHARACTER +--| eof : INOUT BOOLEAN +--| mismatch : OUT BOOLEAN +--| +--|----------------------------------------------------------------------------- + + + procedure scan_for_match ( VARIABLE str : IN STRING; + VARIABLE ptr : INOUT INTEGER; + CONSTANT match_char : IN CHARACTER; + VARIABLE eof : INOUT BOOLEAN; + VARIABLE mismatch : OUT BOOLEAN ) is + + VARIABLE ch : CHARACTER; + VARIABLE cont : BOOLEAN; + + begin + if ( END_OF_LINE_MARKER = (LF, ' ') ) then + mismatch := FALSE; + ffgetc (ch, eof, str, ptr); + while ( (is_space(ch) or ( (ch = LF) and (match_char /= LF) ) ) and (not eof) ) loop + ffgetc (ch, eof, str, ptr); + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + elsif ( END_OF_LINE_MARKER = (CR, ' ') ) then + mismatch := FALSE; + ffgetc (ch, eof, str, ptr); + while ( (is_space(ch) or ( (ch = CR) and (match_char /= CR) ) ) and (not eof) ) loop + ffgetc (ch, eof, str, ptr); + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + else -- END_OF_LINE_MARKER = CR & LF + mismatch := FALSE; + cont := TRUE; + ffgetc (ch, eof, str, ptr); + while ( cont ) loop + while ( (is_space(ch) or ( ( (ch = CR) or (ch = LF) ) and (match_char /= CR) ) ) and (not eof) ) loop + ffgetc (ch, eof, str, ptr); + end loop; + CONT := FALSE; + if ( (match_char = CR) and (ch = CR) ) then + ffgetc(ch, eof, str, ptr); + cont := (ch /= LF); + if (not cont) then + return; + end if; + end if; + end loop; + if (not eof) then + mismatch := (ch /= match_char); + end if; + end if; + return; + end; + + + + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| 1.2.4 +--| Overloading : TEXT, ASCII_TEXT, and string_buf +--| +--| Purpose : To read text from a string buffer according to +--| specifications given by a format string and save +--| the result into corresponding arguments. +--| +--| Parameters : +--| string_buf - input string, +--| format - input STRING, +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg91 - output STRING, +--| arg20 - output STRING, +--| arg_count - input INTEGER - number of argumetns passed to fscan +--| +--| Result : STRING representation given TEXT. +--| +--| Note: This procedure extracts upto twenty arguments +--| from a string buffer. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ) IS + VARIABLE str_buffer : STRING(1 TO string_buf'LENGTH) := string_buf; -- hold string buffer + VARIABLE fmt : STRING(1 TO format'LENGTH) := format; -- hold format + VARIABLE index : INTEGER := 1; -- index into fmt + VARIABLE str_indx : INTEGER := 1; -- index into str_buffer + VARIABLE fmt_len : INTEGER; -- length of format + VARIABLE ch : CHARACTER; -- present character read from string buffer + VARIABLE fchar : CHARACTER; -- present format character + VARIABLE look_ahead : CHARACTER; -- next format character + VARIABLE mismatch : BOOLEAN := FALSE; -- TRUE if mismatch between format literal + -- and string buffer character + VARIABLE eof : BOOLEAN := FALSE; -- TRUE if end of string buffer + VARIABLE field_width : integer; -- field width + VARIABLE string_type : CHARACTER; -- type of string specified by format + VARIABLE arg_num : INTEGER := 0; -- number of argument currently being read + VARIABLE arg : string(1 to MAX_STRING_LEN+1); -- used to temporarily hold argument + VARIABLE premature_end : BOOLEAN := FALSE; -- true if end of string buffer reached prematurely + VARIABLE t_follow : string(1 to 5); -- used to check for time unit following %t + VARIABLE ii, jj : INTEGER; + + BEGIN + -- make return strings empty + arg1(arg1'left) := NUL; + arg2(arg2'left) := NUL; + arg3(arg3'left) := NUL; + arg4(arg4'left) := NUL; + arg5(arg5'left) := NUL; + arg6(arg6'left) := NUL; + arg7(arg7'left) := NUL; + arg8(arg8'left) := NUL; + arg9(arg9'left) := NUL; + arg10(arg10'left) := NUL; + arg11(arg11'left) := NUL; + arg12(arg12'left) := NUL; + arg13(arg13'left) := NUL; + arg14(arg14'left) := NUL; + arg15(arg15'left) := NUL; + arg16(arg16'left) := NUL; + arg17(arg17'left) := NUL; + arg18(arg18'left) := NUL; + arg19(arg19'left) := NUL; + arg20(arg20'left) := NUL; + + index := Find_NonBlank(fmt, index); + fmt_len := StrLen(fmt); + if ( index > fmt_len ) then + assert FALSE + report "fscan (String Buffer) -- empty format string." + severity ERROR; + return; + end if; + + eof := ( (str_indx > str_buffer'length) or (str_buffer(str_indx) = NUL) ); + + while ( (not eof) and (index <= fmt_len) ) loop + + fchar := fmt(index); + look_ahead := NUL; + mismatch := FALSE; + if (index < fmt_len) then + look_ahead := fmt(index+1); + else + look_ahead := ' '; + end if; + + + if ( (fchar = '\') and (look_ahead = 'n') ) then -- \n + if ( END_OF_LINE_MARKER = (LF, ' ') ) then + scan_for_match (str_buffer, str_indx, LF, eof, mismatch); + else + scan_for_match (str_buffer, str_indx, CR, eof, mismatch); + end if; + index := index + 2; + elsif ( (fchar = '%') and (look_ahead = '%') ) then -- check for literal % + scan_for_match (str_buffer, str_indx, '%', eof, mismatch); + index := index + 2; + elsif (fchar = '%') then + if (arg_num = arg_count) then + assert FALSE + report "fscan (String Buffer) -- number of format specifications exceed argument count" + severity ERROR; + return; + end if; + arg_num := arg_num + 1; + field_width := 0; + index := index + 1; + if (is_digit(look_ahead)) then + get_fw (fmt, index, field_width); + end if; + if (index <= fmt_len) then + string_type := fmt(index); + index := index + 1; + else + assert FALSE + report "fscan (String Buffer) -- error in format specification" + severity ERROR; + return; + end if; + + case string_type is + when 'c' => if (field_width = 0) then + field_width := 1; + end if; + ii := 1; + while (field_width > 0) loop + ffgetc(ch, eof, str_buffer, str_indx); + exit when ( eof ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + end loop; + arg(ii) := NUL; + premature_end := (eof and (ii = 1) ); + + when 'd' | 'f' | 's' | + 'o' | 'x' | 'X' | + 't' => -- skip over time unit if it follows %t + if ( string_type = 't') then + t_follow := (others => ' '); + ii := index; + jj := 2; + if ( (ii < fmt_len) and is_space(fmt(ii)) ) then + ii := ii + 1; + while ( (ii <= fmt_len) and (not is_space(fmt(ii))) and (jj <= 5) ) loop + t_follow(jj) := fmt(ii); + ii := ii + 1; + jj := jj + 1; + end loop; + if ( strcmp(t_follow, " fs ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ps ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ns ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " us ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " ms ") = 0 ) then + index := index + 3; + elsif ( strcmp(t_follow, " sec ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " min ") = 0 ) then + index := index + 4; + elsif ( strcmp(t_follow, " hr ") = 0 ) then + index := index + 3; + end if; + end if; + end if; + if ( field_width = 0 ) then + field_width := MAX_STRING_LEN + 1; + end if; + ffgetc (ch, eof, str_buffer, str_indx); -- skip over carrage return and line feed and spaces + while ( (is_space(ch) or (ch = LF) or (ch = CR) ) and (not eof) ) loop + ffgetc(ch, eof, str_buffer, str_indx); + end loop; + ii := 1; + loop + exit when ( eof or is_space(ch) or (ch = LF) or (ch = CR) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, str_buffer, str_indx); + end loop; + if ( (string_type = 't') and (not eof) and (field_width > 1) and (ch /= LF) and (ch /= CR) ) then + arg(ii) := ' '; + ii := ii + 1; + field_width := field_width - 1; + ffgetc(ch, eof, str_buffer, str_indx); + loop + exit when ( eof or is_space(ch) or (ch = LF) or (ch = CR) ); + arg(ii) := ch; + ii := ii + 1; + field_width := field_width - 1; + exit when (field_width = 0); + ffgetc(ch, eof, str_buffer, str_indx); + end loop; + end if; + arg(ii) := NUL; + premature_end := ( eof and (ii = 1) ); + + when others => assert FALSE + report "fscan (String Buffer) -- error in format specification" + severity ERROR; + return; + end case; + case arg_num is + when 1 => strcpy(arg1, arg); + when 2 => strcpy(arg2, arg); + when 3 => strcpy(arg3, arg); + when 4 => strcpy(arg4, arg); + when 5 => strcpy(arg5, arg); + when 6 => strcpy(arg6, arg); + when 7 => strcpy(arg7, arg); + when 8 => strcpy(arg8, arg); + when 9 => strcpy(arg9, arg); + when 10 => strcpy(arg10, arg); + when 11 => strcpy(arg11, arg); + when 12 => strcpy(arg12, arg); + when 13 => strcpy(arg13, arg); + when 14 => strcpy(arg14, arg); + when 15 => strcpy(arg15, arg); + when 16 => strcpy(arg16, arg); + when 17 => strcpy(arg17, arg); + when 18 => strcpy(arg18, arg); + when 19 => strcpy(arg19, arg); + when 20 => strcpy(arg20, arg); + when others => assert FALSE + report "fscan (String Buffer) -- internal error" + severity ERROR; + return; + end case; + else -- compare for literal + scan_for_match (str_buffer, str_indx, fchar, eof, mismatch); + index := index + 1; + end if; + + if (mismatch) then + assert NOT WarningsOn + report "fscan (String Buffer) -- format string literal mismatch" + severity WARNING; + return; + end if; + + index := Find_NonBlank(fmt, index); + end loop; + + index := Find_NonBlank(fmt, index); + assert ( not (WarningsOn and ( (eof and (index <= fmt_len)) or premature_end) ) ) + report "fscan (String BUffer) -- unexpected end of string" + severity WARNING; + + END fscan; + + +--|--------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING ; + VARIABLE arg19 : OUT STRING + ) IS + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, arg18, + arg19, dumy_arg20, 19); + return; + END; +--|--------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING ; + VARIABLE arg18 : OUT STRING + ) IS + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, arg18, + dumy_arg19, dumy_arg20, 18); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING ; + VARIABLE arg17 : OUT STRING + ) IS + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, arg17, dumy_arg18, + dumy_arg19, dumy_arg20, 17); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING ; + VARIABLE arg16 : OUT STRING + ) IS + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, arg16, dumy_arg17, dumy_arg18, + dumy_arg19, dumy_arg20, 16); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING ; + VARIABLE arg15 : OUT STRING + ) IS + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, arg15, dumy_arg16, dumy_arg17, + dumy_arg18, dumy_arg19, dumy_arg20, 15); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING ; + VARIABLE arg14 : OUT STRING + ) IS + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 14); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING ; + VARIABLE arg13 : OUT STRING + ) IS + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 13); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING ; + VARIABLE arg12 : OUT STRING + ) IS + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, + dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 12); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING ; + VARIABLE arg11 : OUT STRING + ) IS + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, arg11, dumy_arg12, + dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 11); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING ; + VARIABLE arg10 : OUT STRING + ) IS + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 10); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ) IS + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 9); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ) IS + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, dumy_arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 8); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ) IS + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, dumy_arg8, dumy_arg9, dumy_arg10, dumy_arg11, + dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, dumy_arg16, + dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 7); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ) IS + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 6); + return; + END; +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ) IS + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 5); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ) IS + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 4); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ) IS + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 3); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ) IS + VARIABLE dumy_arg3 : STRING(1 TO 10); + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, arg2, dumy_arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 2); + return; + END; +--|---------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ) IS + VARIABLE dumy_arg2 : STRING(1 TO 10); + VARIABLE dumy_arg3 : STRING(1 TO 10); + VARIABLE dumy_arg4 : STRING(1 TO 10); + VARIABLE dumy_arg5 : STRING(1 TO 10); + VARIABLE dumy_arg6 : STRING(1 TO 10); + VARIABLE dumy_arg7 : STRING(1 TO 10); + VARIABLE dumy_arg8 : STRING(1 TO 10); + VARIABLE dumy_arg9 : STRING(1 TO 10); + VARIABLE dumy_arg10 : STRING(1 TO 10); + VARIABLE dumy_arg11 : STRING(1 TO 10); + VARIABLE dumy_arg12 : STRING(1 TO 10); + VARIABLE dumy_arg13 : STRING(1 TO 10); + VARIABLE dumy_arg14 : STRING(1 TO 10); + VARIABLE dumy_arg15 : STRING(1 TO 10); + VARIABLE dumy_arg16 : STRING(1 TO 10); + VARIABLE dumy_arg17 : STRING(1 TO 10); + VARIABLE dumy_arg18 : STRING(1 TO 10); + VARIABLE dumy_arg19 : STRING(1 TO 10); + VARIABLE dumy_arg20 : STRING(1 TO 10); + BEGIN + -- call procedure fscan with 20 arguments + fscan(string_buf, format, arg1, dumy_arg2, dumy_arg3, dumy_arg4, + dumy_arg5, dumy_arg6, dumy_arg7, dumy_arg8, dumy_arg9, dumy_arg10, + dumy_arg11, dumy_arg12, dumy_arg13, dumy_arg14, dumy_arg15, + dumy_arg16, dumy_arg17, dumy_arg18, dumy_arg19, dumy_arg20, 1); + return; + END; + +--+---------------------------------------------------------------------------- +--| Function Name : fgetc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read the next character from a file of type +--| ASCII_TEXT. +--| +--| Parameters : +--| stream - input ASCII_TEXT, +--| +--| Result : Returns the ordinate value of the character read. If +--| end of file is reached then return - 1 +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE n : Integer; +--| FILE f_in : ASCII_TEXT IS IN "design.doc"; +--| +--| fgetc(n, f_in); +--| +--| Will return ordinal value of character in integer n +--|----------------------------------------------------------------------------- + PROCEDURE fgetc ( VARIABLE result : OUT INTEGER; + VARIABLE stream : IN ASCII_TEXT + ) IS + VARIABLE ch : CHARACTER; + BEGIN + IF ( NOT ENDFILE(stream)) THEN + READ(stream, ch); + result := CHARACTER'POS(ch); + ELSE + result := -1; -- end of file + END IF; + return; + + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fgetc +--| +--| Overloading : None +--| +--| Purpose : To read the next character from a file of type TEXT. +--| +--| Parameters : +--| stream - input TEXT, +--| ptr - INOUT, LINE +--| Result :Integer, the ordinate value of the character being read. +--| -1 when end of file (EOF). +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| +--| USE: : +--| VARIABLE n : Integer; +--| FILE f_in : TEXT IS IN "design.doc"; +--| +--| fgetc(n, f_in); +--| +--| Will return ordinal value of character in integer n +--| +--| Problems : When reading last line of file, if it is terminated with +--| an end of line marker then when the end of the last line is +--| reached the final eol will not be returned (instead -1 will be +--| returned). +--| +--|----------------------------------------------------------------------------- + PROCEDURE fgetc ( VARIABLE result : OUT INTEGER; + VARIABLE stream : IN TEXT; + VARIABLE ptr : INOUT LINE + ) IS + VARIABLE ch : character; + + BEGIN + if ( (ptr /= NULL) and (ptr'LENGTH /= 0) ) then + READ(ptr, ch); + result := CHARACTER'POS(ch); + elsif ( not ENDFILE(stream) ) then + if ( ptr /= NULL) then -- ptr'length = 0 + READLINE(stream, ptr); + result := 10; -- ascii code for LF (line feed) + else -- ptr = null (this should mean its at the beginning of the file) + READLINE(stream, ptr); + READ(ptr, ch); + result := CHARACTER'POS(ch); + end if; + else + result := -1; -- end of file + end if; + return; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fgets +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read, at most, the next n characters from a file +--| of type ASCII_TEXT and save them to a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| +--| n -- input, Natural, number of +--| characters to be read. +--| stream -- input, ASCII_TEXT, input file. +--| +--| result : string +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 100); +--| FILE f_in : ASCII_TEXT IS IN "design.doc"; +--| +--| fgets(str_buf, 50, f_in); +--| +--| Will read in at most 50 characters from the file +--| design.doc and place them in str_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgets ( VARIABLE l_str : OUT STRING; + CONSTANT n : IN NATURAL; + VARIABLE stream : IN ASCII_TEXT + ) IS + VARIABLE ch : CHARACTER; + VARIABLE lstr_cpy : STRING(1 TO n); + VARIABLE index : NATURAL := 0; + BEGIN + IF (n=0) THEN + if (l_str'LENGTH > 0 ) then + l_str(l_str'LEFT) := NUL; + end if; + return; + ELSE + assert ( not (WarningsON and ENDFILE(stream)) ) + report "fgets (ASCII_TEXT) -- attempt to read past end of file" + severity WARNING; + + while ( NOT ENDFILE(stream) ) LOOP + READ(stream, ch); + index := index + 1; + lstr_cpy(index) := ch; + EXIT when ((index >= n) OR (ch = END_OF_LINE_MARKER(1))); + END LOOP; + END IF; + + -- determine the length of string and place charcaters + IF (l_str'LENGTH <= n) THEN + l_str := lstr_cpy(1 TO l_str'LENGTH); + ELSE + l_str(1 TO n) := lstr_cpy; + l_str(n+1) := NUL; + END IF; + + RETURN; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fgets +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read, at most, the next n characters from a file +--| of type TEXT and save them to a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| n -- input, Natural, number of +--| characters to be read. +--| stream -- input, TEXT, input file. +--| line_ptr -- inout LINE, +--| +--| result : string +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 100); +--| FILE f_in : TEXT IS IN "design.doc"; +--| +--| fgets(str_buf, 50, f_in); +--| +--| Will read in at most 50 characters from the file +--| design.doc and place them in str_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgets ( VARIABLE l_str : OUT STRING; + CONSTANT n : IN NATURAL; + VARIABLE stream : IN TEXT; + VARIABLE line_ptr : INOUT LINE + ) IS + + VARIABLE ch : character; + VARIABLE str : STRING( 1 TO n+1); + VARIABLE counter : integer := 0; + + BEGIN + -- + if ( (line_ptr = NULL) or (line_ptr'LENGTH = 0) ) then + if (ENDFILE(stream)) then + assert (not WarningsON) + report "fgets (text) -- attempt to read past end of file" + severity WARNING; + str(1) := NUL; + strcpy(l_str, str); + return; + else + READLINE(stream, line_ptr); + end if; + end if; + for i IN 1 to n loop + exit when ( (line_ptr = NULL) or (line_ptr'LENGTH = 0) ); + READ(line_ptr, ch); + str(i) := ch; + counter := counter + 1; + end loop; + str(counter + 1) := NUL; + strcpy(l_str, str); + RETURN; + END; + +--+--------------------------------------------------------------------------- +--| Function Name : fgetline +--| +--| Overloading : None +--| +--| Purpose : To read a line from the input ASCII_TEXT file and +--| save into a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| stream -- input, ASCII_TEXT, input file +--| +--| result : string. +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE line_buf : string(1 TO 256); +--| FILE in_file : ASCII_TEXT IS IN "file_ascii_in.dat"; +--| +--| fgetline(line_buf, in_file); +--| +--| Will read a line from the file +--| file_ascii_in.dat and place into line_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgetline ( VARIABLE l_str : OUT STRING; + VARIABLE stream : IN ASCII_TEXT + ) IS + VARIABLE ch : character := ' '; + VARIABLE indx : integer := 0; + VARIABLE str_copy : STRING(1 TO max_string_len); + BEGIN + -- + IF ENDFILE(stream) THEN + assert Not WarningsOn + report " fgetline (ASCII_TEXT) --- end of file, nothing to read." + severity WARNING; + if (l_str'LENGTH > 0 ) then + l_str(l_str'LEFT) := NUL; + end if; + return; + ELSE + while ( (not ENDFILE(stream)) and (ch /= END_OF_LINE_MARKER(1)) ) loop + READ(stream, ch); + indx := indx + 1; + str_copy(indx) := ch; + end loop; + -- determine the length and place characters + IF (l_str'LENGTH <= indx) THEN + l_str := str_copy(1 TO l_str'LENGTH); + ELSE + l_str(1 TO indx) := str_copy(1 TO indx); + l_str(indx+1) := NUL; + END IF; + RETURN; + END IF; + + END; + +--+--------------------------------------------------------------------------- +--| Function Name : fgetline +--| +--| Overloading : None +--| +--| Purpose : To read a line from the input TEXT file and +--| save into a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| stream -- input, TEXT, input file +--| +--| result : string. +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| USE: : +--| VARIABLE line_buf : string(1 TO 256); +--| FILE in_file : TEXT IS IN "file_text_in.dat"; +--| +--| fgetline(line_buf, in_file); +--| +--| Will read a line from the file +--| file_text_in.dat and place into line_buf. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fgetline ( VARIABLE l_str : OUT STRING; + VARIABLE stream : IN TEXT; + VARIABLE line_ptr : INOUT LINE + ) IS + VARIABLE str_copy : STRING(1 TO max_string_len + 1); + VARIABLE ch : character; + VARIABLE indx : NATURAL := 0; + BEGIN + If ( (line_ptr /= NULL) and (line_ptr'LENGTH > 0) ) then + NULL; + elsif ( not ENDFILE(stream) ) then + READLINE(stream, line_ptr); + else + assert NOT WarningsOn + report " fgetline (TEXT) --- end of file, nothing to read." + severity WARNING; + l_str(l_str'left) := NUL; + return; + end if; + while ( (line_ptr /= NULL) and (line_ptr'length /= 0) ) loop + READ(line_ptr,ch); + indx := indx + 1; + str_copy(indx) := ch; + end loop; + str_copy(indx + 1) := NUL; + strcpy(l_str, str_copy); + return; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fputc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose :To write a character to an ASCII_TEXT file. +--| +--| Parameters : +--| c -- input, CHARACTER, +--| stream -- output ASCII_TEXT, +--| +--| Result : +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| This procedure is equivalent to VHDL WRITE(stream, c). +--| +--| USE: : +--| VARIABLE str12 : string(1 TO 12); +--| FILE out_file : ASCII_TEXT IS OUT "file_ascii_out.dat"; +--| +--| str12 := "0123456789ab"; +--| FOR i IN 1 TO 12 LOOP +--| fputc(str12(i), out_file); +--| END LOOP; +--| +--| Will write all the 12 characters to file +--| file_ascii_out.dat +--|----------------------------------------------------------------------------- + PROCEDURE fputc ( CONSTANT c : IN CHARACTER; + VARIABLE stream : OUT ASCII_TEXT + ) IS + BEGIN + WRITE(stream, c); -- built_in write + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fputc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a character to a TEXT file. +--| +--| Parameters : +--| c -- input, CHARACTER, +--| stream -- output, TEXT, +--| line_ptr -- INOUT LINE +--| +--| Result : +--| +--| Note: : The STD TEXTIO package has declared TEXT as a +--| file of STRING. This is not same as file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str12 : string(1 TO 12); +--| VARIABLE l : LINE; +--| FILE out_file : TEXT IS OUT "file_text_out.dat"; +--| +--| str12 := "0123456789ab"; +--| FOR i IN 1 TO 12 LOOP +--| fputc(str12(i), out_file, l); +--| END LOOP; +--| fputc(LF, out_file, l); -- line feed +--| +--| Will write contents of the str12 to file +--| file_text_out.dat. The characters will be kept in +--| the line pointer l untill line feed character is +--| encouneterd. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputc ( CONSTANT c : IN character; + VARIABLE stream : OUT TEXT; + VARIABLE line_ptr : INOUT LINE + ) IS + + BEGIN + if ( (c = LF) or (c = CR) ) THEN + WRITELINE(stream, line_ptr); + DEALLOCATE(line_ptr); + else + write(line_ptr, c); + END IF; + RETURN; + END; + +--+----------------------------------------------------------------------------- +--| Function Name : fputs +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a string to an ASCII_ TEXT file. +--| +--| Parameters : +--| l_str -- input, string +--| stream -- output, ASCII_TEXT, +--| +--| Result : +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 256); +--| FILE out_file : ASCII_TEXT IS OUT "file_ascii_out.dat"; +--| +--| fputs(str_buf, out_file); +--| +--| Will write contents of str_buf to the file +--| file_ascii_out.dat +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputs ( CONSTANT l_str : IN STRING; + VARIABLE stream : OUT ASCII_TEXT + ) IS + VARIABLE str_copy : String (1 TO l_str'LENGTH) := l_str; + VARIABLE ch : character; + BEGIN + FOR i IN 1 TO l_str'LENGTH LOOP + ch := str_copy(i); + exit when (ch = NUL); + write (stream, ch); + END LOOP; + + write (stream, END_OF_LINE_MARKER(1)); + return; + + END fputs; + +--+----------------------------------------------------------------------------- +--| Function Name : fputs +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a string to a TEXT file. +--| +--| Parameters : +--| l_str -- input, string, +--| stream -- output, TEXT, +--| line_ptr -- INOUT LINE, +--| +--| Result : +--| +--| Note: : The STD TEXTIO package has declared TEXT as a +--| file of STRING. This is not same as file of CHARACTERS. +--| USE: : +--| VARIABLE str_buf : string(1 TO 256); +--| VARIABLE lptr : LINE; +--| FILE out_file : TEXT IS OUT "file_text_out.dat"; +--| +--| fputs(str_buf, out_file, lptr); +--| +--| Will write contents of str_buf to the file +--| file_text_out.dat +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputs ( CONSTANT l_str : IN STRING; + VARIABLE stream : OUT TEXT; + VARIABLE line_ptr : INOUT LINE + ) IS + + + BEGIN + FOR i IN l_str'RANGE LOOP + exit when (l_str(i)= NUL); + WRITE(line_ptr, l_str(i)); + END LOOP; + WRITELINE(stream, line_ptr); + DEALLOCATE(line_ptr); + RETURN; + END fputs; + +--+----------------------------------------------------------------------------- +--| Function Name : Find_Char +--| +--| Overloading : None +--| +--| Purpose : TO find a given character in a string and +--| return its position. +--| +--| Parameters : +--| l_str - input STRING, +--| c - input Character, +--| +--| Result : NATURAL number representing the position of character +--| in the string. returns 0 if character not found in the +--| string. +--| +--| USE: : +--| VARIABLE str14 : string(1 TO 14); +--| VARIABLE indx : integer; +--| +--| str14 :="This is a test"; +--| indx := Fid_Char(str14, 'i'); +--| +--| Will assign value of 3 to the variable indx. +--|----------------------------------------------------------------------------- + FUNCTION Find_Char ( CONSTANT l_str : IN STRING; + CONSTANT c : IN CHARACTER + ) RETURN NATURAL IS + VARIABLE result : NATURAL := 0; + VARIABLE index : INTEGER := 0; + VARIABLE lstr_cpy : STRING(1 TO l_str'LENGTH) := l_str; + BEGIN + While ( index < l_str'LENGTH) LOOP + index := index + 1; + IF (lstr_cpy(index) = NUL) THEN + EXIT; + END IF; + IF ( c = lstr_cpy(index)) THEN + result := index; + EXIT; + END IF; + END LOOP; + RETURN result; + END; +--+----------------------------------------------------------------------------- +--| Function Name : Sub_Char +--| +--| Overloading : None +--| +--| Purpose : To subtitute a new character at a given position +--| of the input string. +--| +--| Parameters : +--| l_str - input STRING, +--| c - input Character, +--| n - input Natural, position at which character +--| is to be substituted. +--| Result : STRING +--| +--| USE: : +--| VARIABLE str14 : string(1 TO 14); +--| VARIABLE indx : integer; +--| +--| str14 :="This is a test"; +--| IF ((indx = Find_Char(str14, 't')) /= 0) THEN +--| str14 := Sub_Char(str14, 'T', indx); +--| END IF; +--| +--| Will assign the value "This is a Test" to str14. +--|----------------------------------------------------------------------------- + FUNCTION Sub_Char ( CONSTANT l_str : IN STRING; + CONSTANT c : IN CHARACTER; + CONSTANT n : IN NATURAL + ) RETURN STRING IS + VARIABLE result : STRING(1 TO l_str'LENGTH) := l_str; + BEGIN + IF (n <= l_str'LENGTH) THEN + result(n) := c; + ELSE + ASSERT NOT WarningsOn + REPORT " Sub_Char --- n out of range " + SEVERITY WARNING; + END IF; + RETURN result; + END Sub_Char; + + + + + + + + + + + + + + + + + + + + + + + + +--+----------------------------------------------------------------------------- +--| Function Name : T_Machine +--| hidden +--| Overloading : None +--| +--| Purpose : Finite State automaton to recognise a time format. +--| format will be broken into field width, precision +--| and justification (left or right) and time_unit (tu); +--| +--| Parameters : fwidth -- output, INTEGER, field width +--| precision -- output, INTEGER, precison +--| justify -- OUTPUT, BIT +--| '0' right justified, +--| '1' left justified +--| t_unit -- output, STRING, time unit of +--| result +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : +--| +--| NOTE : +--| This procedure is +--| called in the function To_String. +--| +--| Use : +--| VARIABLE fmt : STRING(1 TO format'LENGTH) := format; +--| VARIABLE fw : INTEGER; +--| VARIABLE precis : INTEGER; +--| VARIABLE justfy : BIT; +--| VARIABLE tu : STRING(1 TO 2); +--| +--| T_Machine(fw, precis, justy,i tu, fmt); +--| +--|----------------------------------------------------------------------------- + + PROCEDURE T_Machine ( VARIABLE fwidth : OUT INTEGER; + VARIABLE precison : OUT INTEGER; + VARIABLE justify : OUT BIT; + VARIABLE t_unit : OUT time_unit_type; + CONSTANT format : IN STRING + ) IS + VARIABLE state : INT8 := 0; + VARIABLE fmt : STRING(1 TO format'LENGTH); + VARIABLE ch : CHARACTER; + VARIABLE index : INTEGER := 1; + VARIABLE fw : INTEGER := 0; + VARIABLE pr : INTEGER := -1; + VARIABLE tu : STRING(1 TO 3) := (others =>' '); + VARIABLE tu_indx : INTEGER := 0; + VARIABLE e_flag : boolean := false; + + BEGIN + fmt := To_Lower(format); + -- make sure first character is '%' if not error + ch := fmt(index); + IF (fmt(index) /= '%') THEN + ASSERT false + REPORT " Format Error --- first character of format " & + " is not '%' as expected." + SEVERITY ERROR; + return; + END IF; + justify := '0'; -- default is right justification + WHILE (state /= 3) LOOP + if (index < format'LENGTH) THEN + index := index + 1; + ch := fmt(index); + CASE state IS + WHEN 0 => IF (ch ='-') THEN + state := 1; -- justify + ELSIF (ch >= '0' AND ch <= '9') THEN -- to_digit + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 2; -- digits state + ELSIF (ch = 't') THEN + state := 3; -- end state + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = '%') THEN + state := 5; + ELSE + state := 6; -- error + END IF; + + WHEN 1 => justify := '1'; -- left justfy + IF (ch >= '0' AND ch <= '9') THEN -- to_digit + fw := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = '.') THEN + state := 4; + ELSIF (ch = 't') THEN + justify := '0'; -- %-t is equivalent to %t + state := 3; + ELSE + state := 6; -- error + END IF; + + WHEN 2 => -- digits-state + IF (ch >= '0' AND ch <= '9') THEN + fw := fw * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 2; + ELSIF (ch = 't') THEN + state := 3; + ELSIF (ch = '.') THEN + state := 4; + ELSE + state := 6; + END IF; + + WHEN 3 => -- t state + -- fromat successfully recognized, exit now. + EXIT; + + WHEN 4 => -- . state + IF (ch >= '0' AND ch <= '9') THEN -- to_digit + pr := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 7; + ELSE + state := 6; -- error + END IF; + + WHEN 5 => -- print % + EXIT; + + WHEN 6 => -- error state + -- print error message + ASSERT false + REPORT " Format Error --- expected %t format. " + SEVERITY ERROR; + EXIT; + + WHEN 7 => -- precision + IF (ch >= '0' AND ch <= '9') THEN + pr := pr * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); -- to_digit + state := 7; + ELSIF (ch = 't') THEN + state := 3; + ELSE + state := 6; -- error + END IF; + END CASE; + ELSE + assert false + report " Format Error: Observed =" & fmt &LF + & " Expected = %t unit (detected by T_Machine) " + severity ERROR; + e_flag := true; + exit; + END IF; + END LOOP; + + IF (Not e_flag) THEN + index := index + 1; + if (index < format'LENGTH) then + ch := fmt(index); + end if; + while ((index < format'LENGTH) AND Is_Space(ch)) LOOP + index := index + 1; + ch := fmt(index); + END LOOP; + + if (index < format'LENGTH) then + If (ch >='a' AND ch <='z') THEN + tu(1) := ch; + tu(2) := fmt(index + 1); + if (format'Length >= index + 2) then + tu(3) := fmt(index+2); + end if; + END IF; + end if; + -- this case statement decides the time unit. + CASE tu IS + WHEN "fs " => t_unit := t_fs; + WHEN "ps " => t_unit := t_ps; + WHEN "ns " => t_unit := t_ns; + WHEN "us " => t_unit := t_us; + WHEN "ms " => t_unit := t_ms; + WHEN "sec" => t_unit := t_sec; + WHEN "min" => t_unit := t_min; + WHEN "hr " => t_unit := t_hr; + WHEN OTHERS => ASSERT false + REPORT " Format error --- time unit is not specified " + & "correctly in the format string " + SEVERITY ERROR; + END CASE; + END IF; + -- decide field width (fwidth) + IF (fw > max_string_len) THEN + fwidth := max_string_len; + ELSE + fwidth := fw; + END IF; + -- decide precision + IF (pr = -1) THEN + precison := 6; -- use default precision + ELSE + precison := pr; + END IF; + RETURN; + END T_Machine; + +--+----------------------------------------------------------------------------- +--| Function Name : Default_Time +--| hidden +--| Overloading : None +--| + +--| Purpose : Convert 64 bit Time value to a String with +--| default length of 12. + + +--| +--| Parameters : +--| val - input, TIME, +--| +--| Result : STRING representation of TIME. +--| +--| NOTE : This function converts input time to an appropriate +--| time units such that it can be represented in a string +--| length 7 (xxx.xxx). Then 4 places for unit + +--| ( hr, min, sec, ms ps etc.) are needed and one more for + +--| sign ( -/+ ). IF time is positive then sign position is +--| left blank. This way this function will return a string +--| of length 12. +--| signXXX.XXX Unit ( sign takes one location and units 3). +--| +--| +--|----------------------------------------------------------------------------- + + + FUNCTION Default_Time ( CONSTANT val : IN TIME + ) RETURN STRING IS + VARIABLE tval : time; + VARIABLE ival : integer := 0; + VARIABLE fval : integer := 0; + VARIABLE same_unit : Boolean := false; + VARIABLE sign : character := ' '; + VARIABLE prefix : string(1 to 7) := " . "; + VARIABLE suffix : string(1 to 4) := " "; + VARIABLE digit : integer range 0 to 9; + type char10 is array (Integer range 0 to 9) of character; + CONSTANT lookup : char10 := ( '0','1','2','3','4','5','6','7','8','9'); + BEGIN + -- Handling sign + IF ( val < 0 ns ) THEN + sign := '-'; + tval := - val; + ELSE + sign := ' '; + tval := val; + END IF; + -- selecting proper unit dynamically + + -- check for 0 time (whether input time is 0 fs, 0 ps, 0 ns etc) + + -- it will be treated as 0 ns / 1000000 internally. We will provide default + -- time as 0.000 ns. + -- + IF (tval = 0 ns) then + ival := 0; + suffix := " ns "; + + ELSIF ( tval >= 1 hr ) then + ival := (tval / 1 min ); -- gives it in terms of 60's + -- of min + suffix := " hr "; + fval := (ival mod 60); + ival := (1000 * (ival/60)) + ( fval * 1000 / 60); + ELSIF ( tval >= 1 min ) then + ival := (tval / 1 sec); -- gives it in terms of 60's of sec + suffix := " min"; + fval := ival mod 60; + ival := (1000 * (ival/60)) + (fval * 1000 / 60); + + ELSIF ( tval >= 1 sec ) then + ival := tval / 1 ms; -- gives it in terms of 1000's of ms + suffix := " sec"; + ELSIF ( tval >= 1 ms ) then + ival := tval / 1 us; -- gives it in terms of 1000's of us + suffix := " ms "; + + + ELSIF (tval >= 1 us) then + ival := tval / 1 ns; -- gives it in terms of 1000s of ns + suffix := " us "; + + + ELSIF ( tval >= 1 ns) THEN + suffix := " ns "; + if ( (1 ns / 1000) = 0 ns ) then + ival := tval / (1 ns); + same_unit := TRUE; + else + ival := tval / (1 ns / 1000); -- gives it in terms of 1000s of 1 ns / 1000 + end if; + + + + ELSIF ( tval >= (1 ns / 1000) ) THEN + suffix := " ps "; + if ( (1 ns / 1000000) = 0 ns ) then + ival := tval / (1 ns / 1000); + same_unit := TRUE; + else + ival := tval / (1 ns / 1000000); -- gives it in terms of 1000s of 1 ns / 1000000 + end if; + + ELSIF ( tval >= (1 ns / 1000000) ) THEN + ival := tval / (1 ns / 1000000); + suffix := " fs "; + same_unit := TRUE; + END IF; + -- converting to XXX.XXX format + IF ( same_unit ) THEN + prefix(5 TO 7) := (OTHERS => '0'); + ELSE + FOR i IN 7 DOWNTO 5 LOOP + digit := ival mod 10; + ival := ival / 10; + prefix (i) := lookup(digit); + END LOOP; + END IF; + FOR i IN 3 DOWNTO 1 LOOP + digit := ival mod 10; + ival := ival / 10; + prefix (i) := lookup(digit); + END LOOP; + -- get rid of leading zero's + leading_zero_kill : FOR i IN 1 to 2 LOOP + exit leading_zero_kill WHEN (prefix(i) /= '0'); + IF (prefix(i) = '0') THEN + prefix (i) := ' '; + END IF; + END LOOP; + if (prefix(2) = ' ') then + return ( " " & sign & prefix(3 to 7) & suffix); + elsif (prefix(1) = ' ') then + return ( ' ' & sign & prefix(2 to 7) & suffix); + else + RETURN (sign & prefix & suffix); + end if; + END Default_Time; + +--+----------------------------------------------------------------------------- +--| Function Name : Time_String +--| hidden +--| Overloading : None +--| + +--| Purpose : Convert 64 bit Time value to a String based upon fs + +--| +--| Parameters : val - input, TIME positive val, +--| + +--| Result : A STRING of length 20 representing TIME. + +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION Time_String ( CONSTANT val : IN TIME ) RETURN STRING IS + + + CONSTANT buf_len : INTEGER := 20; + + TYPE t_to_int_type is array (1 to 6) of integer; + + VARIABLE t_to_int : t_to_int_type := (others => 0); + VARIABLE tbuf : STRING(1 to buf_len) := (others => '0'); + VARIABLE ival : integer; + VARIABLE tval : time := val; + VARIABLE i, index : integer; + VARIABLE min_str_index : integer; + VARIABLE time_unit : time; + VARIABLE min_time_unit : time; + VARIABLE start_int_ind : integer; + VARIABLE num, counter : integer; + + BEGIN + -- identify minimum time unit + min_time_unit := 1 ns / 1000000; + if ( min_time_unit > 0 ns ) then -- fs + start_int_ind := 1; + else + min_time_unit := 1 ns / 1000; + if ( min_time_unit > 0 ns ) then -- ps + start_int_ind := 2; + else -- ns + min_time_unit := 1 ns; + start_int_ind := 3; + end if; + end if; + + -- get minimum string index + min_str_index := 1; + + if (min_time_unit = (1 ns / 1000)) then + min_str_index := 4; + elsif (min_time_unit = 1 ns) then + min_str_index := 7; + end if; + + + -- get starting time_unit and starting integer array index + time_unit := min_time_unit; + for i in 1 to (((buf_len - min_str_index)/3)-1) loop + time_unit := time_unit * 1000; + start_int_ind := start_int_ind + 1; + end loop; + -- start_int_ind now is at the maximum value + + -- get integer equivalent + -- start with maximum time_unit and work down to minimum + i := start_int_ind; + while time_unit > 0 ns loop + t_to_int(i) := tval / time_unit; + tval := tval - t_to_int(i) * time_unit; + time_unit := time_unit/1000; + i := i - 1; + end loop; + index := i + 1; + + -- convert intpeger array to a string + i := buf_len - min_str_index + 1; + counter := 0; + while i > 0 loop + if (counter mod 3 = 0) and (index <= start_int_ind) then + num := t_to_int(index); + index := index + 1; + end if; + tbuf(i) := CHARACTER'VAL(CHARACTER'POS('0') + (num mod 10)); + num := num/10; + i := i - 1; + counter := counter + 1; + end loop; + return tbuf; + END Time_String; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a time. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Time +--| +--| NOTE : +--| +--| Use : +--| VARIABLE t : time ; +--| +--| t := From_String (" 893.56 ns"); +--| This statement will set t to time 893.56 ns. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN TIME IS + VARIABLE result : TIME; + VARIABLE fract_t : TIME; + VARIABLE state : INT8; + VARIABLE str_copy : STRING (1 TO str'LENGTH):= To_Upper(str); + VARIABLE index : Natural; + VARIABLE power : Natural := 0; + VARIABLE num : Integer := 0; + VARIABLE fract_num : Integer := 0; + VARIABLE ch : character; + VARIABLE neg_sign : boolean := false; + VARIABLE tu : string(1 To 3) := (OTHERS => ' '); + VARIABLE tu_indx : INTEGER := 0; + VARIABLE parse_err : BOOLEAN := FALSE; + + BEGIN + -- Check for null input + IF (str'LENGTH = 0) THEN + assert false + report " From_String --- input string has a null range " + severity ERROR; + RETURN TIME'LEFT; + END IF; + -- find the position of the first non_white character + index := Find_NonBlank(str_copy); + IF (index > str'length) THEN + assert false + report " From_String --- input string is empty "; + RETURN TIME'LEFT; + ELSIF (str_copy(index)=NUL) THEN + assert false + report " From_String -- first non_white character is a NUL "; + RETURN TIME'LEFT; + END IF; + ch := str_copy(index); + -- check for - sign or + sign + IF (ch = '-') Then + neg_sign := NOT neg_sign; + index := index + 1; + ch := str_copy(index); -- get_char + elsif (ch = '+') then + index := index + 1; + ch := str_copy(index); -- get_char + END IF; + + -- Strip off leading zero's + While ( (ch = '0') AND (index < str'LENGTH)) LOOP + index := index + 1; + ch := str_copy(index); -- get_char + END LOOP; + -- if all zero's make sure that final zero remains + if ( (NOT Is_Digit(ch)) and (index > 1) and (str_copy(index - 1) = '0') ) then + index := index - 1; + ch := str_copy(index); + end if; + WHILE (true) LOOP + CASE state IS + WHEN 0 => IF (ch >= '0' AND ch <= '9') THEN -- to_digit + num := CHARACTER'POS(ch) - CHARACTER'POS('0'); + state := 1; + ELSIF (ch = '.') THEN + state := 2; + ELSE + state := 4; -- error + END IF; + + WHEN 1 => -- + IF (ch >= '0' AND ch <= '9') THEN + num := num * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + state := 1; + ELSIF (ch = '.') THEN + state := 2; + ELSIF ((Is_White(ch)) OR (ch = NUL)) THEN + state := 3; + ELSE + state := 4; -- error + END IF; + + WHEN 2 => -- . state + IF (ch >= '0' AND ch <= '9') THEN + fract_num := fract_num * 10 + CHARACTER'POS(ch) + - CHARACTER'POS('0'); + power := power + 1; + state := 2; + + ELSIF ((Is_White(ch)) OR (ch = NUL)) THEN + state := 3; + ELSE + state := 6; -- error + END IF; + + WHEN 3 => -- space between time value and unit + IF ((Is_White(ch)) OR (ch=NUL)) THEN + state := 3; + ELSIF (ch >= 'A' AND ch <= 'Z') THEN + tu_indx := tu_indx + 1; + tu(tu_indx) := ch; + state := 5; + ELSE + state := 4; + END IF; + + WHEN 4 => -- error state + ASSERT false + REPORT " From_String --- invalid character encountered " + SEVERITY ERROR; + parse_err := TRUE; + EXIT; + + WHEN 5 => -- end state + IF ((ch >= 'A' AND ch <= 'Z') AND (tu_indx < 3)) THEN + tu_indx := tu_indx + 1; + tu(tu_indx) := ch; + state := 5; + ELSIF ( IS_White(ch) OR (tu_indx = 3) OR (ch=NUL)) THEN + exit; + ELSE + state := 4; + END IF; + WHEN OTHERS => ASSERT false + REPORT " From_String(time) --- time string in incorrect format" + SEVERITY ERROR; + parse_err := TRUE; + exit; + + END CASE; + index := index + 1; + EXIT when index > str'LENGTH; + ch := str_copy(index); + END LOOP; + + if (parse_err) then + return TIME'LEFT; + end if; + + IF (neg_sign) THEN + num := - num; + fract_num := - fract_num; + END IF; + -- this case statement decides the time unit. + CASE tu IS + + WHEN "FS " => + if (1 ns / 1000000) /= 0 ns then + fract_t := (fract_num * (1 ns / 1000000)) / (10 ** power); + result := (num * (1 ns / 1000000)) + fract_t; + else + if (1 ns / 1000) /= 0 ns then + result := num / 1000 * (1 ns / 1000); + else + result := num / 1000000 * 1 ns; + end if; + end if; + + + WHEN "PS " => + if ( 1 ns / 1000) /= 0 ns then + fract_t := (fract_num * (1 ns / 1000)) / (10 ** power); + result := (num * (1 ns / 1000)) + fract_t; + else + result := num / 1000 * 1 ns; + end if; + + WHEN "NS " => + fract_t := (fract_num * 1 NS) / (10 ** power); + result := (num * 1 NS) + fract_t; + WHEN "US " => + fract_t := (fract_num * 1 US) / (10 ** power); + + result := (num * 1 US) + fract_t; + + + WHEN "MS " => + fract_t := (fract_num * 1 MS) / (10 ** power); + result := (num * 1 MS) + fract_t; + + + WHEN "SEC" => + fract_t := (fract_num * 1 SEC) / (10 ** power); + result := (num * 1 SEC) + fract_t; + WHEN "MIN" => + fract_t := (fract_num * 1 MIN) / (10 ** power); + result := (num * 1 MIN) + fract_t; + WHEN "HR " => + fract_t := (fract_num * 1 HR) / (10 ** power); + result := (num * 1 HR) + fract_t; + + + WHEN OTHERS => + + ASSERT false + REPORT "From_String --- time base not specified or incorrectly specified" + SEVERITY ERROR; + + + return TIME'LEFT; + END CASE; + return result; + END From_String; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.7 +--| Overloading : None +--| +--| Purpose : Convert Time to a String. +--| +--| Parameters : +--| val - input, TIME, +--| +--| Result : STRING representation of TIME. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN TIME; + CONSTANT format : IN STRING := "" + ) RETURN STRING IS + + VARIABLE tbuf : STRING(max_string_len DOWNTO 1) ; -- implicitly == NUL + VARIABLE str_len : NATURAL; -- actual length of time string + VARIABLE rbuf : STRING(max_string_len DOWNTO 1); + VARIABLE result : string(1 TO max_string_len); + VARIABLE r_index : Natural := 0; + VARIABLE t_index : Natural := 0; + VARIABLE str_index : Natural := 0; + VARIABLE tval : TIME; + VARIABLE ival : INTEGER; + VARIABLE period_loc : NATURAL; + VARIABLE left_digits : NATURAL; + VARIABLE format_cpy : string(1 TO format'length) := format; + VARIABLE pr_actual : integer; -- actual precision + VARIABLE indx : integer; + VARIABLE fw : integer; -- field width + VARIABLE precis : integer; -- precision + VARIABLE justy : BIT := '0'; -- justification + VARIABLE tunit : time_unit_type; + VARIABLE suffix : STRING(1 TO 4); + VARIABLE neg_sign : BOOLEAN := false ; + BEGIN + + -- IF no format is specified then the result will be provided + -- in the dynamic default time unit. + IF (format = "") THEN + return(Default_Time(val)); + END IF; + -- handle sign + IF ( val < 0 ns ) THEN + neg_sign := NOT neg_sign; + tval := - val; + ELSE + tval := val; + END IF; + -- convert time to string without any format + -- by calling Time_String(). first determine the length + + str_index := 20; + + tbuf(str_index downto 1) := Time_String(tval); + + -- call procedure T-Machine to split format string into field width fw + -- precision, justification and desired time unit ( time unit in which + -- the result string is to be represented). + T_Machine(fw, precis, justy, tunit, format); + + -- determine the desired output time unit and insert the decimal point + -- at proper location in the string and save the result int rbuf. + CASE tunit is + + WHEN t_sec | t_min | t_hr => + period_loc := 16; + + rbuf(period_loc - 1 DOWNTO 1) := tbuf(period_loc -1 DOWNTO 1); + rbuf(period_loc) := '.'; + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + + suffix := " sec"; + + WHEN t_ms => + period_loc := 13; + + rbuf(period_loc - 1 DOWNTO 1) := tbuf(period_loc -1 DOWNTO 1); + rbuf(period_loc) := '.'; + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + + suffix := " ms "; + WHEN t_us => + period_loc := 10; + rbuf(period_loc - 1 DOWNTO 1) := tbuf(period_loc -1 DOWNTO 1); + rbuf(period_loc) := '.'; + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + suffix := " us "; + + WHEN t_ns => + period_loc := 7; + + rbuf(period_loc - 1 DOWNTO 1) := tbuf(period_loc -1 DOWNTO 1); + + rbuf(period_loc) := '.'; + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + suffix := " ns "; + + WHEN t_ps => + period_loc := 4; + + + rbuf(period_loc - 1 DOWNTO 1) := tbuf(period_loc -1 DOWNTO 1); + + rbuf(period_loc) := '.'; + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + + suffix := " ps "; + + WHEN t_fs => + period_loc := 1; + rbuf(period_loc) := '.'; + + rbuf(str_index + 1 DOWNTO period_loc + 1) := + tbuf(str_index DOWNTO period_loc); + + suffix := " fs "; + + WHEN OTHERS => null; + END CASE; + str_index := str_index + 1; -- to take care of decimal point + + -- kill leading zero's + Kill_ZERO : LOOP + EXIT Kill_ZERO WHEN (rbuf(str_index) /= '0'); + IF (rbuf(str_index) = '0') THEN + str_index := str_index - 1; + END IF; + END LOOP; + + -- keep one zero before the decimal point + IF (rbuf(str_index) = '.') THEN + str_index := str_index + 1; + rbuf(str_index) := '0'; + END IF; + + -- insert the negative sign if it exists + IF neg_sign THEN + str_index := str_index + 1; + rbuf(str_index) := '-'; + END IF; + + -- calculate the number of digits including negative sign in the + -- string to the left of decimal point + left_digits := str_index - period_loc; + IF (precis /= 0) THEN + str_len := left_digits + 1 + precis; + ELSE + str_len := left_digits; + END IF; + + -- copy rbuf to tbuf according to the desired format + -- first copy the precison part + -- check if precision > period_loc -1 + IF (precis > period_loc - 1) THEN + t_index := precis + 1; + FOR i IN period_loc downto 1 LOOP + tbuf(t_index) := rbuf(i); + t_index := t_index - 1; + END LOOP; + tbuf(t_index downto 1) := (OTHERS => '0'); + ELSIF (precis = period_loc - 1) THEN + tbuf(precis + 1 downto 1) := rbuf(period_loc downto 1); + ELSE -- copy as much portion you can + r_index := period_loc; + FOR i IN precis + 1 downto 1 LOOP + tbuf(i) := rbuf(r_index); + r_index := r_index - 1; + END LOOP; + END IF; + -- copy the part to the left of period + tbuf(str_len DOWNTO str_len - left_digits + 1) := + rbuf(str_index DOWNTO period_loc + 1); + + -- match the desired field width + -- ** was (fw > str_index) + IF (fw > str_len) THEN + case justy IS + WHEN '0' => -- right justification + tbuf(fw DOWNTO str_len + 1) := (OTHERS => ' '); + result( 1 TO fw) := tbuf(fw DOWNTO 1); + return (result(1 TO fw) & suffix); + WHEN '1' => + result( 1 TO str_len) := tbuf(str_len DOWNTO 1); + result(str_len + 1 TO str_len + 4) := suffix; + indx := str_len + 4; + for i IN fw - str_len DOWNTO 1 LOOP + indx := indx + 1; + result(indx) := ' '; + end LOOP; + return result(1 TO indx); + WHEN OTHERS => -- left justification + ASSERT NOT WarningsOn + report " To_String --- error in justification " + SEVERITY WARNING; + result(1 TO str_len) := tbuf(str_len DOWNTO 1); + return (result(1 TO str_len) & suffix); + end case; + ELSE -- fw is lessthan or equal to std_len + result(1 TO str_len) := tbuf(str_len DOWNTO 1); + return (result(1 TO str_len) & suffix); + END IF; + -- That's all + END To_String; +-- +-- end of the std_iopak body +END std_iopak; diff --git a/src/hdl/pkg/iopakp.vhd b/src/hdl/pkg/iopakp.vhd new file mode 100644 index 0000000..9542fde --- /dev/null +++ b/src/hdl/pkg/iopakp.vhd @@ -0,0 +1,2596 @@ +-- ---------------------------------------------------------------------------- +-- +-- Copyright (c) Mentor Graphics Corporation, 1982-1996, All Rights Reserved. +-- UNPUBLISHED, LICENSED SOFTWARE. +-- CONFIDENTIAL AND PROPRIETARY INFORMATION WHICH IS THE +-- PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS. +-- +-- +-- PackageName : std_iopak +-- Title : Package for STD_IOPAK +-- Purpose : This package contains additional support for +-- : performing text IO. +-- : +-- Comments : +-- : +-- Assumptions : none +-- Limitations : none +-- Known Errors: none +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- Mentor Graphics Corporation owns the sole copyright to this software. +-- Under International Copyright laws you (1) may not make a copy of this +-- software except for the purposes of maintaining a single archive copy, +-- (2) may not derive works herefrom, (3) may not distribute this work to +-- others. These rights are provided for information clarification, +-- other restrictions of rights may apply as well. +-- +-- This is an "Unpublished" work. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> License NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- This software is further protected by specific source code and/or +-- object code licenses provided by Mentor Graphics Corporation. Use of this +-- software other than as provided in the licensing agreement constitues +-- an infringement. No modification or waiver of any right(s) shall be +-- given other than by the written authorization of an officer of The +-- Mentor Graphics Corporation. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>> Proprietary Information <<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- This source code contains proprietary information of Mentor Graphics +-- Corporation and shall not be disclosed other than as provided in the software +-- licensing agreement. +-- ---------------------------------------------------------------------------- +-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Warrantee <<<<<<<<<<<<<<<<<<<<<<<<<<<< +-- ---------------------------------------------------------------------------- +-- Mentor Graphics Corporation MAKES NO WARRANTY OF ANY KIND WITH REGARD TO +-- THE USE OF THIS SOFTWARE, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS +-- FOR A PARTICULAR PURPOSE. +-- ---------------------------------------------------------------------------- +-- Modification History : +-- ---------------------------------------------------------------------------- +-- Version No: | Author: | Mod. Date: | Changes Made: +-- v1.000 | M.K.Dhodhi | 10/26/91 | Production Release +-- v1.100 | M.K.Dhodhi | 11/19/91 | Compatible w/ vantage 3.650 Release +-- v1.110 | wdb | 01/27/92 | compatible w/Intermetrics +-- v1.111 | M.K.Dhodhi | 02/13/92 | fixing bug in T0_String input time +-- | fixing comment in SOX_Machine +-- v1.111 | M.K.Dhodhi | 03/06/92 | production release +-- v1.200 | M.K.Dhodhi | 04/21/92 | stand alone version +-- v1.300 | M.K.Dhodhi | 08/03/92 | production release +-- v1.140 | M.K.Dhodhi | 11/05/92 | fixing real 0.0 case for To_String +-- | | and an extra loop in default time. +-- v1.150 | M.K.Dhodhi | 11/17/92 | extending fscan upto 20 arguments. +-- | fixing default 0 time. +-- v1.160 | M.K.Dhodhi | 02/11/93 | Fixing Find_char +-- v1.700 B | W.R. Migatz | 05/03/93 | Beta release - changes to all f routines (not fprint) +-- | modified str*cpy and str*cmp +-- | fixed memory leak +-- v1.700 | W.R. Migatz | 05/25/93 | production release - change to fscan with %t to allow time unit +-- v1.800 | W.R. Migatz | 07/28/93 | combining into 1 file, mentor support, and From_String(time) bug fix +-- v2.000 | W.R. Migatz | 07/21/94 | production release - fix bug in fprint, fs ps ns timing changes +-- v2.100 | W.R. Migatz | 01/10/96 | production release +-- | Initialization banner removed +-- v2.110 | W.R. Migatz | 04/02/96 | Fixed Find_Char and To_String(TIME) bugs +-- | Find_char did not stop at a NUL character +-- | To_String(TIME) did not handle a precision of 0 +-- v2.2 | B. Caslis | 07/25/96 | Updated for Mentor Graphics Release +-- ---------------------------------------------------------------------------- + +Library ieee; +Use ieee.std_logic_1164.all; -- Reference the STD_Logic system +Use STD.TEXTIO.all; + +PACKAGE std_iopak is + + -- ************************************************************************ + -- Display Banner + -- ************************************************************************ + CONSTANT StdIOpakBanner : BOOLEAN; + + + + TYPE ASCII_TEXT IS file of CHARACTER; + + TYPE time_unit_type is (t_fs, t_ps, t_ns, t_us, t_ms, t_sec, t_min, t_hr); + + CONSTANT max_token_len : INTEGER := 32; + CONSTANT max_string_len : INTEGER := 256; + CONSTANT END_OF_LINE_MARKER : STRING(1 TO 2); + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a boolean. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : A boolean true or false. +--| +--| NOTE : +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 5) := " TRUE"; +--| VARIABLE good : BOOLEAN +--| +--| good := From_String (s_flag); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN boolean; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a bit. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : bit. +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_val : bit; +--| +--| b_val := From_String (" 100"); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN bit; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a Severity_Level. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Severity_Level +--| +--| NOTE : +--| +--| Use : +--| VARIABLE str10 : String(1 TO 10) := " WARNING"; +--| VARIABLE sev : severity_level; +--| +--| sev := From_String (str10); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN severity_level; +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a character. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Character +--| +--| NOTE : +--| +--| Use : +--| VARIABLE str10 : String(1 TO 10) := "WARNING "; +--| VARIABLE ch : character; +--| +--| ch := From_String (str10); +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN character; +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an Integer. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Integer +--| +--| NOTE : +--| +--| Use : +--| VARIABLE n : Integer; +--| +--| n := From_String ("32 56"); +--| This statement will set n to integer 32. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN INTEGER; +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a real. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : real value +--| +--| NOTE : +--| +--| Use : +--| VARIABLE n : real ; +--| +--| n := From_String (" -354.78"); +--| This statement will set n to real value -354.78. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN REAL; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_ulogic. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_ulogic +--| +--| NOTE : +--| +--| Use : +--| VARIABLE u_val : std_ulogic ; +--| +--| u_val := From_String (" 100"); +--| This statement will set u_val equal to the value '1'. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_ulogic; +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_ulogic_vector. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_ulogic_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE u_vector : std_ulogic_vector( 7 DOWNTO 0) ; +--| +--| u_vector := From_String (" 0-ZU1010 1010"); +--| This statement will set u_vector equal to "0-ZU1010". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_ulogic_vector; + +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to an std_logic_vector. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : std_logic_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE logic_vect : std_logic_vector( 7 DOWNTO 0) ; +--| +--| logic_vect := From_String (" 0-ZU1010 1010"); +--| This statement will set logic_vect equal to "0-ZU1010". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN std_logic_vector; + +--+----------------------------------------------------------------------------- +--| Function Name : From_BinString +--| +--| Overloading : None +--| +--| Purpose : Convert from a Binary String to a bit_vector. +--| +--| Parameters : +--| str - input , binary string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 7 DOWNTO 0) ; +--| +--| b_vect := From_BinString (" 01101111 1010"); +--| This statement will set b_vect equal to "01101111". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_BinString ( CONSTANT str : IN STRING + ) RETURN bit_vector; +--+----------------------------------------------------------------------------- +--| Function Name : From_OctString +--| +--| Overloading : None +--| +--| Purpose : Convert from an Octal String to a bit_vector. +--| +--| Parameters : +--| str - input , Octal string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 15 DOWNTO 4) ; +--| +--| b_vect := From_OctString (" 1735 1010"); +--| This statement will set b_vect equal to "001111011101". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_OctString ( CONSTANT str : IN STRING + ) RETURN bit_vector; +--+----------------------------------------------------------------------------- +--| Function Name : From_HexString +--| +--| Overloading : None +--| +--| Purpose : Convert from a Hex String to a bit_vector. +--| +--| Parameters : +--| str - input , Hex string to be converted, +--| +--| Result : bit_vector +--| +--| NOTE : +--| +--| Use : +--| VARIABLE b_vect : bit_vector( 15 DOWNTO 4) ; +--| +--| b_vect := From_HexString (" 3DD 1010"); +--| This statement will set b_vect equal to "001111011101". +--| +--|----------------------------------------------------------------------------- + FUNCTION From_HexString ( CONSTANT str : IN STRING + ) RETURN bit_vector; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.1 +--| Overloading : None +--| +--| Purpose : Convert a boolean to a String. +--| +--| Parameters : +--| val - input value, BOOLEAN, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a boolean. +--| +--| NOTE : +--| Default is right justified +--| +--| Use : +--| VARIABLE s_flag : String(1 TO 5); +--| VARIABLE good : BOOLEAN := TRUE; +--| +--| s_flag := To_String ( good, "%5s" ); +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BOOLEAN; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.2 +--| Overloading : None +--| +--| Purpose : Convert a bit Value to a String. +--| +--| Parameters : +--| val - input bit. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a bit. +--| +--| +--| Use : +--| VARIABLE bit_string : String(1 TO 5); +--| +--| bit_string := To_String ( '1', "%1s"); +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BIT; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.3 +--| Overloading : None +--| +--| Purpose : Convert a Character to a String. +--| +--| Parameters : +--| val - input character. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Note : This function allows to see the non-printable characters. +--| +--| Result : STRING representation of a character. +--| +--| +--| Use : +--| VARIABLE ascii_char : String(1 TO 5); +--| +--| ascii_char := To_String ( d, "%3s"); +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN CHARACTER; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.4 +--| Overloading : None +--| +--| Purpose : Convert a severity-level to a string. +--| +--| Parameters : +--| val - input severity-level. +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a severity-level. +--| +--| Use : +--| VARIABLE s_level : String(1 TO 7); +--| VARIABLE message : SEVERITY_LEVEL := NOTE; +--| +--| s_level := To_String (message, "%7s"); +--|------------------------------------------------------------------ + FUNCTION To_String ( CONSTANT val : IN SEVERITY_LEVEL; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.5 +--| Overloading : None +--| +--| Purpose : Convert an integer into a String according +--| format specification. +--| +--| Parameters : +--| val - input value, INTEGER, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of an integer. +--| +--| NOTE : Format string has same meaning a in C language. +--| That if format is "%d " will convert an integer to +--| a string of length equal to number of digits in the +--| given inetger argument. While "%10d " return +--| a string of length 10 and if the number of digits +--| in the integer are less than 10 it will pad the +--| string with blank on the left because default +--| justification is right. if number of digits are +--| larger than 10 it will return 10 leftmost digits. +--| +--| +--| +--| USE : +--| VARIABLE str : STRING(1 TO 10); +--| VARIABLE val : INTEGER := 2750; +--| +--| str := TO_String(val, "%10d"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN INTEGER; + CONSTANT format : IN STRING := "%d" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.6 +--| Overloading : None +--| +--| Purpose : Convert a real number to a String. +--| +--| Parameters : +--| val - input value, REAL, +--| format - input STRING, provides the +--| conversion specifications. +--| +--| Result : STRING representation of a real number. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 10); +--| VARIABLE val : REAL := 67.560 +--| +--| str := TO_String(val, "%10.3f"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN REAL; + CONSTANT format : IN STRING :="%f" + ) RETURN STRING; + +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.8 +--| Overloading : None +--| +--| Purpose : Convert a bit_vector to a String. +--| +--| Parameters : +--| val - input, BIT_VECTOR, +--| +--| Result : STRING representation of a bit_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : BIT_VECTOR (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN BIT_VECTOR; + CONSTANT format : IN STRING :="%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.10.2 +--| Overloading : None +--| +--| Purpose : Convert an std_ulogic to a String. +--| +--| Parameters : +--| val - input std_ulogic. +--| +--| Result : STRING representation of std_ulogic. +--| +--| Use : +--| VARIABLE str_ovf : STRING(1 TO 4); +--| VARIABLE overflow : std_ulogic; +--| +--| str_ovf := TO_String(vect, "%4s"), +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_ulogic; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| +--| Overloading : None +--| +--| Purpose : Convert an std_logic_vector to a String. +--| +--| Parameters : +--| val - input std_logic_vector. +--| +--| Result : STRING representation of std_logic_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : std_logic_vector (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_logic_vector; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| +--| Overloading : None +--| +--| Purpose : Convert an std_ulogic_vector to a String. +--| +--| Parameters : +--| val - input std_ulogic_vector. +--| +--| Result : STRING representation of std_ulogic_vector. +--| +--| USE : +--| VARIABLE str : STRING(1 TO 16); +--| VARIABLE vect : std_ulogic_vector (7 DOWNTO 0); +--| +--| str := TO_String(vect, "%16s"), +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN std_ulogic_vector; + CONSTANT format : IN STRING := "%s" + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Alpha +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a letter of the alphabet. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a letter of the +--| alphabet, false otherwise. +--| +--| +--| Use : +--| +--| See Also : Is_Digit, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Alpha ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Upper +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is an upper case letter. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is an upper case letter of +--| the alphabet, false otherwise. +--| +--| +--| See Also : Is_Digit, Is_Alpha, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Upper ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a lower case letter. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a lower case letter of +--| the alphabet, false otherwise. +--| +--| +--| See Also : Is_Digit, Is_Upper, Is_Alpha +--|----------------------------------------------------------------------------- + FUNCTION Is_Lower ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Digit +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a digit 0-9. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a digit, false +--| otherwise. +--| +--| +--| See Also : Is_Alpha, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION Is_Digit ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN; +--+----------------------------------------------------------------------------- +--| Function Name : Is_Space +--| 1. +--| Overloading : None +--| +--| Purpose : Test whether a character is a blank, tab or newline. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : True if the argument c is a blank or tab(HT), +--| false otherwise. +--| +--| +--| See Also : Is_Digit, Is_Upper, Is_Lower, Is_Alpha +--|----------------------------------------------------------------------------- + FUNCTION Is_Space ( CONSTANT c : IN CHARACTER + ) RETURN BOOLEAN; +--+----------------------------------------------------------------------------- +--| Function Name : To_Upper +--| 1. +--| Overloading : None +--| +--| Purpose :Convert a character to upper case. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : Character converted to upper case. +--| +--| +--| See Also : To_Lower, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Upper ( CONSTANT c : IN CHARACTER + ) RETURN CHARACTER; +--+----------------------------------------------------------------------------- +--| Function Name : To_Upper +--| 1. +--| Overloading : None +--| +--| Purpose :Convert a string to upper case. +--| +--| Parameters : +--| val - input, string to be converted +--| +--| Result : string . +--| +--| +--| See Also : To_Lower, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Upper ( CONSTANT val : IN String + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : To_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Convert a Character to lower case. +--| +--| Parameters : +--| c - input Character. +--| +--| Result : Character converted to lower case. +--| +--| See Also : To_Upper, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Lower ( CONSTANT c : IN CHARACTER + ) RETURN CHARACTER; +--+----------------------------------------------------------------------------- +--| Function Name : To_Lower +--| 1. +--| Overloading : None +--| +--| Purpose : Convert a String to lower case. +--| +--| Parameters : +--| val - input string to be converted. +--| +--| Result : string +--| +--| See Also : To_Upper, Is_Upper, Is_Lower +--|----------------------------------------------------------------------------- + FUNCTION To_Lower ( CONSTANT val : IN STRING + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : StrCat +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Concatenate two string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Concatenated string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrCat ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : StrNCat +--| 1.2.2 +--| Overloading : None +--| +--| Purpose : Concatenate upto n characters of r_string to l_string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Concatenated string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNCat ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : INTEGER + ) RETURN STRING; +--+----------------------------------------------------------------------------- +--| Function Name : StrCpy +--| 1.2.3 +--| Overloading : None +--| +--| Purpose : Copy r_string to l_string. +--| +--| Parameters : +--| l_str - output, STRING, target string +--| r_str - input, STRING, source string +--| +--| Result : +--| +--| NOTE : If the length of target string is greater than +--| the source string, then target string is padded +--| with space characters on the right side and when +--| the length of target string is shorter than the +--| length of source string only left most characters +--| of the source string will be be copied to the target. +--| +--| +--| USE : +--| Variable s1: string(1 TO 8); +--| +--| StrCpy(s1, "123456789A"); +--| s1 will hold "12345678" +--|----------------------------------------------------------------------------- + PROCEDURE StrCpy ( VARIABLE l_str : OUT STRING; + CONSTANT r_str : IN STRING + ); +--+----------------------------------------------------------------------------- +--| Function Name : StrNCpy +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy at most n characters of r_string to l_string. +--| +--| Parameters : +--| l_str - output, STRING, target +--| r_str - input, STRING, source +--| n - input, Natural, number of characters to +--| to be copied. +--| +--| Result : l_string holds the result. +--| +--| NOTE : If n is less than or equal to zero then a srting +--| filled with blanks is returned. +--| +--| +--|----------------------------------------------------------------------------- + PROCEDURE StrNCpy ( VARIABLE l_str : OUT STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : IN NATURAL + ); +--+----------------------------------------------------------------------------- +--| Function Name : StrCmp +--| +--| Overloading : None +--| +--| Purpose : Compare left input string to right input string. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : INTEGER, returns an integer less than 0 if the left string +--| is less than the right string, returns integer 0 if the +--| the string are equal and returns an integer greater than +--| 0 if the left string is greater than the right string. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION StrCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN INTEGER; +--+----------------------------------------------------------------------------- +--| Function Name : StrNCmp +--| +--| Overloading : None +--| +--| Purpose : Compare at most n characters of left input string +--| to right input string. Returns an Integer. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| n - input, Natural, +--| +--| Result : Returns an integer less than 0 if left_most n +--| characters of the left string is less than the +--| right string, returns integer 0 if both strings +--| are equal, and returns an integer greater than 0 +--| if the left string is greater than the right string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING; + CONSTANT n : IN Natural + ) RETURN INTEGER; +--+----------------------------------------------------------------------------- +--| Function Name : StrNcCmp +--| +--| Overloading : None +--| +--| Purpose : Compare to strings and determine whether left input +--| string is less than, equal to or greater than right +--| input string. The comparison is Not case sensitive. +--| +--| Parameters : +--| l_str - input, STRING, +--| r_str - input, STRING, +--| +--| Result : Returns an integer less than 0 if left_most n +--| characters of the left string is less than the +--| right string, returns integer 0 if both strings +--| are equal, and returns an integer greater than 0 +--| if the left string is greater than the right string. +--| +--|----------------------------------------------------------------------------- + FUNCTION StrNcCmp ( CONSTANT l_str : IN STRING; + CONSTANT r_str : IN STRING + ) RETURN INTEGER; +--+----------------------------------------------------------------------------- +--| Function Name : StrLen +--| +--| Overloading : None +--| +--| Purpose : Returns length of a string. +--| +--| Parameters : +--| l_str - input, STRING, +--| +--| Result : Natural +--| +--| NOTE : +--| This is in fact same as String'LENGTH provided +--| by VHDL. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION StrLen ( CONSTANT l_str : IN STRING + ) RETURN NATURAL; + +--+----------------------------------------------------------------------------- +--| Function Name :Copyfile +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy one ASCII_TEXT file to an other ASCII_TEXT file. +--| +--| Parameters : +--| in_fptr -- input, ASCII_TEXT, source file +--| out_fptr -- output, ASCII_TEXT, destination file +--| +--| NOTE : +--| +--| USE : +--| file romdata : ASCII_TEXT IS IN "NEW_ROM.dat"; +--| file dest_file : ASCII_TEXT IS OUT "SAVE_ROM.dat"; +--| +--| Copyfile(romdata, dest_file); +--|----------------------------------------------------------------------------- + PROCEDURE Copyfile ( VARIABLE in_fptr : IN ASCII_TEXT; + VARIABLE out_fptr : OUT ASCII_TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name :Copyfile +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : Copy one TEXT file to an other TEXT file. +--| +--| Parameters : +--| in_fptr -- input, TEXT, +--| out_fptr -- output, TEXT +--| +--| NOTE : +--| This is combination of READLINE() and WRITELINE() +--| procedures provided in the standard +--| TEXTIO package. +--| +--| USE : +--| file in_f : TEXT IS IN "data_in"; +--| file out_f : TEXT IS OUT "save_data"; +--| +--| Copyfile(in_f, out_f); +--|----------------------------------------------------------------------------- + PROCEDURE Copyfile ( VARIABLE in_fptr : IN TEXT; + VARIABLE out_fptr : OUT TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Convert up to 10 arguments to a file according to +--| the format specifications give by a format string. +--| +--| Parameters : +--| file_ptr - output ASCII_TEXT, destination file +--| format - input STRING, format control specifications. +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : formated TEXT. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE file_ptr : OUT ASCII_TEXT; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := ""; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := ""; + CONSTANT arg10 : IN STRING := "" + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.1 +--| Overloading : None +--| +--| Purpose : Print up to 10 arguments to a file according to +--| the specifications given by a format string. +--| +--| Parameters : +--| file_ptr - output TEXT, destination file +--| line_ptr - INOUT LINE, pointer to a string. +--| format - input STRING, format control specifications. +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : formated TEXT. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE file_ptr : OUT TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := ""; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := ""; + CONSTANT arg10 : IN STRING := "" + ); +--+----------------------------------------------------------------------------- +--| Function Name : fprint +--| 1.2.2 +--| Overloading : None +--| +--| Purpose : Print up to 10 arguments to a string buffer according to +--| the specifications given by a format string. +--| +--| Parameters : +--| string_buf - output STRING, +--| format - input STRING +--| arg1 - input STRING, +--| arg2 - input STRING, +--| arg3 - input STRING, +--| arg4 - input STRING, +--| arg5 - input STRING, +--| arg6 - input STRING, +--| arg7 - input STRING, +--| arg8 - input STRING, +--| arg9 - input STRING, +--| arg10 - input STRING +--| +--| Result : STRING representation of arguments. +--| +--| Note: This procedure provides formated output +--| of upto 10 arguments. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fprint ( VARIABLE string_buf : OUT STRING; + CONSTANT format : IN STRING; + CONSTANT arg1 : IN STRING := ""; + CONSTANT arg2 : IN STRING := ""; + CONSTANT arg3 : IN STRING := ""; + CONSTANT arg4 : IN STRING := ""; + CONSTANT arg5 : IN STRING := ""; + CONSTANT arg6 : IN STRING := ""; + CONSTANT arg7 : IN STRING := ""; + CONSTANT arg8 : IN STRING := ""; + CONSTANT arg9 : IN STRING := ""; + CONSTANT arg10 : IN STRING := "" + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| +--| Overloading : None +--| +--| Purpose : To read text from a file according to specifications +--| given by a format string and save the results into +--| the corresponding arguments. +--| +--| Parameters : +--| file_ptr - input ASCII_TEXT, input file +--| format - input STRING, format control specifications. +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg19 - output STRING, +--| arg20 - output STRING, +--| arg_count - number of arguments passed to fscan +--| +--| Result : STRING representation of given text. +--| +--| +--| Note: This procedure extracts upto twenty arguments +--| from a line in a file. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING + ); +--|----------------------------------------------------------------------------- + + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING + ); +--|----------------------------------------------------------------------------- + + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING + ); +--|----------------------------------------------------------------------------- + + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN ASCII_TEXT; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| 1.2.3 +--| Overloading : None +--| +--| Purpose : To read text from a file according to specifications +--| given by the format string and save the results into +--| the corresponding arguments. +--| +--| Parameters : +--| file_ptr - input TEXT, +--| line_ptr - input_output LINE, +--| format - input STRING, +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg19 - output STRING, +--| arg20 - output STRING, +--| arg_count - input INTEGER +--| +--| Result : STRING representation of given text. +--| +--| Algorithm : +--| Read a line from the file into variable l ( which is aline). +--| split the format string into small tokens consisting of +--| printable characters and control format. +--| depending on control format read from l. Read an other line +--| from the file when length of l has become zero. and format +--| +--| +--| Note: This procedure extracts upto twenty arguments +--| from a line in a file. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( VARIABLE file_ptr : IN TEXT; + VARIABLE line_ptr : INOUT LINE; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fscan +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read text from a string buffer according to +--| specifications given by a format string and save +--| the result into corresponding arguments. +--| +--| Parameters : +--| string_buf - input String, +--| format - input STRING, +--| arg1 - output STRING, +--| arg2 - output STRING, +--| arg3 - output STRING, +--| arg4 - output STRING, +--| arg5 - output STRING, +--| arg6 - output STRING, +--| arg7 - output STRING, +--| arg8 - output STRING, +--| arg9 - output STRING, +--| arg10 - output STRING +--| arg11 - output STRING, +--| arg12 - output STRING, +--| arg13 - output STRING, +--| arg14 - output STRING, +--| arg15 - output STRING, +--| arg16 - output STRING, +--| arg17 - output STRING, +--| arg18 - output STRING, +--| arg19 - output STRING, +--| arg20 - output STRING, +--| arg_count - input INTEGER - the number of arguments passed to fscan +--| +--| Result : STRING representation given TEXT. +--| +--| Note: This procedure extracts upto twenty arguments +--| from a string buffer. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING; + VARIABLE arg20 : OUT STRING; + CONSTANT arg_count : IN INTEGER := 20 + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING; + VARIABLE arg19 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING; + VARIABLE arg18 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING; + VARIABLE arg17 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING; + VARIABLE arg16 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING; + VARIABLE arg15 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING; + VARIABLE arg14 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING; + VARIABLE arg13 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING; + VARIABLE arg12 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING; + VARIABLE arg11 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING; + VARIABLE arg2 : OUT STRING; + VARIABLE arg3 : OUT STRING; + VARIABLE arg4 : OUT STRING; + VARIABLE arg5 : OUT STRING; + VARIABLE arg6 : OUT STRING; + VARIABLE arg7 : OUT STRING; + VARIABLE arg8 : OUT STRING; + VARIABLE arg9 : OUT STRING; + VARIABLE arg10 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING ; + VARIABLE arg9 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING ; + VARIABLE arg8 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING ; + VARIABLE arg7 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING ; + VARIABLE arg6 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING ; + VARIABLE arg5 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING ; + VARIABLE arg4 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING ; + VARIABLE arg3 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING ; + VARIABLE arg2 : OUT STRING + ); +--|----------------------------------------------------------------------------- + PROCEDURE fscan ( CONSTANT string_buf : IN STRING; + CONSTANT format : IN STRING; + VARIABLE arg1 : OUT STRING + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fgetc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read the next character from a file of type +--| ASCII_TEXT. +--| +--| Parameters : +--| stream - input ASCII_TEXT, +--| +--| Result : Returns the ordinate value of the character read. If +--| end of file is reached then return - 1 +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE n : Integer; +--| FILE f_in : ASCII_TEXT IS IN "design.doc"; +--| +--| fgetc(n, f_in); +--| +--| Will return ordinal value of character in integer n +--|----------------------------------------------------------------------------- + PROCEDURE fgetc ( VARIABLE result : OUT INTEGER; + VARIABLE stream : IN ASCII_TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fgetc +--| +--| Overloading : None +--| +--| Purpose : To read the next character from a file of type TEXT. +--| +--| Parameters : +--| stream - input TEXT, +--| ptr - INOUT, LINE +--| Result :Integer, the ordinate value of the character being read. +--| -1 when end of file (EOF). +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| +--| USE: : +--| VARIABLE n : Integer; +--| FILE f_in : TEXT IS IN "design.doc"; +--| +--| fgetc(n, f_in); +--| +--| Will return ordinal value of character in integer n +--|----------------------------------------------------------------------------- + PROCEDURE fgetc ( VARIABLE result : OUT INTEGER; + VARIABLE stream : IN TEXT; + VARIABLE ptr : INOUT LINE + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fgets +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read, at most, the next n characters from a file +--| of type ASCII_TEXT and save them to a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| +--| n -- input, Natural, number of +--| characters to be read. +--| stream -- input, ASCII_TEXT, input file. +--| +--| result : string +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 100); +--| FILE f_in : ASCII_TEXT IS IN "design.doc"; +--| +--| fgets(str_buf, 50, f_in); +--| +--| Will read in at most 50 characters from the file +--| design.doc and place them in str_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgets ( VARIABLE l_str : OUT STRING; + CONSTANT n : IN NATURAL; + VARIABLE stream : IN ASCII_TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fgets +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To read, at most, the next n characters from a file +--| of type TEXT and save them to a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| n -- input, Natural, number of +--| characters to be read. +--| stream -- input, TEXT, input file. +--| line_ptr -- inout LINE, +--| +--| result : string +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 100); +--| FILE f_in : TEXT IS IN "design.doc"; +--| +--| fgets(str_buf, 50, f_in); +--| +--| Will read in at most 50 characters from the file +--| design.doc and place them in str_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgets ( VARIABLE l_str : OUT STRING; + CONSTANT n : IN NATURAL; + VARIABLE stream : IN TEXT; + VARIABLE line_ptr : INOUT LINE + ); + +--+--------------------------------------------------------------------------- +--| Function Name : fgetline +--| +--| Overloading : None +--| +--| Purpose : To read a line from the input ASCII_TEXT file and +--| save into a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| stream -- input, ASCII_TEXT, input file +--| +--| result : string. +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE line_buf : string(1 TO 256); +--| FILE in_file : ASCII_TEXT IS IN "file_ascii_in.dat"; +--| +--| fgetline(line_buf, in_file); +--| +--| Will read a line from the file +--| file_ascii_in.dat and place into line_buf. +--|----------------------------------------------------------------------------- + PROCEDURE fgetline ( VARIABLE l_str : OUT STRING; + VARIABLE stream : IN ASCII_TEXT + ); + +--+--------------------------------------------------------------------------- +--| Function Name : fgetline +--| +--| Overloading : None +--| +--| Purpose : To read a line from the input TEXT file and +--| save into a string. +--| +--| Parameters : +--| l_str -- output, STRING, +--| stream -- input, TEXT, input file +--| +--| result : string. +--| +--| Note: : The TEXT is defined in the package TEXTIO to be +--| a file of string. +--| USE: : +--| VARIABLE line_buf : string(1 TO 256); +--| FILE in_file : TEXT IS IN "file_text_in.dat"; +--| +--| fgetline(line_buf, in_file); +--| +--| Will read a line from the file +--| file_text_in.dat and place into line_buf. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fgetline ( VARIABLE l_str : OUT STRING; + VARIABLE stream : IN TEXT; + VARIABLE line_ptr : INOUT LINE + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fputc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose :To write a character to an ASCII_TEXT file. +--| +--| Parameters : +--| c -- input, CHARACTER, +--| stream -- output ASCII_TEXT, +--| +--| Result : +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| This procedure is equivalent to VHDL WRITE(stream, c). +--| +--| USE: : +--| VARIABLE str12 : string(1 TO 12); +--| FILE out_file : ASCII_TEXT IS OUT "file_ascii_out.dat"; +--| +--| str12 := "0123456789ab"; +--| FOR i IN 1 TO 12 LOOP +--| fputc(str12(i), out_file); +--| END LOOP; +--| +--| Will write all the 12 characters to file +--| file_ascii_out.dat +--|----------------------------------------------------------------------------- + PROCEDURE fputc ( CONSTANT c : IN CHARACTER; + VARIABLE stream : OUT ASCII_TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fputc +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a character to a TEXT file. +--| +--| Parameters : +--| c -- input, CHARACTER, +--| stream -- output, TEXT, +--| line_ptr -- INOUT LINE +--| +--| Result : +--| +--| Note: : The STD TEXTIO package has declared TEXT as a +--| file of STRING. This is not same as file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str12 : string(1 TO 12); +--| VARIABLE l : LINE; +--| FILE out_file : TEXT IS OUT "file_text_out.dat"; +--| +--| str12 := "0123456789ab"; +--| FOR i IN 1 TO 12 LOOP +--| fputc(str12(i), out_file, l); +--| END LOOP; +--| fputc(LF, out_file, l); -- line feed +--| +--| Will write contents of the str12 to file +--| file_text_out.dat. The characters will be kept in +--| the line pointer l untill line feed character is +--| encouneterd. +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputc ( CONSTANT c : IN character; + VARIABLE stream : OUT TEXT; + VARIABLE line_ptr : INOUT LINE + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fputs +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a string to an ASCII_ TEXT file. +--| +--| Parameters : +--| l_str -- input, string +--| stream -- output, ASCII_TEXT, +--| +--| Result : +--| +--| Note: : The ASCII_TEXT is defined in the package Std_IOpak to +--| be a file of CHARACTERS. +--| +--| USE: : +--| VARIABLE str_buf : string(1 TO 256); +--| FILE out_file : ASCII_TEXT IS OUT "file_ascii_out.dat"; +--| +--| fputs(str_buf, out_file); +--| +--| Will write contents of str_buf to the file +--| file_ascii_out.dat +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputs ( CONSTANT l_str : IN STRING; + VARIABLE stream : OUT ASCII_TEXT + ); + +--+----------------------------------------------------------------------------- +--| Function Name : fputs +--| 1.2.4 +--| Overloading : None +--| +--| Purpose : To write a string to a TEXT file. +--| +--| Parameters : +--| l_str -- input, string, +--| stream -- output, TEXT, +--| line_ptr -- INOUT LINE, +--| +--| Result : +--| +--| Note: : The STD TEXTIO package has declared TEXT as a +--| file of STRING. This is not same as file of CHARACTERS. +--| USE: : +--| VARIABLE str_buf : string(1 TO 256); +--| VARIABLE lptr : LINE; +--| FILE out_file : TEXT IS OUT "file_text_out.dat"; +--| +--| fputs(str_buf, out_file, lptr); +--| +--| Will write contents of str_buf to the file +--| file_text_out.dat +--| +--|----------------------------------------------------------------------------- + PROCEDURE fputs ( CONSTANT l_str : IN STRING; + VARIABLE stream : OUT TEXT; + VARIABLE line_ptr : INOUT LINE + ); +--+----------------------------------------------------------------------------- +--| Function Name : Find_Char +--| +--| Overloading : None +--| +--| Purpose : TO find a given character in a string and +--| return its position. +--| +--| Parameters : +--| l_str - input STRING, +--| c - input Character, +--| +--| Result : NATURAL number representing the position of character +--| in the string. returns 0 if character not found in the +--| string. +--| +--| USE: : +--| VARIABLE str14 : string(1 TO 14); +--| VARIABLE indx : integer; +--| +--| str14 :="This is a test"; +--| indx := Fid_Char(str14, 'i'); +--| +--| Will assign value of 3 to the variable indx. +--|----------------------------------------------------------------------------- + FUNCTION Find_Char ( CONSTANT l_str : IN STRING; + CONSTANT c : IN CHARACTER + ) RETURN NATURAL; +--+----------------------------------------------------------------------------- +--| Function Name : Sub_Char +--| +--| Overloading : None +--| +--| Purpose : To subtitute a new character at a given position +--| of the input string. +--| +--| Parameters : +--| l_str - input STRING, +--| c - input Character, +--| n - input Natural, position at which character +--| is to be substituted. +--| Result : STRING +--| +--| USE: : +--| VARIABLE str14 : string(1 TO 14); +--| VARIABLE indx : integer; +--| +--| str14 :="This is a test"; +--| IF ((indx = Find_Char(str14, 't')) /= 0) THEN +--| str14 := Sub_Char(str14, 'T', indx); +--| END IF; +--| +--| Will assign the value "This is a Test" to str14. +--|----------------------------------------------------------------------------- + FUNCTION Sub_Char ( CONSTANT l_str : IN STRING; + CONSTANT c : IN CHARACTER; + CONSTANT n : IN NATURAL + ) RETURN STRING; +-- +-- related to time +-- +--+----------------------------------------------------------------------------- +--| Function Name : From_String +--| +--| Overloading : None +--| +--| Purpose : Convert from a String to a time. +--| +--| Parameters : +--| str - input , string to be converted, +--| +--| Result : Time +--| +--| NOTE : +--| +--| Use : +--| VARIABLE t : time ; +--| +--| t := From_String (" 893.56 us"); +--| This statement will set t to time 893.56 us. +--| +--|----------------------------------------------------------------------------- + FUNCTION From_String ( CONSTANT str : IN STRING + ) RETURN TIME; +--+----------------------------------------------------------------------------- +--| Function Name : To_String +--| 1.1.7 +--| Overloading : None +--| +--| Purpose : Convert Time to a String. +--| +--| Parameters : +--| val - input, TIME, +--| format - input string +--| +--| Result : STRING representation of TIME. +--| +--| +--|----------------------------------------------------------------------------- + FUNCTION To_String ( CONSTANT val : IN TIME; + CONSTANT format : IN STRING := "" + ) RETURN STRING; + +END std_iopak; + + + + diff --git a/src/hdl/pkg/qlaser_dac_dc_pkg.vhd b/src/hdl/pkg/qlaser_dac_dc_pkg.vhd new file mode 100644 index 0000000..eef161e --- /dev/null +++ b/src/hdl/pkg/qlaser_dac_dc_pkg.vhd @@ -0,0 +1,30 @@ +---------------------------------------------------------------------------------------- +-- Project : qlaser FPGA +-- File : qlaser_dac_dc_pkg.vhd +-- Description : Version package file. +-- Author : akozyra +---------------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; + +package qlaser_dac_dc_pkg is + +---------------------------------------------------------------------------------------- +-- Constants +---------------------------------------------------------------------------------------- + +-- Addresses +constant C_ADDR_SPI0 : std_logic_vector(2 downto 0) := "000"; +constant C_ADDR_SPI1 : std_logic_vector(2 downto 0) := "001"; +constant C_ADDR_SPI2 : std_logic_vector(2 downto 0) := "010"; +constant C_ADDR_SPI3 : std_logic_vector(2 downto 0) := "011"; +constant C_ADDR_SPI_ALL : std_logic_vector(2 downto 0) := "100"; +constant C_ADDR_INTERNAL_REF : std_logic_vector(2 downto 0) := "101"; +constant C_ADDR_POWER_ON : std_logic_vector(2 downto 0) := "110"; + +-- Commands +constant C_CMD_DAC_DC_WR : std_logic_vector(3 downto 0) := "0011"; +constant C_CMD_DAC_DC_INTERNAL_REF : std_logic_vector(3 downto 0) := "1000"; +constant C_CMD_DAC_DC_POWER : std_logic_vector(3 downto 0) := "0100"; + +end package qlaser_dac_dc_pkg; diff --git a/src/hdl/pkg/qlaser_pkg.vhd b/src/hdl/pkg/qlaser_pkg.vhd new file mode 100644 index 0000000..89bd4ab --- /dev/null +++ b/src/hdl/pkg/qlaser_pkg.vhd @@ -0,0 +1,146 @@ +------------------------------------------------------------------------------- +-- Filename : qlaser_pkg.vhd +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.qlaser_dac_dc_pkg.all; +-- use work.qlaser_dac_ac_pkg.all; + +-------------------------------------------------------------------------------- +-- FPGA constant definitions +------------------------------------------------------------------------------- +package qlaser_pkg is + +-- FPGA internal (PLL) clock freq expressed in MHz +constant C_CLK_FREQ_MHZ : real := 100.0; +-- Clock period +constant C_CLK_PERIOD : time := integer(1.0E+6/(C_CLK_FREQ_MHZ)) * 1 ps; + +constant C_NUM_CHAN_DC : integer := 32; -- Number of DC channels +constant C_NUM_CHAN_AC : integer := 32; -- Number of AC (pulse) channels + +-------------------------------------------------------------------------------- +-- FPGA Addresses +-- Main blocks. Decoded from upper 4 bits of address [15:12] +-------------------------------------------------------------------------------- +constant ADR_BASE_DC : std_logic_vector( 3 downto 0) := X"0"; -- Registers to load DC DAC values +constant ADR_BASE_PULSE : std_logic_vector( 3 downto 0) := X"1"; -- RAMs for Pulse output start/stop times +constant ADR_BASE_MISC : std_logic_vector( 3 downto 0) := X"2"; -- Misc, LEDs, switches, power control + +-------------------------------------------------------------------------------- +-- Define the number of internal blocks that are addressed by the CPU +-------------------------------------------------------------------------------- +constant C_NUM_BLOCKS : integer := 3; +type t_arr_cpu_dout is array (0 to C_NUM_BLOCKS-1) of std_logic_vector(31 downto 0); +type t_arr_dout_ac is array (0 to C_NUM_CHAN_AC-1) of std_logic_vector(15 downto 0); + + +-------------------------------------------------------------------------------------------------------------------------- +-- 'DC' DAC block registers. 32 16-bit DAC outputs [5:3] +constant C_ADDR_CH_SPI0 : std_logic_vector(2 downto 0) := "000"; +constant C_ADDR_CH_SPI1 : std_logic_vector(2 downto 0) := "001"; +constant C_ADDR_CH_SPI2 : std_logic_vector(2 downto 0) := "010"; +constant C_ADDR_CH_SPI3 : std_logic_vector(2 downto 0) := "011"; +constant C_ADDR_CH_SPI_ALL : std_logic_vector(2 downto 0) := "100"; +constant C_ADDR_INTERNAL_REF : std_logic_vector(2 downto 0) := "101"; +constant C_ADDR_POWER_ON : std_logic_vector(2 downto 0) := "110"; + +-------------------------------------------------------------------------------------------------------------------------- +-- Individual DAC data registers +constant ADR_DAC_DC0 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "000"; -- +constant ADR_DAC_DC1 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "001"; -- +constant ADR_DAC_DC2 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "010"; -- +constant ADR_DAC_DC3 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "011"; -- +constant ADR_DAC_DC4 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "100"; -- +constant ADR_DAC_DC5 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "101"; -- +constant ADR_DAC_DC6 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "110"; -- +constant ADR_DAC_DC7 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI0 & "111"; -- + +constant ADR_DAC_DC8 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI1 & "000"; -- +constant ADR_DAC_DC9 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI1 & "001"; -- + +-- constant ADR_DAC_DC6 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI2 & "000"; -- +-- constant ADR_DAC_DC7 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI2 & "001"; -- +-- etc. etc. +-- constant ADR_DAC_DC6 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI3 & "110"; -- +-- constant ADR_DAC_DC7 : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_SPI3 & "111"; -- +constant ADR_DAC_DC30 : std_logic_vector(15 downto 0) := ADR_BASE_DC & X"01E"; -- +constant ADR_DAC_DC31 : std_logic_vector(15 downto 0) := ADR_BASE_DC & X"01F"; -- + +constant ADR_DAC_DC_ALL : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_CH_SPI_ALL & "000"; -- Write all channels +constant ADR_DAC_DC_IREF : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_INTERNAL_REF & "000"; -- +constant ADR_DAC_DC_POWER_ON : std_logic_vector(15 downto 0) := ADR_BASE_DC & "000000" & C_ADDR_POWER_ON & "000"; -- +constant ADR_DAC_DC_STATUS : std_logic_vector(15 downto 0) := ADR_BASE_DC & X"000"; -- Reading any address returns SPI interface busy status (this was 32 bit, but decleared as 16, so I changed to 16) + + +-------------------------------------------------------------------------------------------------------------------------- +-- 'Pulse' DAC block registers. +-- The block has a set of block registers and contains 16 'channels' +-- Each channel has a 40-bit memory to specify 24-bit time and a 16-bit level. +-- Initially just using the MSB of the level to drive a single pin output +-- +-------------------------------------------------------------------------------------------------------------------------- +-- Block-level registers +-- CPU_ADDR(11) = '0' selects local regs +-- CPU_ADDR(11) = '1' selects the channel specified in reg_ctrl(3 :0) +-- Then CPU_ADDR(10:1) selects RAM word address (1024 address MAX) +-- CPU_ADDR(0) selects MSB or LSB of 40-bit RAM word (time or amplitude) +-------------------------------------------------------------------------------------------------------------------------- +-- Addresses for block-level registers. +------------------------------------------------------------------------------------------------------------------------- +constant ADR_DAC_PULSE_CTRL : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"800"; -- 4:0 select channel RAM for CPU read/write. Bit 8 is rising edge internal trigger +constant ADR_DAC_PULSE_STATUS : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"801"; -- R/O Level status for output of each channel +constant ADR_DAC_PULSE_RUNTIME : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"802"; -- Max time for pulse train +constant ADR_DAC_PULSE_CH_EN : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"803"; -- Enable bit for each individual channel +constant ADR_DAC_PULSE_TIMER : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"804"; -- R/O Current timer value (used by all channels) +------------------------------------------------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------------------------------------------------- +-- Pulse Channel offsets +-------------------------------------------------------------------------------------------------------------------------- +constant ADR_DAC_PULSE0 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"000"; -- Base address of a 16-word x 40-bit RAM +constant ADR_DAC_PULSE1 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"040"; -- +constant ADR_DAC_PULSE2 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"080"; -- +constant ADR_DAC_PULSE3 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"0C0"; -- +-- +constant ADR_DAC_PULSE4 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"100"; -- +constant ADR_DAC_PULSE5 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"140"; -- +constant ADR_DAC_PULSE6 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"180"; -- +constant ADR_DAC_PULSE7 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"1C0"; -- +-- +constant ADR_DAC_PULSE8 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"200"; -- +constant ADR_DAC_PULSE9 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"240"; -- +constant ADR_DAC_PULSE10 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"280"; -- +constant ADR_DAC_PULSE11 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"2C0"; -- +-- +constant ADR_DAC_PULSE12 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"300"; -- +constant ADR_ADC_PULSE13 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"340"; -- +constant ADR_DAC_PULSE14 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"380"; -- +constant ADR_DAC_PULSE15 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"3C0"; -- +-- +-- etc. etc. +constant ADR_DAC_PULSE28 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"700"; -- +constant ADR_DAC_PULSE29 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"740"; -- +constant ADR_DAC_PULSE30 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"780"; -- +constant ADR_DAC_PULSE31 : std_logic_vector(15 downto 0) := ADR_BASE_PULSE & X"7C0"; -- + + + +-------------------------------------------------------------------------------------------------------------------------- +-- Misc block registers +-------------------------------------------------------------------------------------------------------------------------- +constant ADR_MISC_VERSION : std_logic_vector(15 downto 0) := ADR_BASE_MISC & X"000"; -- HDL code version +constant ADR_MISC_LEDS : std_logic_vector(15 downto 0) := ADR_BASE_MISC & X"001"; -- LEDs +constant ADR_MISC_LEDS_EN : std_logic_vector(15 downto 0) := ADR_BASE_MISC & X"002"; -- LEDs enable +constant ADR_MISC_SW_IN : std_logic_vector(15 downto 0) := ADR_BASE_MISC & X"003"; -- Read board switch settings (if present) +constant ADR_MISC_DEBUG_CTRL : std_logic_vector(15 downto 0) := ADR_BASE_MISC & X"004"; -- Select debug output from top level to pins + + +end package; + +package body qlaser_pkg is + +end package body; + diff --git a/src/hdl/sandbox/qlaser_dacs_pulse_channel.vhdl b/src/hdl/sandbox/qlaser_dacs_pulse_channel.vhdl new file mode 100644 index 0000000..3cc2ce1 --- /dev/null +++ b/src/hdl/sandbox/qlaser_dacs_pulse_channel.vhdl @@ -0,0 +1,606 @@ +--------------------------------------------------------------- +-- File : qlaser_dacs_pulse_channel.vhd +-- Description : Single channel of pulse output +---------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.qlaser_pkg.all; + +entity qlaser_dacs_pulse_channel is +port ( + reset : in std_logic; + clk : in std_logic; + + enable : in std_logic; -- Set when DAC interface is running + start : in std_logic; -- Set when pulse generation sequence begins (trigger) + cnt_time : in std_logic_vector(23 downto 0); -- Time since trigger. + + busy : out std_logic; -- Status signal + + -- CPU interface + cpu_addr : in std_logic_vector( 9 downto 0); -- Address input + cpu_wdata : in std_logic_vector(31 downto 0); -- Data input + cpu_wr : in std_logic; -- Write enable + cpu_sel : in std_logic; -- Block select + cpu_rdata : out std_logic_vector(31 downto 0); -- Data output + cpu_rdata_dv : out std_logic; -- Acknowledge output + + -- AXI-stream output + axis_tready : in std_logic; -- axi_stream ready from downstream module + axis_tdata : out std_logic_vector(15 downto 0); -- axi stream output data + axis_tvalid : out std_logic; -- axi_stream output data valid + axis_tlast : out std_logic -- axi_stream output set on last data +); +end entity; + + +---------------------------------------------------------------- +-- Single channel pulse generator with two RAMs and a FIFO +---------------------------------------------------------------- +architecture rtl of qlaser_dacs_pulse_channel is + +-- RAM, pulse position, CPU port, read/write +constant C_NUM_PULSE : integer := 16; -- Number of output data values from pulse RAM (16x24-bit) +signal ram_pulse_addra : std_logic_vector( 3 downto 0); -- 16 entry RAM +signal ram_pulse_dina : std_logic_vector(95 downto 0); +signal ram_pulse_douta : std_logic_vector(95 downto 0); +signal ram_pulse_douta_d1 : std_logic_vector(95 downto 0); -- Delay distrib RAM output to match pipeline of Block RAM +signal ram_pulse_we : std_logic; + +-- RAM, pulse position, from state machine +constant C_BITS_GAIN_FACTOR : integer := 16; -- Number of bits in gain table +constant C_BITS_TIME_FACTOR : integer := 16; -- Number of bits in time table +constant C_BITS_TIME_INT : integer := 14; -- Starting bit for time integer part of the time factor, counting from MSB +constant C_BITS_TIME_FRAC : integer := 5; -- Starting bit for time fractional part of the time factor, counting from MSB +constant C_BITS_ADDR_START : integer := 10; -- Number of bits for starting address +constant C_BITS_ADDR_LENGTH : integer := 10; -- Number of bits for length address used by an edge of a pulse +constant C_BITS_ADDR_TOP : integer := 17; -- Number of bits for the "flat top", the top of the pulse +signal cnt_wave_top : std_logic_vector( C_BITS_ADDR_TOP - 1 downto 0); -- Counter for the top of the waveform +signal ram_pulse_addrb : std_logic_vector( 3 downto 0); +signal ram_pulse_doutb : std_logic_vector(95 downto 0); + +signal cpu_rdata_dv_e1 : std_logic; +signal cpu_rdata_dv_e2 : std_logic; +signal cpu_rdata_ramsel_d1 : std_logic; +signal cpu_rdata_ramsel_d2 : std_logic; + +signal cpu_wdata_top : std_logic_vector(31 downto 0); -- Top 32 bits of CPU write data (95:64) +signal cpu_wdata_mid : std_logic_vector(31 downto 0); -- Middle 32 bits of CPU write data (63:32) + +-- Waveform RAM port connections. +-- NOTE: Port A is 32-bit data, port B is 16-bit +constant C_LENGTH_WAVEFORM : integer := 1024; -- Number of output data values from waveform RAM (1024x16-bit) +constant C_BITS_ADDR_WAVE : integer := 10; -- Number of bits in address for waveform RAM +signal ram_waveform_ena : std_logic; +signal ram_waveform_wea : std_logic_vector( 0 downto 0); +signal ram_waveform_addra : std_logic_vector( 8 downto 0); +signal ram_waveform_dina : std_logic_vector(31 downto 0); +signal ram_waveform_douta : std_logic_vector(31 downto 0); + +signal ram_waveform_enb : std_logic := '0'; +signal ram_waveform_web : std_logic_vector( 0 downto 0) := (others=>'0'); +signal ram_waveform_addrb : std_logic_vector( 9 downto 0); +signal ram_waveform_dinb : std_logic_vector(15 downto 0) := (others=>'0'); +signal ram_waveform_doutb : std_logic_vector(15 downto 0); + + +-- State variable type declaration for main state machine +type t_sm_state is ( + S_RESET, -- Wait for 'enable'. Stay here until JESD interface is up and running, + S_IDLE, -- Wait for 'start' + S_WAIT, -- Wait for cnt_time, external input, to match pulse position RAM output + S_WAVE_UP, -- Output the rising edge of a waveform + S_WAVE_FLAT,-- Output the flat top part of a waveform + S_WAVE_DOWN -- Output the falling edge of a waveform +); +signal sm_state : t_sm_state; +signal sm_wavedata : std_logic_vector(15 downto 0); -- Waveform RAM data +signal sm_wavedata_dv : std_logic; -- Signal to indicate that waveform RAM data is valid +signal sm_busy : std_logic; -- Signal to indicate that s.m. is not idle + + +---- FIFO port connections +--signal fifo_wr_en : std_logic; +--signal fifo_full : std_logic; +--signal fifo_empty : std_logic; +--signal fifo_wr_rst_busy : std_logic; +--signal fifo_rd_rst_busy : std_logic; +--signal fifo_rd_en : std_logic; +---- FIFO status signals for debug purpose +--signal fifo_wr_ack : std_logic; +--signal fifo_overflow : std_logic; +--signal fifo_valid : std_logic; +--signal fifo_underflow : std_logic; + +-- Pipeline delays +signal start_d1 : std_logic; +signal enable_d1 : std_logic; + +begin + + busy <= sm_busy; + + ---------------------------------------------------------------- + -- Distributed RAM to hold 16 24-bit Pulse start times. + -- Synch write, Asynch read + -- Port A is for CPU read/write. 16x24-bit + -- Port B is for pulse time data output. 16x24-bit + ---------------------------------------------------------------- + u_ram_pulse : entity work.bram_pulseposition + port map( + clk => clk , -- input std_logic + a => ram_pulse_addra , -- input slv[3:0] + d => ram_pulse_dina , -- input slv[95 downto 0] + we => ram_pulse_we , + spo => ram_pulse_douta , -- output slv(95 downto 0] + + dpra => ram_pulse_addrb , -- input slv[3:0] + dpo => ram_pulse_doutb -- output slv(95 downto 0) + ); + + + ---------------------------------------------------------------- + -- Waveform table Block RAM. + -- Synch write, Synch read + -- Port A is for CPU read/write. 512x32-bit + -- Port B is for waveform data. 1024x16-bit + ---------------------------------------------------------------- + u_ram_waveform : entity work.bram_waveform + port map ( + -- Port A CPU Bus + clka => clk , -- input std_logic + ena => ram_waveform_ena , -- input std_logic + wea => ram_waveform_wea , -- input slv(0 downto 0) + addra => ram_waveform_addra , -- input slv(8 downto 0) + dina => ram_waveform_dina , -- input slv(31 downto 0) + douta => ram_waveform_douta , -- output slv(31 downto 0) + + -- Port B waveform output + clkb => clk , -- input std_logic + enb => ram_waveform_enb , -- input std_logic + web => (others=>'0') , -- input slv(0 downto 0) + addrb => ram_waveform_addrb , -- input slv(9 downto 0) + dinb => (others=>'0') , -- input slv(15 downto 0) + doutb => ram_waveform_doutb -- output slv(15 downto 0) + ); + + + + ---------------------------------------------------------------- + -- State machine: + -- Compares cnt_time input against current output from pulse position RAM. + -- When values match iti incremnts the pulse postion RAM address to + -- retrieve the next pulse position and also starts reading the + -- entire waveform table, one value every clock cycle, until it reaches the end. + -- Once the pulse is complete it waits for the next cnt_time match. + -- Repeat until all pulse position RAM times have triggered a pulse output + -- or until the maximum counter time has been reached. + ---------------------------------------------------------------- + pr_sm : process (reset, clk) + -- TODO: those bitwidth are not correct, we could optimize it later and find out how many bits each variable should be. But for now just make it big + variable v_flattop : std_logic_vector(C_BITS_ADDR_TOP - 1 downto 0); -- wait times (flat_top), managed by an internal counter process sm_top_counter unter state S_WAVE_TOP + variable v_addr_length : std_logic_vector(C_BITS_ADDR_LENGTH - 1 downto 0); -- number of points/addresses used by the pulse edge, the bit width should increase with the amount of addresses the wavetable has + variable v_addr_start : std_logic_vector(C_BITS_ADDR_START - 1 downto 0); -- start address of the pulse edge data in the Waveform RAM, the bit width should increase with the amount of address the wavetable has. + variable v_addr_end : std_logic_vector(C_BITS_ADDR_START - 1 downto 0); -- end address of the pulse edge data in the Waveform RAM, the bit width should align with the bit width of v_addr_start + variable v_amplitude_factor : std_logic_vector(C_BITS_GAIN_FACTOR - 1 downto 0); -- pulse edge amplitude scale factor + variable v_time_factor : std_logic_vector(C_BITS_TIME_FACTOR - 1 downto 0); -- pulse edge time scale factor + variable v_cnt_time : std_logic_vector(23 downto 0); -- counter for the time, the bit width should increase with the amount of addresses the wavetable has + + variable v_ram_waveform_addrb : unsigned(95 downto 0); + begin + if (reset = '1') then + + sm_state <= S_IDLE; -- TODO: Eric: Should this be S_RESET since we reset the JEDS interface as well? + ram_pulse_addrb <= (others=>'0'); + ram_waveform_addrb <= (others=>'0'); + + sm_wavedata <= (others=>'0'); + sm_wavedata_dv <= '0'; + sm_busy <= '0'; + ram_waveform_enb <= '0'; + + elsif rising_edge(clk) then + + -- Pipeline delays to use for rising edge detection + enable_d1 <= enable; + start_d1 <= start; + + -- Default + sm_wavedata <= (others=>'0'); + sm_wavedata_dv <= '0'; + + -- Actively read pulse definition RAM and update the variables + v_flattop := ram_pulse_doutb(C_BITS_ADDR_TOP - 1 downto 0); + v_addr_length := ram_pulse_doutb(C_BITS_ADDR_LENGTH + C_BITS_ADDR_TOP - 1 downto C_BITS_ADDR_TOP); + v_addr_start := ram_pulse_doutb(C_BITS_ADDR_START + C_BITS_ADDR_LENGTH + C_BITS_ADDR_TOP - 1 downto C_BITS_ADDR_LENGTH + C_BITS_ADDR_TOP); + v_addr_end := std_logic_vector(unsigned(v_addr_start) + unsigned(v_addr_length) - 1); + v_amplitude_factor := ram_pulse_doutb(C_BITS_GAIN_FACTOR + C_BITS_ADDR_START + C_BITS_ADDR_LENGTH + C_BITS_ADDR_TOP - 1 downto C_BITS_ADDR_START + C_BITS_ADDR_LENGTH + C_BITS_ADDR_TOP); + v_time_factor := ram_pulse_doutb(C_BITS_TIME_FACTOR + C_BITS_GAIN_FACTOR + C_BITS_ADDR_START + C_BITS_ADDR_LENGTH + C_BITS_ADDR_TOP - 1 downto C_BITS_GAIN_FACTOR + C_BITS_ADDR_START + C_BITS_ADDR_LENGTH + C_BITS_ADDR_TOP); + v_cnt_time := ram_pulse_doutb(24 + C_BITS_TIME_FACTOR + C_BITS_GAIN_FACTOR + C_BITS_ADDR_START + C_BITS_ADDR_LENGTH + C_BITS_ADDR_TOP - 1 downto C_BITS_TIME_FACTOR + C_BITS_GAIN_FACTOR + C_BITS_ADDR_START + C_BITS_ADDR_LENGTH + C_BITS_ADDR_TOP); + + ------------------------------------------------------------------------ + -- Main state machine + ------------------------------------------------------------------------ + case sm_state is + + ------------------------------------------------------------------------ + -- Wait for rising edge of enable + -- This is set when the JESD interface is aligned and functional. + -- Send a zero value to initialize the DAC then go to idle. + ------------------------------------------------------------------------ + when S_RESET => + + if (enable = '1') and (enable_d1 = '0') then + sm_wavedata <= (others=>'0'); + sm_wavedata_dv <= '1'; + sm_state <= S_IDLE; + end if; + sm_busy <= '0'; + ram_waveform_enb <= '0'; + + + ------------------------------------------------------------------------ + -- Wait for rising edge of 'start'. + -- No data output. + ------------------------------------------------------------------------ + when S_IDLE => + + if (start = '1') and (start_d1 = '0') then + sm_state <= S_WAIT; + sm_busy <= '1'; + else + sm_busy <= '0'; + end if; + + ram_waveform_enb <= '0'; + + ------------------------------------------------------------------------ + -- Wait for cnt_time, external input, to match pulse position RAM output + -- Return to idle state if max time is reached. Output waveform value zero. + ------------------------------------------------------------------------ + when S_WAIT => + + -- Start to output wave and increment pulse position RAM address + if (v_cnt_time = cnt_time) then + sm_state <= S_WAVE_UP; + -- set the wavetable's address to the starting address defined from the pulse ram + ram_waveform_addrb <= v_addr_start; + elsif (cnt_time = X"FFFFFF") then + sm_state <= S_IDLE; + end if; + + ram_waveform_enb <= '1'; + ------------------------------------------------------------------------ + -- Output the raising edge of a waveform + -- Hold the last address when complete + ------------------------------------------------------------------------ + when S_WAVE_UP => + -- Check if is end of rise of the waveform, and hold the address + if (ram_waveform_addrb = v_addr_end) then + sm_state <= S_WAVE_FLAT; + -- initialize the counter for the flat top of the waveform + cnt_wave_top <= std_logic_vector(to_unsigned(0, C_BITS_ADDR_TOP)); + else + -- Output waveform from RAM , and increment the address + -- TODO: apply scaling factor to the address and then to the output + ram_waveform_addrb <= std_logic_vector(unsigned(ram_waveform_addrb) + 1); + end if; + sm_wavedata <= ram_waveform_doutb; + sm_wavedata_dv <= '1'; + + ------------------------------------------------------------------------ + -- Hold the last address and output its data + -- decrement from this address when finished waiting + ------------------------------------------------------------------------ + when S_WAVE_FLAT => + if (cnt_wave_top = v_flattop) then + sm_state <= S_WAVE_DOWN; + else + cnt_wave_top <= std_logic_vector(unsigned(cnt_wave_top) + 1); + end if; + sm_wavedata <= ram_waveform_doutb; + sm_wavedata_dv <= '1'; + + ------------------------------------------------------------------------ + -- Output the falling edge of a waveform + -- Hold the start address when complete + ------------------------------------------------------------------------ + when S_WAVE_DOWN => + + -- End of waveform? + if (ram_waveform_addrb = v_addr_start) then + + -- If the end of the pulse table is reached then go to idle + if (ram_pulse_addrb = std_logic_vector(to_unsigned(C_NUM_PULSE-1,4))) then + ram_pulse_addrb <= (others=>'0'); + sm_state <= S_IDLE; + + else -- increment pulse address for the next waveform + ram_pulse_addrb <= std_logic_vector(unsigned(ram_pulse_addrb) + 1); + sm_state <= S_WAIT; + end if; + + -- Output waveform from RAM with decremented address + else + ram_waveform_addrb <= std_logic_vector(unsigned(ram_waveform_addrb) - 1); + end if; + sm_wavedata <= ram_waveform_doutb; + sm_wavedata_dv <= '1'; + + ------------------------------------------------------------------------ + -- Default + ------------------------------------------------------------------------ + when others => + sm_state <= S_IDLE; + + end case; + end if; + + end process; + + -- AXI-Stream output. + -- TBD: This should come from a FIFO + -- TODO: the bits are not correct, should be top bits (C_BITS_GAIN_FACTOR + 16 downto C_BITS_GAIN_FACTOR), but for now just make it this way so modelsim can simulate + -- TODO: apply scaling factor to the output + axis_tdata <= sm_wavedata; -- axi stream output data, this output should be multiplied by the gain factor, then take the top 16 bits + axis_tvalid <= sm_wavedata_dv; -- axi_stream output data valid + + -- TBD : Generate in state machine? + axis_tlast <= '0'; -- axi_stream output last + + + ---------------------------------------------------------------- + -- **** TBD : ADD FIFO **** + ---------------------------------------------------------------- + -- FIFO for waveform data + -- connect to external output to whatever we want to connect + ---------------------------------------------------------------- + --u_data_to_stream : entity work.fifo_data_to_stream + --port map ( + -- clk => clk, -- input std_logic + -- srst => reset, -- input std_logic + -- rd_en => fifo_rd_en, -- input std_logic + -- wr_en => fifo_wr_en, -- input std_logic + -- empty => fifo_empty, -- output std_logic + -- full => fifo_full, -- output std_logic + -- din => ram_waveform_doutb, -- input slv(15 downto 0) + -- dout => fifo_dout, -- output slv(15 downto 0) + -- + -- -- FIFO signals, some of then are for debug purpose + -- wr_ack => fifo_wr_ack, -- output std_logic + -- overflow => fifo_overflow, -- output std_logic + -- valid => fifo_valid, -- output std_logic + -- underflow => fifo_underflow, -- output std_logic + -- wr_rst_busy => fifo_wr_rst_busy, -- output std_logic + -- rd_rst_busy => fifo_rd_rst_busy -- output std_logic + --); + + + ---------------------------------------------------------------- + -- CPU Read/Write RAM + -- MSB of cpu_addr is used to select one of the two RAMs + -- to read/write, and the remainder are a 9-bit or 4-bit RAM address. + ---------------------------------------------------------------- + pr_ram_rw : process (reset, clk) + begin + if (reset = '1') then + + ram_pulse_addra <= (others=>'0'); + ram_pulse_dina <= (others=>'0'); + ram_pulse_we <= '0'; + + ram_waveform_ena <= '0'; + ram_waveform_wea <= (others=>'0'); + ram_waveform_addra <= (others=>'0'); + ram_waveform_dina <= (others=>'0'); + + cpu_rdata <= (others=>'0'); + cpu_rdata_dv <= '0'; + cpu_rdata_dv_e1 <= '0'; + cpu_rdata_dv_e2 <= '0'; + cpu_rdata_ramsel_d1 <= '0'; + cpu_rdata_ramsel_d2 <= '0'; + + elsif rising_edge(clk) then + + ram_waveform_ena <= '0'; + + ------------------------------------------------- + -- CPU writing RAM + ------------------------------------------------- + if (cpu_wr = '1') and (cpu_sel = '1') then + + -- 0 for pulse position, 1 for waveform table + if (cpu_addr(9) = '1') then + + ram_pulse_addra <= (others=>'0'); + ram_pulse_dina <= (others=>'0'); + ram_pulse_we <= '0'; + + ram_waveform_wea(0) <= '1'; + ram_waveform_ena <= '1'; + ram_waveform_addra <= cpu_addr(8 downto 0); + ram_waveform_dina <= cpu_wdata; + + else + + ram_pulse_addra <= cpu_addr(5 downto 2); + -- select which part of the 96-bit data to write + if (cpu_addr(1 downto 0) = "00") then + ram_pulse_dina(31 downto 0) <= cpu_wdata; + elsif (cpu_addr(1 downto 0) = "01") then + ram_pulse_dina(63 downto 32) <= cpu_wdata; + elsif (cpu_addr(1 downto 0) = "10") then + ram_pulse_dina(95 downto 64) <= cpu_wdata; + ram_pulse_we <= '1'; -- Write on the thrid cycle + end if; + + + ram_waveform_ena <= '0'; + ram_waveform_wea <= (others=>'0'); + ram_waveform_addra <= (others=>'0'); + ram_waveform_dina <= (others=>'0'); + + end if; + + cpu_rdata_dv_e1 <= '0'; + cpu_rdata_dv_e2 <= '0'; + cpu_rdata_ramsel_d1 <= '0'; + cpu_rdata_ramsel_d2 <= '0'; + + + ------------------------------------------------- + -- CPU read + ------------------------------------------------- + elsif (cpu_wr = '0') and (cpu_sel = '1') then + + if (cpu_addr(9) = '1') then -- Waveform + ram_waveform_ena <= '1'; + ram_pulse_addra <= (others=>'0'); + ram_waveform_addra <= cpu_addr(8 downto 0); + else -- Pulse + ram_pulse_addra <= cpu_addr(5 downto 2); + ram_pulse_douta_d1 <= ram_pulse_douta; -- Delay distrib RAM output to match pipeline of Block RAM + ram_waveform_addra <= (others=>'0'); + end if; + + ram_pulse_we <= '0'; + ram_waveform_wea(0) <= '0'; + + cpu_rdata_dv_e2 <= '1'; -- DV for cycle, when RAM output occurs + cpu_rdata_dv_e1 <= cpu_rdata_dv_e2; -- DV for next cycle + cpu_rdata_ramsel_d1 <= cpu_addr(9); -- Save the select bit one cycle later + cpu_rdata_ramsel_d2 <= cpu_rdata_ramsel_d1; + + else + ram_pulse_addra <= (others=>'0'); + ram_pulse_we <= '0'; + ram_waveform_addra <= (others=>'0'); + ram_waveform_wea(0) <= '0'; + + cpu_rdata_dv_e2 <= '0'; + cpu_rdata_dv_e1 <= cpu_rdata_dv_e2; -- DV for next cycle + cpu_rdata_ramsel_d1 <= '0'; + cpu_rdata_ramsel_d2 <= cpu_rdata_ramsel_d1; + + end if; + + ------------------------------------------------- + -- Output the delayed RAM data + -- This adds a pipeline delay to the cpu_rdata_dv to account for + -- the delay in reading data from the RAM + ------------------------------------------------- + if (cpu_rdata_dv_e1 = '1') then + + cpu_rdata_dv <= '1'; + + -- Select source of output data + if (cpu_rdata_ramsel_d2 = '1') then -- Output is from waveform table + cpu_rdata <= ram_waveform_douta; + + elsif (cpu_rdata_ramsel_d2 = '0') then + -- cpu_rdata <= X"00" & ram_pulse_douta_d1; + -- select which part of the 96-bit data to read + if (cpu_addr(1 downto 0) = "00") then + cpu_rdata <= ram_pulse_douta_d1(31 downto 0); + elsif (cpu_addr(1 downto 0) = "01") then + cpu_rdata <= ram_pulse_douta_d1(63 downto 32); + elsif (cpu_addr(1 downto 0) = "10") then + cpu_rdata <= ram_pulse_douta_d1(95 downto 64); + + end if; + end if; + + else + cpu_rdata <= (others=>'0'); + cpu_rdata_dv <= '0'; + end if; + + end if; + + end process; + + +-- ---------------------------------------------------------------- +-- -- Read time from RAM to generate pulses +-- -- When input cnt_time equals RAM time output then set dout +-- -- to RAM amplitude output and read next set of RAM data. +-- -- Keep reading waveform RAM every clock cycle until the end of the RAM +-- ---------------------------------------------------------------- +-- pr_ram_pulse : process(reset, clk) +-- begin +-- if (reset = '1') then +-- +-- ram_pulse_addrb <= (others => '0'); +-- start_pulse <= '0'; +-- dout_dv <= '0'; +-- +-- elsif rising_edge(clk) then +-- +-- -- dout <= ram_amplitude; +-- +-- if (cnt_time = X"000000") then -- Not triggered +-- ram_pulse_addrb <= (others=>'0'); +-- dout_dv <= '0'; +-- start_pulse <= '0'; +-- +-- elsif (ram_time = cnt_time) then +-- +-- ram_pulse_addrb <= std_logic_vector(unsigned(ram_pulse_addrb) + 1); +-- dout_dv <= '1'; +-- start_pulse <= '1'; +-- +-- else +-- dout_dv <= '0'; +-- start_pulse <= '0'; +-- end if; +-- +-- end if; +-- +-- end process; +-- +-- +-- ---------------------------------------------------------------- +-- -- Read amplitude from Waveform RAM to generate pulses +-- -- When start_pulse is asserted, and when FIFO is not full, write +-- -- amplitude to FIFO. +-- ---------------------------------------------------------------- +-- pr_ram_wavetable : process(reset, clk) +-- begin +-- if (reset = '1') then +-- fifo_wr_en <= '0'; +-- ram_waveform_addrb <= (others => '0'); +-- ram_waveform_enb <= '0'; +-- busy <= '0'; +-- elsif rising_edge(clk) then +-- if (read_table = '1') then -- start_pulse get asserted +-- busy <= '1'; +-- -- TODO EricToGeoff : This condition may not satisfy all cases of a fifo_ready, maybe also utilize fifo_wr_ack or just a simple FSM? +-- if (fifo_full = '0') then +-- fifo_wr_en <= '1'; +-- ram_waveform_addrb <= std_logic_vector(unsigned(ram_waveform_addrb) + 1); +-- ram_waveform_enb <= '1'; +-- else +-- fifo_wr_en <= '0'; +-- -- FIFO is full, wait +-- ram_waveform_addrb <= ram_waveform_addrb; +-- ram_waveform_enb <= '0'; +-- end if; +-- else +-- fifo_wr_en <= '0'; +-- ram_waveform_addrb <= (others => '0'); +-- ram_waveform_enb <= '0'; +-- end if; +-- end if; +-- +-- end process; +-- +-- -- For new versions, ram_doutb are differnt RAMs b port outputs, ram_amplitude should go thought a FIFO first from RAM +-- ram_time <= ram_doutb; +-- read_table <= start_pulse; +-- +-- fifo_rd_en <= axi_tready and fifo_full; + +end rtl; diff --git a/src/hdl/sandbox/tb_cpubus_dacs_pulse_channel.vhdl b/src/hdl/sandbox/tb_cpubus_dacs_pulse_channel.vhdl new file mode 100644 index 0000000..541d87f --- /dev/null +++ b/src/hdl/sandbox/tb_cpubus_dacs_pulse_channel.vhdl @@ -0,0 +1,395 @@ +----------------------------------------------------------- +-- File : tb_cpubus_dacs_pulse_channel.vhd +----------------------------------------------------------- +-- +-- Testbench for CPU bus peripheral. +-- +-- Description : Pulse output control of Qlaser FPGA +-- Block drives AXI-stream to JESD DACs +-- +---------------------------------------------------------- +library ieee; +use ieee.numeric_std.all; +use ieee.std_logic_1164.all; +use std.textio.all; + +use work.std_iopak.all; + + +entity tb_cpubus_dacs_pulse_channel is +end tb_cpubus_dacs_pulse_channel; + +architecture behave of tb_cpubus_dacs_pulse_channel is + +signal clk : std_logic; +signal reset : std_logic; +signal enable : std_logic; +signal start : std_logic; +signal cnt_time : std_logic_vector(23 downto 0); +signal busy : std_logic; +signal cpu_wr : std_logic; +signal cpu_sel : std_logic; +signal cpu_addr : std_logic_vector(15 downto 0); +signal cpu_wdata : std_logic_vector(31 downto 0); +signal cpu_rdata : std_logic_vector(31 downto 0); +signal cpu_rdata_dv : std_logic; + +-- AXI-stream output interface +signal axis_tready : std_logic := '1'; -- Always ready +signal axis_tdata : std_logic_vector(15 downto 0); +signal axis_tvalid : std_logic; +signal axis_tlast : std_logic; + +-- Halts simulation by stopping clock when set true +signal sim_done : boolean := false; + +-- Crystal clock freq expressed in MHz +constant CLK_FREQ_MHZ : real := 100.0; +-- Clock period +constant CLK_PER : time := integer(1.0E+6/(CLK_FREQ_MHZ)) * 1 ps; + +-- Block registers +constant ADR_RAM_PULSE : integer := 0; -- base address for pulse RAM, TODO: this constant should eventually go to qlaser_pkg +constant ADR_RAM_WAVE : integer := 512; -- + + + + +------------------------------------------------------------- +-- CPU write procedure. Address in decimal. Data in hex +------------------------------------------------------------- +procedure cpu_write( + signal clk : in std_logic; + constant a : in integer; + constant d : in std_logic_vector(31 downto 0); + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +begin + wait until clk'event and clk='0'; + cpu_sel <= '1'; + cpu_wr <= '1'; + cpu_addr <= std_logic_vector(to_unsigned(a, 16)); + cpu_wdata <= std_logic_vector(d); + wait until clk'event and clk='0'; + cpu_sel <= '0'; + cpu_wr <= '0'; + cpu_addr <= (others=>'0'); + cpu_wdata <= (others=>'0'); + wait until clk'event and clk='0'; +end; + +------------------------------------------------------------- +-- CPU write pulse definition RAM +-- Use 96 bit data to make three 32-bit writes +------------------------------------------------------------- +procedure cpu_write_pulsedef( + signal clk : in std_logic; + + constant num_entry : in integer; + + -- TODO: Partial ? list of parameters + constant pulsetime : in integer; -- Pulse time in clock cycles + constant timefactor : in real; -- Fixed point time scale factor + constant gainfactor : in real; -- Fixed point gain value. Max value 1.0 is hex X"8000". Gain 0.5 is therefore X"4000" + constant wavestartaddr : in integer; -- Start address in waveform RAM + constant wavesteps : in integer; -- Number of steps in waveform rise and fall + constant wavetopwidth : in integer; -- Number of clock cycles in waveform top between end of rise and start of fall + + + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +-- Vectors for converted values +variable slv_pulsetime : std_logic_vector(26 downto 0); -- For 27-bit pulse time +variable slv_timefactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point timestep +variable slv_gainfactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point gain +variable slv_wavestartaddr : std_logic_vector(11 downto 0); -- For 12-bit address i.e. 1024 point waveform RAM +variable slv_wavesteps : std_logic_vector( 9 downto 0); -- For 10-bit number of steps i.e. 0 = 1 step, X"3FF" = 1024 points +variable slv_wavetopwidth : std_logic_vector(16 downto 0); -- For 17-bit number of clock cycles in top of waveform + +variable slv_entry_data : std_logic_vector(95 downto 0); -- Vector for entire memory entry + +-- constant ADR_PULSE_DEF : integer := to_integer(unsigned(X"?????")); -- Use address of pulse definition RAM from qlaser_pkg +-- Define the number of fractional bits +constant BIT_FRAC : integer := 4; -- TODO: this should be defined in qlaser_pkg +begin + + -- Convert each field into its std_logic_vector equivalent + slv_pulsetime := std_logic_vector(to_unsigned(pulsetime, 27)); + slv_timefactor := std_logic_vector(to_unsigned(integer(timefactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_gainfactor := std_logic_vector(to_unsigned(integer(gainfactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_wavestartaddr := std_logic_vector(to_unsigned(wavestartaddr, 12)); + slv_wavesteps := std_logic_vector(to_unsigned(wavesteps, 10)); + slv_wavetopwidth := std_logic_vector(to_unsigned(wavetopwidth, 17)); + + + --etc, etc. + + -- Build full entry out of component fields. Final length should be 96 bits. + -- slv_entry_data := "000" & slv_pulsetime & slv_timefactor & slv_gainfactor & slv_wavestartaddr & slv_wavesteps & slv_wavetopwidth; -- This might not correct + + -- -- Write 96-bit entry in 3 writes. (Address is an integer) + -- cpu_write(clk, ADR_RAM_PULSE+(4*num_entry) , slv_entry_data(31 downto 0), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + -- cpu_write(clk, ADR_RAM_PULSE+(4*num_entry)+1 , slv_entry_data(63 downto 32), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + -- cpu_write(clk, ADR_RAM_PULSE+(4*num_entry)+2 , slv_entry_data(95 downto 64), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + -- Write 32-bit entry in +end; + +------------------------------------------------------------- +-- CPU write procedure. Address and Data in decimal +------------------------------------------------------------- +procedure cpu_write( + signal clk : in std_logic; + constant a : in integer; + constant d : in integer; + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +begin + cpu_write(clk, a , std_logic_vector(to_unsigned(d,32)), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); +end; + + +------------------------------------------------------------- +-- CPU read procedure +------------------------------------------------------------- +procedure cpu_read( + signal clk : in std_logic; + constant a : in integer; + constant exp_d : in std_logic_vector(31 downto 0); + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0); + signal cpu_rdata : in std_logic_vector(31 downto 0); + signal cpu_rdata_dv : in std_logic +) is +variable v_bdone : boolean := false; +variable str_out : string(1 to 256); +begin + wait until clk'event and clk='0'; + cpu_sel <= '1'; + cpu_wr <= '0'; + cpu_addr <= std_logic_vector(to_unsigned(a, 16)); + cpu_wdata <= (others=>'0'); + while (v_bdone = false) loop + wait until clk'event and clk='0'; + cpu_sel <= '1'; + if (cpu_rdata_dv = '1') then + if (cpu_rdata /= exp_d) then + fprint(str_out, "Read exp: 0x%s actual: 0x%s\n", to_string(to_bitvector(exp_d),"%08X"), to_string(to_bitvector(cpu_rdata),"%08X")); + report str_out severity error; + end if; + v_bdone := true; + cpu_sel <= '0'; + cpu_addr <= (others=>'0'); + end if; + end loop; + wait until clk'event and clk='0'; + wait until clk'event and clk='0'; +end; + +------------------------------------------------------------- +-- CPU read pulse definition RAM +-- Use 96 bit data to make three 32-bit writes +------------------------------------------------------------- +procedure cpu_read_pulsedef( + signal clk : in std_logic; + + constant num_entry : in integer; + + -- TODO: Partial ? list of parameters + constant pulsetime : in integer; -- Pulse time in clock cycles + constant timefactor : in real; -- Fixed point time scale factor + constant gainfactor : in real; -- Fixed point gain value. Max value 1.0 is hex X"8000". Gain 0.5 is therefore X"4000" + constant wavestartaddr : in integer; -- Start address in waveform RAM + constant wavesteps : in integer; -- Number of steps in waveform rise and fall + constant wavetopwidth : in integer; -- Number of clock cycles in waveform top between end of rise and start of fall + + + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +-- Vectors for converted values +variable slv_pulsetime : std_logic_vector(23 downto 0); -- For 24-bit pulse time +variable slv_timefactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point timestep +variable slv_gainfactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point gain +variable slv_wavestartaddr : std_logic_vector( 9 downto 0); -- For 10-bit address i.e. 1024 point waveform RAM +variable slv_wavesteps : std_logic_vector( 9 downto 0); -- For 10-bit number of steps i.e. 0 = 1 step, X"3FF" = 1024 points +variable slv_wavetopwidth : std_logic_vector(16 downto 0); -- For 17-bit number of clock cycles in top of waveform + +variable slv_entry_data : std_logic_vector(95 downto 0); -- Vector for entire memory entry + +-- constant ADR_PULSE_DEF : integer := to_integer(unsigned(X"?????")); -- Use address of pulse definition RAM from qlaser_pkg +-- Define the number of fractional bits +constant BIT_FRAC : integer := 4; -- TODO: this should be defined in qlaser_pkg +begin + + -- Convert each field into its std_logic_vector equivalent + slv_pulsetime := std_logic_vector(to_unsigned(pulsetime, 24)); + slv_timefactor := std_logic_vector(to_unsigned(integer(timefactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_gainfactor := std_logic_vector(to_unsigned(integer(gainfactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_wavestartaddr := std_logic_vector(to_unsigned(wavestartaddr, 10)); + slv_wavesteps := std_logic_vector(to_unsigned(wavesteps, 10)); + slv_wavetopwidth := std_logic_vector(to_unsigned(wavetopwidth, 17)); + + + --etc, etc. + + -- Build full entry out of component fields. Final length should be 96 bits. + slv_entry_data := "000" & slv_pulsetime & slv_timefactor & slv_gainfactor & slv_wavestartaddr & slv_wavesteps & slv_wavetopwidth; -- This might not correct + + -- Write 96-bit entry in 3 writes. (Address is an integer) + cpu_read(clk, ADR_RAM_PULSE+(4*num_entry), slv_entry_data(31 downto 0), cpu_sel, cpu_wr, cpu_addr, cpu_wdata, cpu_rdata, cpu_rdata_dv); + cpu_read(clk, ADR_RAM_PULSE+(4*num_entry) + 1, slv_entry_data(63 downto 32), cpu_sel, cpu_wr, cpu_addr, cpu_wdata, cpu_rdata, cpu_rdata_dv); + cpu_read(clk, ADR_RAM_PULSE+(4*num_entry) + 2, slv_entry_data(95 downto 64), cpu_sel, cpu_wr, cpu_addr, cpu_wdata, cpu_rdata, cpu_rdata_dv); + +end; + + +------------------------------------------------------------- +-- Delay +------------------------------------------------------------- +procedure clk_delay( + constant nclks : in integer +) is +begin + for I in 0 to nclks loop + wait until clk'event and clk ='0'; + end loop; +end; + + +---------------------------------------------------------------- +-- Print a string with no time or instance path. +---------------------------------------------------------------- +procedure cpu_print_msg( + constant msg : in string +) is +variable line_out : line; +begin + write(line_out, msg); + writeline(output, line_out); +end procedure cpu_print_msg; + + +begin + + ------------------------------------------------------------- + -- Unit Under Test + ------------------------------------------------------------- + u_dac_pulse : entity work.qlaser_dacs_pulse_channel + port map ( + clk => clk , -- in std_logic; + reset => reset , -- in std_logic; + + enable => enable , -- out std_logic; + start => start , -- out std_logic; + cnt_time => cnt_time , -- out std_logic_vector(23 downto 0); -- Set to '1' while SPI interface is busy + + busy => busy , -- out std_logic; -- Set to '1' while SPI interface is busy + + -- CPU interface + cpu_wr => cpu_wr , -- in std_logic; + cpu_sel => cpu_sel , -- in std_logic; + cpu_addr => cpu_addr(11 downto 0) , -- in std_logic_vector(11 downto 0); + cpu_wdata => cpu_wdata , -- in std_logic_vector(31 downto 0); + + cpu_rdata => cpu_rdata , -- out std_logic_vector(31 downto 0); + cpu_rdata_dv => cpu_rdata_dv , -- out std_logic; + + + -- AXI-Stream interface + axis_tready => axis_tready , -- in std_logic; -- Clock (50 MHz max) + axis_tdata => axis_tdata , -- out std_logic_vector(15 downto 0); + axis_tvalid => axis_tvalid , -- out std_logic; -- Master out, Slave in. (Data to DAC) + axis_tlast => axis_tlast -- out std_logic; -- Active low chip select (sync_n) + ); + + + ------------------------------------------------------------- + -- Generate system clock. Halt when sim_done is true. + ------------------------------------------------------------- + pr_clk : process + begin + clk <= '0'; + wait for (CLK_PER/2); + clk <= '1'; + wait for (CLK_PER-CLK_PER/2); + if (sim_done=true) then + wait; + end if; + end process; + + + ------------------------------------------------------------- + -- Reset and drive CPU bus + ------------------------------------------------------------- + pr_main : process + variable v_ndata32 : integer := 0; + variable v_ndata16 : integer := 0; + begin + -- Reset + reset <= '1'; + enable <= '0'; + start <= '0'; + cnt_time <= (others=>'0'); + + cpu_sel <= '0'; + cpu_wr <= '0'; + cpu_wdata <= (others=>'0'); + cpu_addr <= (others=>'0'); + + cpu_print_msg("Simulation start"); + clk_delay(5); + reset <= '0'; + + clk_delay(5); + enable <= '1'; + + + clk_delay(20); + + + ---------------------------------------------------------------- + -- Load pulse RAM with a series of pulse start times + ---------------------------------------------------------------- + v_ndata32 := 128; -- Time for first pulse + cpu_print_msg("Load pulse RAM"); + for NADDR in 0 to 15 loop + -- cpu_write(clk, ADR_RAM_PULSE + NADDR , v_ndata32 + (NADDR*(1024+32)), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); -- TODO: rn don't know how to make it write three difference places, for now I', just gonna manually write it + cpu_write_pulsedef(clk, NADDR, v_ndata32 + (NADDR*(1024+32)), 1.0, 1.0, 0, NADDR*32, 512, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + end loop; + cpu_print_msg("Pulse RAM loaded"); + clk_delay(20); + + ---------------------------------------------------------------- + -- Read back Pulse RAM. + ---------------------------------------------------------------- + v_ndata32 := 128; -- Time for first pulse + for NADDR in 0 to 15 loop + cpu_read_pulsedef(clk, NADDR, v_ndata32 + (NADDR*(1024+32)), 1.0, 1.0, 0, NADDR*32, 512, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + end loop; + clk_delay(20); + + wait for 10 us; + + cpu_print_msg("Simulation done"); + clk_delay(5); + + sim_done <= true; + wait; + + end process; + +end behave; + diff --git a/src/hdl/tb/tb_cpubus_dacs_pulse_channel.vhdl b/src/hdl/tb/tb_cpubus_dacs_pulse_channel.vhdl new file mode 100644 index 0000000..8e3df89 --- /dev/null +++ b/src/hdl/tb/tb_cpubus_dacs_pulse_channel.vhdl @@ -0,0 +1,428 @@ +----------------------------------------------------------- +-- File : tb_cpubus_dacs_pulse_channel.vhd +----------------------------------------------------------- +-- +-- Testbench for CPU bus peripheral. +-- +-- Description : Pulse output control of Qlaser FPGA +-- Block drives AXI-stream to JESD DACs +-- +---------------------------------------------------------- +library ieee; +use ieee.numeric_std.all; +use ieee.std_logic_1164.all; +use std.textio.all; + +use work.std_iopak.all; + + +entity tb_cpubus_dacs_pulse_channel is +end tb_cpubus_dacs_pulse_channel; + +architecture behave of tb_cpubus_dacs_pulse_channel is + +signal clk : std_logic; +signal reset : std_logic; +signal enable : std_logic; +signal start : std_logic; +signal cnt_time : std_logic_vector(23 downto 0); +signal busy : std_logic; +signal cpu_wr : std_logic; +signal cpu_sel : std_logic; +signal cpu_addr : std_logic_vector(15 downto 0); +signal cpu_wdata : std_logic_vector(31 downto 0); +signal cpu_rdata : std_logic_vector(31 downto 0); +signal cpu_rdata_dv : std_logic; + +-- AXI-stream output interface +signal axis_tready : std_logic := '1'; -- Always ready +signal axis_tdata : std_logic_vector(15 downto 0); +signal axis_tvalid : std_logic; +signal axis_tlast : std_logic; + +-- Halts simulation by stopping clock when set true +signal sim_done : boolean := false; + +-- Crystal clock freq expressed in MHz +constant CLK_FREQ_MHZ : real := 100.0; +-- Clock period +constant CLK_PER : time := integer(1.0E+6/(CLK_FREQ_MHZ)) * 1 ps; + +-- Block registers +-- constant ADR_RAM_PULSE : integer := to_integer(unsigned(X"0000")); -- TODO: Modelsim cannot compile this +-- constant ADR_RAM_WAVE : integer := to_integer(unsigned(X"0200")); -- TODO: Modelsim cannot compile this +constant ADR_RAM_PULSE : integer := 0; -- TODO: Modelsim cannot compile this +constant ADR_RAM_WAVE : integer := 2048; -- TODO: Modelsim cannot compile this + + +------------------------------------------------------------- +-- CPU write procedure. Address in decimal. Data in hex +------------------------------------------------------------- +procedure cpu_write( + signal clk : in std_logic; + constant a : in integer; + constant d : in std_logic_vector(31 downto 0); + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +begin + wait until clk'event and clk='0'; + cpu_sel <= '1'; + cpu_wr <= '1'; + cpu_addr <= std_logic_vector(to_unsigned(a, 16)); + cpu_wdata <= std_logic_vector(d); + wait until clk'event and clk='0'; + cpu_sel <= '0'; + cpu_wr <= '0'; + cpu_addr <= (others=>'0'); + cpu_wdata <= (others=>'0'); + wait until clk'event and clk='0'; +end; + + +------------------------------------------------------------- +-- CPU write procedure. Address and Data in decimal +------------------------------------------------------------- +procedure cpu_write( + signal clk : in std_logic; + constant a : in integer; + constant d : in integer; + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +begin + cpu_write(clk, a , std_logic_vector(to_unsigned(d,32)), cpu_sel, cpu_wr, cpu_addr, cpu_wdata); +end; + +------------------------------------------------------------- +-- CPU write pulse definition RAM +-- Make fore 32-bit data write +------------------------------------------------------------- +procedure cpu_write_pulsedef( + signal clk : in std_logic; + + constant num_entry : in integer; + + -- TODO: Partial ? list of parameters + constant pulsetime : in integer; -- Pulse time in clock cycles + constant timefactor : in real; -- Fixed point time scale factor + constant gainfactor : in real; -- Fixed point gain value. Max value 1.0 is hex X"8000". Gain 0.5 is therefore X"4000" + constant wavestartaddr : in integer; -- Start address in waveform RAM + constant wavesteps : in integer; -- Number of steps in waveform rise and fall + constant wavetopwidth : in integer; -- Number of clock cycles in waveform top between end of rise and start of fall + + + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +-- Vectors for converted values +variable slv_pulsetime : std_logic_vector(23 downto 0); -- For 24-bit pulse time +variable slv_timefactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point timestep +variable slv_gainfactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point gain +variable slv_wavestartaddr : std_logic_vector(11 downto 0); -- For 12-bit address i.e. 1024 point waveform RAM +variable slv_wavesteps : std_logic_vector( 9 downto 0); -- For 10-bit number of steps i.e. 0 = 1 step, X"3FF" = 1024 points +variable slv_wavetopwidth : std_logic_vector(16 downto 0); -- For 17-bit number of clock cycles in top of waveform + +-- constant ADR_PULSE_DEF : integer := to_integer(unsigned(X"?????")); -- Use address of pulse definition RAM from qlaser_pkg +-- Define the number of fractional bits +constant BIT_FRAC : integer := 4; -- TODO: this should be defined in qlaser_pkg +begin + + -- Convert each field into its std_logic_vector equivalent + slv_pulsetime := std_logic_vector(to_unsigned(pulsetime, 24)); + slv_timefactor := std_logic_vector(to_unsigned(integer(timefactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_gainfactor := std_logic_vector(to_unsigned(integer(gainfactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_wavestartaddr := std_logic_vector(to_unsigned(wavestartaddr, 12)); + slv_wavesteps := std_logic_vector(to_unsigned(wavesteps, 10)); + slv_wavetopwidth := std_logic_vector(to_unsigned(wavetopwidth, 17)); + + + --etc, etc. + -- 4 writes. (Address is an integer) + cpu_write(clk, ADR_RAM_PULSE+num_entry , x"00" & slv_pulsetime, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + cpu_write(clk, ADR_RAM_PULSE+(num_entry+1) , "00" & x"00" & slv_wavesteps & slv_wavestartaddr, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + cpu_write(clk, ADR_RAM_PULSE+(num_entry+2) , slv_timefactor & slv_gainfactor, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + cpu_write(clk, ADR_RAM_PULSE+(num_entry+3) , "0000000" & x"00" & slv_wavetopwidth, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + +end; + +------------------------------------------------------------- +-- CPU read procedure +------------------------------------------------------------- +procedure cpu_read( + signal clk : in std_logic; + constant a : in integer; + constant exp_d : in std_logic_vector(31 downto 0); + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0); + signal cpu_rdata : in std_logic_vector(31 downto 0); + signal cpu_rdata_dv : in std_logic +) is +variable v_bdone : boolean := false; +variable str_out : string(1 to 256); +begin + wait until clk'event and clk='0'; + cpu_sel <= '1'; + cpu_wr <= '0'; + cpu_addr <= std_logic_vector(to_unsigned(a, 16)); + cpu_wdata <= (others=>'0'); + while (v_bdone = false) loop + wait until clk'event and clk='0'; + cpu_sel <= '1'; + if (cpu_rdata_dv = '1') then + if (cpu_rdata /= exp_d) then + fprint(str_out, "Read exp: 0x%s actual: 0x%s\n", to_string(to_bitvector(exp_d),"%08X"), to_string(to_bitvector(cpu_rdata),"%08X")); + report str_out severity error; + end if; + v_bdone := true; + cpu_sel <= '0'; + cpu_addr <= (others=>'0'); + end if; + end loop; + wait until clk'event and clk='0'; + wait until clk'event and clk='0'; +end; + +------------------------------------------------------------- +-- CPU read pulse definition RAM +-- make four 32-bit reads +------------------------------------------------------------- +procedure cpu_read_pulsedef( + signal clk : in std_logic; + + constant num_entry : in integer; + + -- TODO: Partial ? list of parameters + constant pulsetime : in integer; -- Pulse time in clock cycles + constant timefactor : in real; -- Fixed point time scale factor + constant gainfactor : in real; -- Fixed point gain value. Max value 1.0 is hex X"8000". Gain 0.5 is therefore X"4000" + constant wavestartaddr : in integer; -- Start address in waveform RAM + constant wavesteps : in integer; -- Number of steps in waveform rise and fall + constant wavetopwidth : in integer; -- Number of clock cycles in waveform top between end of rise and start of fall + + + signal cpu_sel : out std_logic; + signal cpu_wr : out std_logic; + signal cpu_addr : out std_logic_vector(15 downto 0); + signal cpu_wdata : out std_logic_vector(31 downto 0) +) is +-- Vectors for converted values +variable slv_pulsetime : std_logic_vector(23 downto 0); -- For 24-bit pulse time +variable slv_timefactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point timestep +variable slv_gainfactor : std_logic_vector(15 downto 0); -- For 16-bit fixed point gain +variable slv_wavestartaddr : std_logic_vector(11 downto 0); -- For 12-bit address i.e. 1024 point waveform RAM +variable slv_wavesteps : std_logic_vector( 9 downto 0); -- For 10-bit number of steps i.e. 0 = 1 step, X"3FF" = 1024 points +variable slv_wavetopwidth : std_logic_vector(16 downto 0); -- For 17-bit number of clock cycles in top of waveform + +-- constant ADR_PULSE_DEF : integer := to_integer(unsigned(X"?????")); -- Use address of pulse definition RAM from qlaser_pkg +-- Define the number of fractional bits +constant BIT_FRAC : integer := 4; -- TODO: this should be defined in qlaser_pkg +begin + + -- Convert each field into its std_logic_vector equivalent + slv_pulsetime := std_logic_vector(to_unsigned(pulsetime, 24)); + slv_timefactor := std_logic_vector(to_unsigned(integer(timefactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_gainfactor := std_logic_vector(to_unsigned(integer(gainfactor * real(2**BIT_FRAC)), 16)); -- Convert real to std_logic_vector keeping the fractional part + slv_wavestartaddr := std_logic_vector(to_unsigned(wavestartaddr, 12)); + slv_wavesteps := std_logic_vector(to_unsigned(wavesteps, 10)); + slv_wavetopwidth := std_logic_vector(to_unsigned(wavetopwidth, 17)); + + + --etc, etc. + -- 4 writes. (Address is an integer) + -- cpu_read(clk, ADR_RAM_PULSE+num_entry, x"00" & slv_pulsetime, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + -- cpu_read(clk, ADR_RAM_PULSE+(num_entry+1) , "00" & x"00" & slv_wavesteps & slv_wavestartaddr, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + -- cpu_read(clk, ADR_RAM_PULSE+(num_entry+2) , slv_timefactor & slv_gainfactor, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + -- cpu_read(clk, ADR_RAM_PULSE+(num_entry+3) , "0000000" & x"00" & slv_wavetopwidth, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + +end; + + +------------------------------------------------------------- +-- Delay +------------------------------------------------------------- +procedure clk_delay( + constant nclks : in integer +) is +begin + for I in 0 to nclks loop + wait until clk'event and clk ='0'; + end loop; +end; + + +---------------------------------------------------------------- +-- Print a string with no time or instance path. +---------------------------------------------------------------- +procedure cpu_print_msg( + constant msg : in string +) is +variable line_out : line; +begin + write(line_out, msg); + writeline(output, line_out); +end procedure cpu_print_msg; + + +begin + + ------------------------------------------------------------- + -- Unit Under Test + ------------------------------------------------------------- + u_dac_pulse : entity work.qlaser_dacs_pulse_channel + port map ( + clk => clk , -- in std_logic; + reset => reset , -- in std_logic; + + enable => enable , -- out std_logic; + start => start , -- out std_logic; + cnt_time => cnt_time , -- out std_logic_vector(23 downto 0); -- Set to '1' while SPI interface is busy + + busy => busy , -- out std_logic; -- Set to '1' while SPI interface is busy + + -- CPU interface + cpu_wr => cpu_wr , -- in std_logic; + cpu_sel => cpu_sel , -- in std_logic; + cpu_addr => cpu_addr(11 downto 0) , -- in std_logic_vector(11 downto 0); + cpu_wdata => cpu_wdata , -- in std_logic_vector(31 downto 0); + + cpu_rdata => cpu_rdata , -- out std_logic_vector(31 downto 0); + cpu_rdata_dv => cpu_rdata_dv , -- out std_logic; + + + -- AXI-Stream interface + axis_tready => axis_tready , -- in std_logic; -- Clock (50 MHz max) + axis_tdata => axis_tdata , -- out std_logic_vector(15 downto 0); + axis_tvalid => axis_tvalid , -- out std_logic; -- Master out, Slave in. (Data to DAC) + axis_tlast => axis_tlast -- out std_logic; -- Active low chip select (sync_n) + ); + + + ------------------------------------------------------------- + -- Generate system clock. Halt when sim_done is true. + ------------------------------------------------------------- + pr_clk : process + begin + clk <= '0'; + wait for (CLK_PER/2); + clk <= '1'; + wait for (CLK_PER-CLK_PER/2); + if (sim_done=true) then + wait; + end if; + end process; + + + ------------------------------------------------------------- + -- Reset and drive CPU bus + ------------------------------------------------------------- + pr_main : process + variable v_ndata32 : integer := 0; + variable v_ndata16 : integer := 0; + begin + -- Reset + reset <= '1'; + enable <= '0'; + start <= '0'; + cnt_time <= (others=>'0'); + + cpu_sel <= '0'; + cpu_wr <= '0'; + cpu_wdata <= (others=>'0'); + cpu_addr <= (others=>'0'); + + cpu_print_msg("Simulation start"); + clk_delay(5); + reset <= '0'; + + clk_delay(5); + enable <= '1'; + + + clk_delay(20); + + + ---------------------------------------------------------------- + -- Load pulse RAM with a series of pulse start times + ---------------------------------------------------------------- + v_ndata32 := 128; -- Time for first pulse + cpu_print_msg("Load pulse RAM"); + for NADDR in 0 to 255 loop + cpu_write_pulsedef(clk, NADDR*4, v_ndata32 + (NADDR*(1024+32)), 1.0, 1.0, 0, NADDR*32, 512, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + end loop; + cpu_print_msg("Pulse RAM loaded"); + clk_delay(20); + + -- ---------------------------------------------------------------- + -- -- Load waveform RAM with a simple ramp + -- -- Write two 16-bit values with each write + -- ---------------------------------------------------------------- + -- cpu_print_msg("Load waveform RAM"); + -- v_ndata16 := 1; -- first waveform value + -- for NADDR in 0 to 511 loop + -- v_ndata32 := (((v_ndata16+1) * 65536) + v_ndata16); + -- cpu_write(clk, (ADR_RAM_WAVE + NADDR) , v_ndata32, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + -- v_ndata16 := v_ndata16 + 2; + -- end loop; + -- cpu_print_msg("Waveform RAM loaded"); + -- clk_delay(20); + + + ---------------------------------------------------------------- + -- Read back Pulse RAM. + ---------------------------------------------------------------- + v_ndata32 := 128; -- Time for first pulse + for NADDR in 0 to 255 loop + cpu_read_pulsedef(clk, NADDR*4, v_ndata32 + (NADDR*(1024+32)), 1.0, 1.0, 0, NADDR*32, 512, cpu_sel, cpu_wr, cpu_addr, cpu_wdata); + end loop; + clk_delay(20); + + -- ---------------------------------------------------------------- + -- -- Read back Waveform RAM + -- ---------------------------------------------------------------- + -- v_ndata16 := 1; -- first waveform value + -- for NADDR in 0 to 511 loop + -- v_ndata32 := (((v_ndata16+1) * 65536) + v_ndata16); + -- cpu_read (clk, ADR_RAM_WAVE + NADDR , std_logic_vector(to_unsigned(v_ndata32, 32)) , cpu_sel, cpu_wr, cpu_addr, cpu_wdata, cpu_rdata, cpu_rdata_dv); + -- v_ndata16 := v_ndata16 + 2; + -- end loop; + + -- Done reg write/read check + cpu_print_msg("RAM readback completed"); + clk_delay(20); + + + ---------------------------------------------------------------- + -- Start the pulse outputs + ---------------------------------------------------------------- + clk_delay(5); + start <= '1'; + clk_delay(5); + start <= '0'; + + -- Wait for cnt_time to reach last pulse start time + waveform size + for NCNT in 1 to (128 + 16*(1024+32)+ 1024) loop + cnt_time <= std_logic_vector(unsigned(cnt_time) + 1); + clk_delay(0); + end loop; + + wait for 10 us; + + cpu_print_msg("Simulation done"); + clk_delay(5); + + sim_done <= true; + wait; + + end process; + +end behave; + diff --git a/src/python/README.md b/src/python/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/python/README.md @@ -0,0 +1 @@ + diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tools/README.md @@ -0,0 +1 @@ + diff --git a/tools/build_src/build.tcl b/tools/build_src/build.tcl new file mode 100644 index 0000000..9f4d687 --- /dev/null +++ b/tools/build_src/build.tcl @@ -0,0 +1,41 @@ +create_project zcu_pulse_channel ../../prj -force + +set_property board_part xilinx.com:zcu102:part0:3.4 [current_project] + +add_files {..\..\src\hdl\modules\qlaser_dacs_pulse_channel.vhdl} +add_files -fileset sim_1 {..\..\src\hdl\tb\tb_cpubus_dacs_pulse_channel.vhdl} +add_files {..\..\src\hdl\pkg\qlaser_dac_dc_pkg.vhd} +add_files {..\..\src\hdl\pkg\qlaser_pkg.vhd} +add_files {..\..\src\hdl\pkg\iopakp.vhd} +add_files {..\..\src\hdl\pkg\iopakb.vhd} +read_ip {..\xilinx-zcu\bram_pulseposition\bram_pulseposition.xci} +read_ip {..\xilinx-zcu\bram_waveform\bram_waveform.xci} +read_ip {..\xilinx-zcu\fifo_data_to_stream\fifo_data_to_stream.xci} +read_ip {..\xilinx-zcu\bram_pulse_definition\bram_pulse_definition.xci} + +# upgrade_ip [get_ips -filter {SCOPE !~ "*.bd"}] +generate_target all [get_ips -filter {SCOPE !~ "*.bd"}] + +# Run the synthesis and generate the IP output products +launch_runs synth_1 + +# Wait for the synthesis to complete +wait_on_run synth_1 + +# Generate the simulation models +proc recursive_glob {dir} { + set files [glob -nocomplain -type f -directory $dir *_sim_netlist.vhdl] + foreach subdir [glob -nocomplain -type d -directory $dir *] { + lappend files {*}[recursive_glob $subdir] + } + return $files +} + +set src_dir ../../prj/zcu_pulse_channel.gen/sources_1/ip/ +set files [recursive_glob $src_dir] + +foreach file $files { + file copy -force $file ../../src/hdl/ip_gen +} + +exit diff --git a/tools/sim/README.md b/tools/sim/README.md new file mode 100644 index 0000000..07c6b38 --- /dev/null +++ b/tools/sim/README.md @@ -0,0 +1,2 @@ +Please put your modelsim.ini file in this directory and compile modelsim in this directory. + diff --git a/tools/sim/compile.bat b/tools/sim/compile.bat new file mode 100644 index 0000000..90718fc --- /dev/null +++ b/tools/sim/compile.bat @@ -0,0 +1,2 @@ +echo off +vsim -c -quiet -do compile.do \ No newline at end of file diff --git a/tools/sim/compile.do b/tools/sim/compile.do new file mode 100644 index 0000000..90e2eb3 --- /dev/null +++ b/tools/sim/compile.do @@ -0,0 +1,8 @@ +vlib work + +vcom ../../src/hdl/ip_gen/*.vhd* +vcom ../../src/hdl/pkg/*pkg.vhd +vcom ../../src/hdl/pkg/iopakp.vhd +vcom ../../src/hdl/pkg/iopakb.vhd +vcom ../../src/hdl/modules/*.vhd* +vcom ../../src/hdl/tb/*.vhd* \ No newline at end of file diff --git a/tools/sim/run.bat b/tools/sim/run.bat new file mode 100644 index 0000000..814dbc5 --- /dev/null +++ b/tools/sim/run.bat @@ -0,0 +1,2 @@ +echo off +modelsim -do run.do \ No newline at end of file diff --git a/tools/sim/run.do b/tools/sim/run.do new file mode 100644 index 0000000..e54505a --- /dev/null +++ b/tools/sim/run.do @@ -0,0 +1,13 @@ +do compile.do + +vsim -voptargs="+acc" -lib work tb_cpubus_dacs_pulse_channel + +do waves_do/pp_rw_cpu.do + +view wave +view structure +view signals + +run -all + +# End diff --git a/tools/sim/waves_do/pp_rw_cpu.do b/tools/sim/waves_do/pp_rw_cpu.do new file mode 100644 index 0000000..918713f --- /dev/null +++ b/tools/sim/waves_do/pp_rw_cpu.do @@ -0,0 +1,34 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/reset +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/clk +add wave -noupdate -radix unsigned /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cnt_time +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/busy +add wave -noupdate -radix binary /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_addr +add wave -noupdate -radix hexadecimal /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_wdata +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_wr +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_sel +add wave -noupdate -radix hexadecimal /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_rdata +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/cpu_rdata_dv +add wave -noupdate -radix unsigned /tb_cpubus_dacs_pulse_channel/u_dac_pulse/ram_pulse_addra +add wave -noupdate -radix hexadecimal /tb_cpubus_dacs_pulse_channel/u_dac_pulse/ram_pulse_dina +add wave -noupdate -radix hexadecimal /tb_cpubus_dacs_pulse_channel/u_dac_pulse/ram_pulse_douta +add wave -noupdate /tb_cpubus_dacs_pulse_channel/u_dac_pulse/ram_pulse_we +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {480433536 fs} 0} +quietly wave cursor active 1 +configure wave -namecolwidth 150 +configure wave -valuecolwidth 172 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits fs +update +WaveRestoreZoom {0 fs} {1953088753 fs} diff --git a/tools/xilinx-zcu/bram_pulse_definition/bram_pulse_definition.xci b/tools/xilinx-zcu/bram_pulse_definition/bram_pulse_definition.xci new file mode 100644 index 0000000..3ce1f9d --- /dev/null +++ b/tools/xilinx-zcu/bram_pulse_definition/bram_pulse_definition.xci @@ -0,0 +1,419 @@ + + + xilinx.com + xci + unknown + 1.0 + + + bram_pulse_definition + + + 4096 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.0 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.0 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + OTHER + NONE + 8192 + 32 + 1 + + OTHER + NONE + 8192 + 32 + 1 + + + + 100000000 + 0 + 0 + 0.0 + 0 + 10 + 10 + 1 + 4 + 0 + 1 + 9 + 0 + 0 + 1 + NONE + 0 + 0 + 0 + ./ + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Estimated Power for IP : 4.238151 mW + zynquplus + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + bram_pulse_definition.mem + no_coe_file_loaded + 0 + 0 + 2 + 0 + 1 + 1024 + 1024 + 1 + 1 + 32 + 32 + 0 + 0 + CE + CE + ALL + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1024 + 1024 + WRITE_FIRST + WRITE_FIRST + 32 + 32 + zynquplus + 4 + Memory_Slave + AXI4_Full + false + Minimum_Area + false + 9 + NONE + no_coe_file_loaded + ALL + bram_pulse_definition + false + false + false + false + false + false + false + false + false + Always_Enabled + Always_Enabled + Single_Bit_Error_Injection + false + Native + false + no_mem_loaded + True_Dual_Port_RAM + WRITE_FIRST + WRITE_FIRST + 0 + 0 + BRAM + 0 + 100 + 100 + 50 + 100 + 100 + 50 + 8kx2 + false + false + 1 + 1 + 32 + 32 + false + false + false + false + 0 + false + false + CE + CE + SYNC + false + false + false + false + false + false + false + 1024 + 32 + 32 + No_ECC + false + false + false + Stand_Alone + zynquplus + xilinx.com:zcu102:part0:3.4 + + xczu9eg + ffvb1156 + VERILOG + + MIXED + -2 + + E + TRUE + TRUE + IP_Flow + 5 + TRUE + ../../../prj/zcu_pulse_channel.gen/sources_1/ip/bram_pulse_definition + + . + 2022.1 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/xilinx-zcu/bram_pulseposition/bram_pulseposition.xci b/tools/xilinx-zcu/bram_pulseposition/bram_pulseposition.xci new file mode 100644 index 0000000..0a7f774 --- /dev/null +++ b/tools/xilinx-zcu/bram_pulseposition/bram_pulseposition.xci @@ -0,0 +1,119 @@ + + + xilinx.com + xci + unknown + 1.0 + + + bram_pulseposition + + + 4 + 0 + 16 + ./ + zynquplus + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + no_coe_file_loaded + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 96 + bram_pulseposition + 0 + ce_overrides_sync_controls + no_coe_file_loaded + false + false + 96 + 0 + 16 + 16 + non_registered + false + false + non_registered + dual_port_ram + non_registered + false + false + false + false + non_registered + false + false + false + false + false + zynquplus + xilinx.com:zcu102:part0:3.4 + + xczu9eg + ffvb1156 + VERILOG + + MIXED + -2 + + E + TRUE + TRUE + IP_Flow + 13 + TRUE + ../../../prj/zcu_pulse_channel.gen/sources_1/ip/bram_pulseposition + + . + 2022.1 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + diff --git a/tools/xilinx-zcu/bram_waveform/bram_waveform.xci b/tools/xilinx-zcu/bram_waveform/bram_waveform.xci new file mode 100644 index 0000000..96cfc54 --- /dev/null +++ b/tools/xilinx-zcu/bram_waveform/bram_waveform.xci @@ -0,0 +1,419 @@ + + + xilinx.com + xci + unknown + 1.0 + + + bram_waveform + + + 4096 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.0 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.0 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + OTHER + NONE + 8192 + 32 + 1 + + OTHER + NONE + 8192 + 32 + 1 + + + + 100000000 + 0 + 0 + 0.0 + 0 + 11 + 12 + 1 + 4 + 0 + 1 + 9 + 0 + 0 + 2 + NONE + 0 + 0 + 0 + ./ + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Estimated Power for IP : 6.91608 mW + zynquplus + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + bram_waveform.mem + no_coe_file_loaded + 0 + 0 + 2 + 0 + 1 + 2048 + 4096 + 1 + 1 + 32 + 16 + 0 + 0 + CE + CE + ALL + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 2048 + 4096 + WRITE_FIRST + WRITE_FIRST + 32 + 16 + zynquplus + 4 + Memory_Slave + AXI4_Full + false + Minimum_Area + false + 9 + NONE + no_coe_file_loaded + ALL + bram_waveform + false + false + false + false + false + false + false + false + false + Always_Enabled + Always_Enabled + Single_Bit_Error_Injection + false + Native + false + no_mem_loaded + True_Dual_Port_RAM + WRITE_FIRST + WRITE_FIRST + 0 + 0 + BRAM + 0 + 100 + 100 + 50 + 100 + 100 + 50 + 8kx2 + false + false + 1 + 1 + 32 + 16 + false + false + false + false + 0 + false + false + CE + CE + SYNC + false + false + false + false + false + false + false + 2048 + 32 + 16 + No_ECC + false + false + false + Stand_Alone + zynquplus + xilinx.com:zcu102:part0:3.4 + + xczu9eg + ffvb1156 + VERILOG + + MIXED + -2 + + E + TRUE + TRUE + IP_Flow + 5 + TRUE + ../../../prj/zcu_pulse_channel.gen/sources_1/ip/bram_waveform + + . + 2022.1 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/xilinx-zcu/fifo_data_to_stream/fifo_data_to_stream.xci b/tools/xilinx-zcu/fifo_data_to_stream/fifo_data_to_stream.xci new file mode 100644 index 0000000..28c743e --- /dev/null +++ b/tools/xilinx-zcu/fifo_data_to_stream/fifo_data_to_stream.xci @@ -0,0 +1,635 @@ + + + xilinx.com + xci + unknown + 1.0 + + + fifo_data_to_stream + + + + + + + 100000000 + 0 + 0 + 0.0 + + + + 100000000 + 0 + 0 + 0.0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.0 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + + 100000000 + 0 + 0 + 0 + 0 + 0 + undef + 0.0 + 0 + 0 + 0 + 0 + + + + + 100000000 + 0 + 0 + 0.0 + + + 100000000 + 0 + 0 + 0.0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.0 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + + 100000000 + 0 + 0 + 0 + 0 + 0 + undef + 0.0 + 0 + 0 + 0 + 0 + + + + + 100000000 + 0 + 0 + 0.0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 1 + 1 + 1 + 4 + 0 + 32 + 1 + 1 + 1 + 64 + 1 + 8 + 1 + 1 + 1 + 1 + 1 + 0 + 9 + BlankString + 32 + 1 + 32 + 64 + 1 + 64 + 2 + 0 + 16 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + zynquplus + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 6 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 4 + BlankString + 1 + 0 + 0 + 0 + 2 + 1 + 512x36 + 1kx18 + 512x36 + 512x72 + 512x36 + 512x72 + 512x36 + 2 + 1022 + 1022 + 1022 + 1022 + 1022 + 1022 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 510 + 1023 + 1023 + 1023 + 1023 + 1023 + 1023 + 509 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 10 + 1024 + 1 + 10 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 9 + 512 + 1024 + 16 + 1024 + 16 + 1024 + 16 + 1 + 9 + 10 + 4 + 10 + 4 + 10 + 4 + 1 + 32 + 0 + 0 + false + false + false + 0 + 0 + Slave_Interface_Clock_Enable + Common_Clock + fifo_data_to_stream + 64 + false + 9 + false + false + 0 + 2 + 1022 + 1022 + 1022 + 1022 + 1022 + 1022 + 3 + false + false + false + false + false + false + false + false + false + Hard_ECC + false + false + false + false + false + false + true + false + false + true + Data_FIFO + Data_FIFO + Data_FIFO + Data_FIFO + Data_FIFO + Data_FIFO + Common_Clock_Block_RAM + Common_Clock_Block_RAM + Common_Clock_Block_RAM + Common_Clock_Block_RAM + Common_Clock_Block_RAM + Common_Clock_Block_RAM + Common_Clock_Builtin_FIFO + 0 + 510 + 1023 + 1023 + 1023 + 1023 + 1023 + 1023 + 509 + false + false + false + 0 + Native + false + false + false + false + false + false + false + false + false + false + false + false + false + false + 32 + 512 + 1024 + 16 + 1024 + 16 + 1024 + 16 + false + 16 + 1024 + Embedded_Reg + false + false + Active_High + Active_High + AXI4 + Standard_FIFO + No_Programmable_Empty_Threshold + No_Programmable_Empty_Threshold + No_Programmable_Empty_Threshold + No_Programmable_Empty_Threshold + No_Programmable_Empty_Threshold + No_Programmable_Empty_Threshold + No_Programmable_Empty_Threshold + No_Programmable_Full_Threshold + No_Programmable_Full_Threshold + No_Programmable_Full_Threshold + No_Programmable_Full_Threshold + No_Programmable_Full_Threshold + No_Programmable_Full_Threshold + No_Programmable_Full_Threshold + READ_WRITE + 0 + 1 + false + 10 + Fully_Registered + Fully_Registered + Fully_Registered + Fully_Registered + Fully_Registered + Fully_Registered + true + Synchronous_Reset + false + 1 + 0 + 0 + 1 + 1 + 4 + false + false + Active_High + Active_High + true + true + false + false + false + Active_High + 0 + false + Active_High + 1 + false + 9 + true + FIFO + false + false + false + false + FIFO + FIFO + 2 + 2 + false + FIFO + FIFO + FIFO + zynquplus + xilinx.com:zcu102:part0:3.4 + + xczu9eg + ffvb1156 + VERILOG + + MIXED + -2 + + E + TRUE + TRUE + IP_Flow + 7 + TRUE + ../../../prj/zcu_pulse_channel.gen/sources_1/ip/fifo_data_to_stream + + . + 2022.1 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/xilinx-zcu/pinout_zcu.xdc b/tools/xilinx-zcu/pinout_zcu.xdc new file mode 100644 index 0000000..4584d12 --- /dev/null +++ b/tools/xilinx-zcu/pinout_zcu.xdc @@ -0,0 +1,73 @@ +## 300MHz Clock from USER_SI570 +set_property PACKAGE_PIN AL7 [get_ports "p_clk_n"] ;# Bank 64 VCCO - VCC1V2 - IO_L12N_T1U_N11_GC_64 +set_property IOSTANDARD DIFF_SSTL12 [get_ports "p_clk_n"] ;# Bank 64 VCCO - VCC1V2 - IO_L12N_T1U_N11_GC_64 +set_property PACKAGE_PIN AL8 [get_ports "p_clk_p"] ;# Bank 64 VCCO - VCC1V2 - IO_L12P_T1U_N10_GC_64 +set_property IOSTANDARD DIFF_SSTL12 [get_ports "p_clk_p"] ;# Bank 64 VCCO - VCC1V2 - IO_L12P_T1U_N10_GC_64 + +## Buttons SW_C +# set_property -dict {PACKAGE_PIN C17 IOSTANDARD LVCMOS33} [get_ports p_reset] + +set_property PACKAGE_PIN AG13 [get_ports "p_reset"] ;# Bank 44 VCCO - VCC3V3 - IO_L10N_AD2N_44 +set_property IOSTANDARD LVCMOS33 [get_ports "p_reset"] ;# Bank 44 VCCO - VCC3V3 - IO_L10N_AD2N_44 +## LEDs +set_property PACKAGE_PIN AG14 [get_ports "p_leds_0"] ;# Bank 44 VCCO - VCC3V3 - IO_L10P_AD2P_44 +set_property IOSTANDARD LVCMOS33 [get_ports "p_leds_0"] ;# Bank 44 VCCO - VCC3V3 - IO_L10P_AD2P_44 +set_property PACKAGE_PIN AF13 [get_ports "p_leds_1"] ;# Bank 44 VCCO - VCC3V3 - IO_L9N_AD3N_44 +set_property IOSTANDARD LVCMOS33 [get_ports "p_leds_1"] ;# Bank 44 VCCO - VCC3V3 - IO_L9N_AD3N_44 +set_property PACKAGE_PIN AE13 [get_ports "p_leds_2"] ;# Bank 44 VCCO - VCC3V3 - IO_L9P_AD3P_44 +set_property IOSTANDARD LVCMOS33 [get_ports "p_leds_2"] ;# Bank 44 VCCO - VCC3V3 - IO_L9P_AD3P_44 +set_property PACKAGE_PIN AJ14 [get_ports "p_leds_3"] ;# Bank 44 VCCO - VCC3V3 - IO_L8N_HDGC_AD4N_44 +set_property IOSTANDARD LVCMOS33 [get_ports "p_leds_3"] ;# Bank 44 VCCO - VCC3V3 - IO_L8N_HDGC_AD4N_44 +set_property PACKAGE_PIN AJ15 [get_ports "p_leds_4"] ;# Bank 44 VCCO - VCC3V3 - IO_L8P_HDGC_AD4P_44 +set_property IOSTANDARD LVCMOS33 [get_ports "p_leds_4"] ;# Bank 44 VCCO - VCC3V3 - IO_L8P_HDGC_AD4P_44 +set_property PACKAGE_PIN AH13 [get_ports "p_leds_5"] ;# Bank 44 VCCO - VCC3V3 - IO_L7N_HDGC_AD5N_44 +set_property IOSTANDARD LVCMOS33 [get_ports "p_leds_5"] ;# Bank 44 VCCO - VCC3V3 - IO_L8P_HDGC_AD4P_44 + +# set_property -dict {PACKAGE_PIN A17 IOSTANDARD LVCMOS33} [get_ports {p_leds0_rgb[0]}] +# set_property -dict {PACKAGE_PIN B16 IOSTANDARD LVCMOS33} [get_ports {p_leds0_rgb[1]}] +# set_property -dict {PACKAGE_PIN B17 IOSTANDARD LVCMOS33} [get_ports {p_leds0_rgb[2]}] + +# set_property -dict {PACKAGE_PIN A16 IOSTANDARD LVCMOS33} [get_ports {p_leds1_rgb[0]}] +# set_property -dict {PACKAGE_PIN A18 IOSTANDARD LVCMOS33} [get_ports {p_leds1_rgb[1]}] +# set_property -dict {PACKAGE_PIN A19 IOSTANDARD LVCMOS33} [get_ports {p_leds1_rgb[2]}] + + +## Pmod Header J55 +set_property PACKAGE_PIN A20 [get_ports "p_dc0_cs_n"] ;# Bank 47 VCCO - VCC3V3 - IO_L12N_AD0N_47 +set_property IOSTANDARD LVCMOS33 [get_ports "p_dc0_cs_n"] ;# Bank 47 VCCO - VCC3V3 - IO_L12N_AD0N_47 +set_property PACKAGE_PIN B20 [get_ports "p_dc0_mosi"] ;# Bank 47 VCCO - VCC3V3 - IO_L12P_AD0P_47 +set_property IOSTANDARD LVCMOS33 [get_ports "p_dc0_mosi"] ;# Bank 47 VCCO - VCC3V3 - IO_L12P_AD0P_47 +# set_property PACKAGE_PIN A22 [get_ports "p_dc0_nc"] ;# Bank 47 VCCO - VCC3V3 - IO_L11N_AD1N_47 +# set_property IOSTANDARD LVCMOS33 [get_ports "p_dc0_nc"] ;# Bank 47 VCCO - VCC3V3 - IO_L11N_AD1N_47 +set_property PACKAGE_PIN A21 [get_ports "p_dc0_sclk"] ;# Bank 47 VCCO - VCC3V3 - IO_L11P_AD1P_47 +set_property IOSTANDARD LVCMOS33 [get_ports "p_dc0_sclk"] ;# Bank 47 VCCO - VCC3V3 - IO_L11P_AD1P_47 +set_property PACKAGE_PIN B21 [get_ports "p_dc1_cs_n"] ;# Bank 47 VCCO - VCC3V3 - IO_L10N_AD2N_47 +set_property IOSTANDARD LVCMOS33 [get_ports "p_dc1_cs_n"] ;# Bank 47 VCCO - VCC3V3 - IO_L10N_AD2N_47 +set_property PACKAGE_PIN C21 [get_ports "p_dc1_mosi"] ;# Bank 47 VCCO - VCC3V3 - IO_L10P_AD2P_47 +set_property IOSTANDARD LVCMOS33 [get_ports "p_dc1_mosi"] ;# Bank 47 VCCO - VCC3V3 - IO_L10P_AD2P_47 +# set_property PACKAGE_PIN C22 [get_ports "p_dc1_nc"] ;# Bank 47 VCCO - VCC3V3 - IO_L9N_AD3N_47 +# set_property IOSTANDARD LVCMOS33 [get_ports "p_dc1_nc"] ;# Bank 47 VCCO - VCC3V3 - IO_L9N_AD3N_47 +set_property PACKAGE_PIN D21 [get_ports "p_dc1_sclk"] ;# Bank 47 VCCO - VCC3V3 - IO_L9P_AD3P_47 +set_property IOSTANDARD LVCMOS33 [get_ports "p_dc1_sclk"] ;# Bank 47 VCCO - VCC3V3 - IO_L9P_AD3P_47 + +## Pmod Header J87 +set_property PACKAGE_PIN D20 [get_ports "p_dc2_cs_n"] ;# Bank 47 VCCO - VCC3V3 - IO_L8N_HDGC_AD4N_47 +set_property IOSTANDARD LVCMOS33 [get_ports "p_dc2_cs_n"] ;# Bank 47 VCCO - VCC3V3 - IO_L8N_HDGC_AD4N_47 +set_property PACKAGE_PIN E20 [get_ports "p_dc2_mosi"] ;# Bank 47 VCCO - VCC3V3 - IO_L8P_HDGC_AD4P_47 +set_property IOSTANDARD LVCMOS33 [get_ports "p_dc2_mosi"] ;# Bank 47 VCCO - VCC3V3 - IO_L8P_HDGC_AD4P_47 +set_property PACKAGE_PIN E22 [get_ports "p_dc2_sclk"] ;# Bank 47 VCCO - VCC3V3 - IO_L7N_HDGC_AD5N_47 +set_property IOSTANDARD LVCMOS33 [get_ports "p_dc2_sclk"] ;# Bank 47 VCCO - VCC3V3 - IO_L7N_HDGC_AD5N_47 + +# UART +set_property PACKAGE_PIN E13 [get_ports "p_serial_rxd"] ;# Bank 49 VCCO - VCC3V3 - IO_L12N_AD8N_49 +set_property IOSTANDARD LVCMOS33 [get_ports "p_serial_rxd"] ;# Bank 49 VCCO - VCC3V3 - IO_L12N_AD8N_49 +set_property PACKAGE_PIN F13 [get_ports "p_serial_txd"] ;# Bank 49 VCCO - VCC3V3 - IO_L12P_AD8P_49 +set_property IOSTANDARD LVCMOS33 [get_ports "p_serial_txd"] ;# Bank 49 VCCO - VCC3V3 - IO_L12P_AD8P_49 + +# UART Debug (unsure, maybe just indicator LEDs?) +set_property PACKAGE_PIN D12 [get_ports "p_debug_out[0]"] ;# Bank 49 VCCO - VCC3V3 - IO_L11N_AD9N_49 +set_property IOSTANDARD LVCMOS33 [get_ports "p_debug_out[0]"] ;# Bank 49 VCCO - VCC3V3 - IO_L11N_AD9N_49 +set_property PACKAGE_PIN E12 [get_ports "p_debug_out[1]"] ;# Bank 49 VCCO - VCC3V3 - IO_L11P_AD9P_49 +set_property IOSTANDARD LVCMOS33 [get_ports "p_debug_out[1]"] ;# Bank 49 VCCO - VCC3V3 - IO_L11P_AD9P_49 + + diff --git a/tools/xilinx-zcu/qlaser_timing_zcu.xdc b/tools/xilinx-zcu/qlaser_timing_zcu.xdc new file mode 100644 index 0000000..348918d --- /dev/null +++ b/tools/xilinx-zcu/qlaser_timing_zcu.xdc @@ -0,0 +1,3 @@ +## 125MHz Clock from Ethernet PHY +create_clock -period 3.333 -name sys_clk_pin -waveform {0.000 1.667} -add [get_ports p_clk_p] +create_clock -period 3.333 -name sys_clk_pin -waveform {0.000 1.667} -add [get_ports p_clk_n] diff --git a/tools/xilinx-zcu/set_usercode_zcu.xdc b/tools/xilinx-zcu/set_usercode_zcu.xdc new file mode 100644 index 0000000..3288be0 --- /dev/null +++ b/tools/xilinx-zcu/set_usercode_zcu.xdc @@ -0,0 +1,29 @@ +##--------------------------------------------------------------------------------------- +## Filename : set_usercode.xdc +## +## Vivado onstraint file to set user version number into the bitfile +##--------------------------------------------------------------------------------------- + +#---------------------------------------------------------------------------------------- +#-- Usercode major revisions +#---------------------------------------------------------------------------------------- +#-- 0x0000_NNNN : Early debug and test. No PMODs,ZMODs, DACs etc +#-- 0x1AC0_NNNN : DC PMODs, 4? single bit pulses. NNN incremented each bitfile +#-- 0x1DC0_NNNN : DC PMODs DAC versions. NNN incremented each bitfile +#-- 0x2AC0_NNNN : DC PMODs, AC ZMODs. 4 channel NNN incremented each bitfile +#-- 0x3AC0_NNNN : DC PMODs, JESD AC (16ch Abaco board) NNN incremented each bitfile +# +#---------------------------------------------------------------------------------------- +#-- Usercode history +#---------------------------------------------------------------------------------------- +#-- 0x1DC0_0001 : Original release +#-- 0x1DC0_0002 : Modified double blink and added QSPI and SD into the PS1 block +#-- 0x1DC0_0003 : SD pins on 1.8V bank. Add SD_CD on MIO47 +#-- 0x1DC0_0004 : SD clock dropped from 100MHz to 20Mhz +#-- 0x1DC0_0005 : Restore internal reference enable for pmod DACs +#-- 0x3AC0_0006 : Existing working codes ported to ZCU102 +#-- +#---------------------------------------------------------------------------------------- +# In VHDL package : constant C_QLASER_VERSION : std_logic_vector(31 downto 0) +#---------------------------------------------------------------------------------------- +set_property BITSTREAM.CONFIG.USERID 32'h3AC00006 [current_design] diff --git a/tools/xilinx/README.md b/tools/xilinx/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tools/xilinx/README.md @@ -0,0 +1 @@ + diff --git a/tools/xilinx/build_project.tcl b/tools/xilinx/build_project.tcl new file mode 100644 index 0000000..1400ac9 --- /dev/null +++ b/tools/xilinx/build_project.tcl @@ -0,0 +1,597 @@ +#***************************************************************************************** +# Vivado (TM) v2018.2 (64-bit) +# +# build_project.tcl: Tcl script for re-creating project 'qlaser_eclypse7' +# +# Generated by Vivado on Thu Feb 16 16:07:58 -0800 2023 +# IP Build 2256618 on Thu Jun 14 22:10:49 MDT 2018 +# +# This file contains the Vivado Tcl commands for re-creating the project to the state* +# when this script was generated. In order to re-create the project, please source this +# file in the Vivado Tcl Shell. +# +# * Note that the runs in the created project will be configured the same way as the +# original project, however they will not be launched automatically. To regenerate the +# run results please launch the synthesis/implementation runs as needed. +# +#***************************************************************************************** +# NOTE: In order to use this script for source control purposes, please make sure that the +# following files are added to the source control system:- +# +# 1. This project restoration tcl script (build_project.tcl) that was generated. +# +# 2. The following source(s) files that were local or imported into the original project. +# (Please see the '$orig_proj_dir' and '$origin_dir' variable setting below at the start of the script) +# +# "D:/Work/UW-Quantum/tools/Vivado2018_2/qlaser_eclypse7/qlaser_eclypse7.srcs/sources_1/bd/ps1/ps1.bd" +# "D:/Work/UW-Quantum/tools/Vivado2018_2/qlaser_eclypse7/qlaser_eclypse7.srcs/sources_1/bd/ps1/hdl/ps1_wrapper.vhd" +# "D:/Work/UW-Quantum/tools/Vivado2018_2/qlaser_eclypse7/qlaser_eclypse7.srcs/sources_1/ip/clkpll/clkpll.xci" +# +# 3. The following remote source files that were added to the original project:- +# +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/fpga/qlaser_pkg.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/fpga/blink.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/fpga/clkreset.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/serial_io/nc3_cpu2uart.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/serial_io/nc3_serial_pkg_100MHz.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/serial_io/nc3_uart.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/serial_io/nc3_uart2cpu.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/serial_io/qlaser_cpuint_serial.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/fpga/qlaser_dac_dc_package.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/fpga/qlaser_spi.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/fpga/qlaser_dacs_dc.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/fpga/qlaser_dacs_pulse.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/fpga/qlaser_version_pkg.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/fpga/qlaser_misc.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/src/hdl/fpga/qlaser_top.vhd" +# "D:/Work/UW-Quantum/github/NANO_QLASER/tools/xilinx/pinout.xdc" +# "D:/Work/UW-Quantum/github/NANO_QLASER/tools/xilinx/set_usercode.xdc" +# "D:/Work/UW-Quantum/github/NANO_QLASER/tools/xilinx/qlaser_timing.xdc" +# +#***************************************************************************************** + +# Set the reference directory for source file relative paths (by default the value is script directory path) +set origin_dir "." + +# Use origin directory path location variable, if specified in the tcl shell +if { [info exists ::origin_dir_loc] } { + set origin_dir $::origin_dir_loc +} + +# Set the project name +set _xil_proj_name_ "qlaser_eclypse7" + +# Use project name variable, if specified in the tcl shell +if { [info exists ::user_project_name] } { + set _xil_proj_name_ $::user_project_name +} + +variable script_file +set script_file "build_project.tcl" + +# Help information for this script +proc help {} { + variable script_file + puts "\nDescription:" + puts "Recreate a Vivado project from this script. The created project will be" + puts "functionally equivalent to the original project for which this script was" + puts "generated. The script contains commands for creating a project, filesets," + puts "runs, adding/importing sources and setting properties on various objects.\n" + puts "Syntax:" + puts "$script_file" + puts "$script_file -tclargs \[--origin_dir \]" + puts "$script_file -tclargs \[--project_name \]" + puts "$script_file -tclargs \[--help\]\n" + puts "Usage:" + puts "Name Description" + puts "-------------------------------------------------------------------------" + puts "\[--origin_dir \] Determine source file paths wrt this path. Default" + puts " origin_dir path value is \".\", otherwise, the value" + puts " that was set with the \"-paths_relative_to\" switch" + puts " when this script was generated.\n" + puts "\[--project_name \] Create project with the specified name. Default" + puts " name is the name of the project from where this" + puts " script was generated.\n" + puts "\[--help\] Print help information for this script" + puts "-------------------------------------------------------------------------\n" + exit 0 +} + +if { $::argc > 0 } { + for {set i 0} {$i < $::argc} {incr i} { + set option [string trim [lindex $::argv $i]] + switch -regexp -- $option { + "--origin_dir" { incr i; set origin_dir [lindex $::argv $i] } + "--project_name" { incr i; set _xil_proj_name_ [lindex $::argv $i] } + "--help" { help } + default { + if { [regexp {^-} $option] } { + puts "ERROR: Unknown option '$option' specified, please type '$script_file -tclargs --help' for usage info.\n" + return 1 + } + } + } + } +} + +# Set the directory path for the original project from where this script was exported +set orig_proj_dir "[file normalize "$origin_dir/../../../../tools/Vivado2018_2/qlaser_eclypse7"]" + +# Create project +create_project ${_xil_proj_name_} ./${_xil_proj_name_} -part xc7z020clg484-1 + +# Set the directory path for the new project +set proj_dir [get_property directory [current_project]] + +# Reconstruct message rules +# None + +# Set project properties +set obj [current_project] +set_property -name "board_part" -value "digilentinc.com:eclypse-z7:part0:1.1" -objects $obj +set_property -name "default_lib" -value "xil_defaultlib" -objects $obj +set_property -name "dsa.accelerator_binary_content" -value "bitstream" -objects $obj +set_property -name "dsa.accelerator_binary_format" -value "xclbin2" -objects $obj +set_property -name "dsa.board_id" -value "eclypse-z7" -objects $obj +set_property -name "dsa.description" -value "Vivado generated DSA" -objects $obj +set_property -name "dsa.dr_bd_base_address" -value "0" -objects $obj +set_property -name "dsa.emu_dir" -value "emu" -objects $obj +set_property -name "dsa.flash_interface_type" -value "bpix16" -objects $obj +set_property -name "dsa.flash_offset_address" -value "0" -objects $obj +set_property -name "dsa.flash_size" -value "1024" -objects $obj +set_property -name "dsa.host_architecture" -value "x86_64" -objects $obj +set_property -name "dsa.host_interface" -value "pcie" -objects $obj +set_property -name "dsa.num_compute_units" -value "60" -objects $obj +set_property -name "dsa.platform_state" -value "pre_synth" -objects $obj +set_property -name "dsa.uses_pr" -value "1" -objects $obj +set_property -name "dsa.vendor" -value "xilinx" -objects $obj +set_property -name "dsa.version" -value "0.0" -objects $obj +set_property -name "enable_vhdl_2008" -value "1" -objects $obj +set_property -name "ip_cache_permissions" -value "read write" -objects $obj +set_property -name "ip_output_repo" -value "$proj_dir/${_xil_proj_name_}.cache/ip" -objects $obj +set_property -name "mem.enable_memory_map_generation" -value "1" -objects $obj +set_property -name "sim.central_dir" -value "$proj_dir/${_xil_proj_name_}.ip_user_files" -objects $obj +set_property -name "sim.ip.auto_export_scripts" -value "1" -objects $obj +set_property -name "simulator_language" -value "Mixed" -objects $obj +set_property -name "target_language" -value "VHDL" -objects $obj +set_property -name "webtalk.activehdl_export_sim" -value "6" -objects $obj +set_property -name "webtalk.ies_export_sim" -value "6" -objects $obj +set_property -name "webtalk.modelsim_export_sim" -value "6" -objects $obj +set_property -name "webtalk.questa_export_sim" -value "6" -objects $obj +set_property -name "webtalk.riviera_export_sim" -value "6" -objects $obj +set_property -name "webtalk.vcs_export_sim" -value "6" -objects $obj +set_property -name "webtalk.xsim_export_sim" -value "6" -objects $obj +set_property -name "xpm_libraries" -value "XPM_CDC XPM_FIFO XPM_MEMORY" -objects $obj + +# Create 'sources_1' fileset (if not found) +if {[string equal [get_filesets -quiet sources_1] ""]} { + create_fileset -srcset sources_1 +} + +# Set IP repository paths +set obj [get_filesets sources_1] +set_property "ip_repo_paths" "[file normalize "$origin_dir/../../../../../Common/IP_GJED"]" $obj + +# Rebuild user ip_repo's index before adding any source files +update_ip_catalog -rebuild + +# Set 'sources_1' fileset object +set obj [get_filesets sources_1] +set files [list \ + [file normalize "${origin_dir}/../../src/hdl/fpga/qlaser_pkg.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/fpga/blink.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/fpga/clkreset.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/serial_io/nc3_cpu2uart.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/serial_io/nc3_serial_pkg_100MHz.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/serial_io/nc3_uart.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/serial_io/nc3_uart2cpu.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/serial_io/qlaser_cpuint_serial.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/fpga/qlaser_dac_dc_package.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/fpga/qlaser_spi.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/fpga/qlaser_dacs_dc.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/fpga/qlaser_dacs_pulse.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/fpga/qlaser_version_pkg.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/fpga/qlaser_misc.vhd"] \ + [file normalize "${origin_dir}/../../src/hdl/fpga/qlaser_top.vhd"] \ +] +add_files -norecurse -fileset $obj $files + +# Add local files from the original project (-no_copy_sources specified) +set files [list \ + [file normalize "${origin_dir}/../../../../tools/Vivado2018_2/qlaser_eclypse7/qlaser_eclypse7.srcs/sources_1/bd/ps1/ps1.bd" ]\ + [file normalize "${origin_dir}/../../../../tools/Vivado2018_2/qlaser_eclypse7/qlaser_eclypse7.srcs/sources_1/bd/ps1/hdl/ps1_wrapper.vhd" ]\ +] +set added_files [add_files -fileset sources_1 $files] + +# Set 'sources_1' fileset file properties for remote files +set file "$origin_dir/../../src/hdl/fpga/qlaser_pkg.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/fpga/blink.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/fpga/clkreset.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/serial_io/nc3_cpu2uart.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/serial_io/nc3_serial_pkg_100MHz.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/serial_io/nc3_uart.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/serial_io/nc3_uart2cpu.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/serial_io/qlaser_cpuint_serial.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/fpga/qlaser_dac_dc_package.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/fpga/qlaser_spi.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/fpga/qlaser_dacs_dc.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/fpga/qlaser_dacs_pulse.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/fpga/qlaser_version_pkg.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/fpga/qlaser_misc.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + +set file "$origin_dir/../../src/hdl/fpga/qlaser_top.vhd" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + + +# Set 'sources_1' fileset file properties for local files +set file "ps1/ps1.bd" +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "registered_with_manager" -value "1" -objects $file_obj + +set file "hdl/ps1_wrapper.vhd" +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "file_type" -value "VHDL" -objects $file_obj + + +# Set 'sources_1' fileset properties +set obj [get_filesets sources_1] +set_property -name "top" -value "qlaser_top" -objects $obj + +# Set 'sources_1' fileset object +set obj [get_filesets sources_1] +# Add local files from the original project (-no_copy_sources specified) +set files [list \ + [file normalize "${origin_dir}/../../../../tools/Vivado2018_2/qlaser_eclypse7/qlaser_eclypse7.srcs/sources_1/ip/clkpll/clkpll.xci" ]\ +] +set added_files [add_files -fileset sources_1 $files] + +# Set 'sources_1' fileset file properties for remote files +# None + +# Set 'sources_1' fileset file properties for local files +set file "clkpll/clkpll.xci" +set file_obj [get_files -of_objects [get_filesets sources_1] [list "*$file"]] +set_property -name "generate_files_for_reference" -value "0" -objects $file_obj +set_property -name "registered_with_manager" -value "1" -objects $file_obj +if { ![get_property "is_locked" $file_obj] } { + set_property -name "synth_checkpoint_mode" -value "Singular" -objects $file_obj +} + + +# Create 'constrs_1' fileset (if not found) +if {[string equal [get_filesets -quiet constrs_1] ""]} { + create_fileset -constrset constrs_1 +} + +# Set 'constrs_1' fileset object +set obj [get_filesets constrs_1] + +# Add/Import constrs file and set constrs file properties +set file "[file normalize "$origin_dir/pinout.xdc"]" +set file_added [add_files -norecurse -fileset $obj [list $file]] +set file "$origin_dir/pinout.xdc" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets constrs_1] [list "*$file"]] +set_property -name "file_type" -value "XDC" -objects $file_obj + +# Add/Import constrs file and set constrs file properties +set file "[file normalize "$origin_dir/set_usercode.xdc"]" +set file_added [add_files -norecurse -fileset $obj [list $file]] +set file "$origin_dir/set_usercode.xdc" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets constrs_1] [list "*$file"]] +set_property -name "file_type" -value "XDC" -objects $file_obj + +# Add/Import constrs file and set constrs file properties +set file "[file normalize "$origin_dir/qlaser_timing.xdc"]" +set file_added [add_files -norecurse -fileset $obj [list $file]] +set file "$origin_dir/qlaser_timing.xdc" +set file [file normalize $file] +set file_obj [get_files -of_objects [get_filesets constrs_1] [list "*$file"]] +set_property -name "file_type" -value "XDC" -objects $file_obj + +# Set 'constrs_1' fileset properties +set obj [get_filesets constrs_1] + +# Create 'sim_1' fileset (if not found) +if {[string equal [get_filesets -quiet sim_1] ""]} { + create_fileset -simset sim_1 +} + +# Set 'sim_1' fileset object +set obj [get_filesets sim_1] +# Empty (no sources present) + +# Set 'sim_1' fileset properties +set obj [get_filesets sim_1] +set_property -name "sim_mode" -value "post-implementation" -objects $obj +set_property -name "top" -value "qlaser_top" -objects $obj +set_property -name "top_lib" -value "xil_defaultlib" -objects $obj + +# Create 'synth_1' run (if not found) +if {[string equal [get_runs -quiet synth_1] ""]} { + create_run -name synth_1 -part xc7z020clg484-1 -flow {Vivado Synthesis 2018} -strategy "Vivado Synthesis Defaults" -report_strategy {No Reports} -constrset constrs_1 +} else { + set_property strategy "Vivado Synthesis Defaults" [get_runs synth_1] + set_property flow "Vivado Synthesis 2018" [get_runs synth_1] +} +set obj [get_runs synth_1] +set_property set_report_strategy_name 1 $obj +set_property report_strategy {Vivado Synthesis Default Reports} $obj +set_property set_report_strategy_name 0 $obj +# Create 'synth_1_synth_report_utilization_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs synth_1] synth_1_synth_report_utilization_0] "" ] } { + create_report_config -report_name synth_1_synth_report_utilization_0 -report_type report_utilization:1.0 -steps synth_design -runs synth_1 +} +set obj [get_report_configs -of_objects [get_runs synth_1] synth_1_synth_report_utilization_0] +if { $obj != "" } { + +} +set obj [get_runs synth_1] +set_property -name "needs_refresh" -value "1" -objects $obj +set_property -name "strategy" -value "Vivado Synthesis Defaults" -objects $obj + +# set the current synth run +current_run -synthesis [get_runs synth_1] + +# Create 'impl_1' run (if not found) +if {[string equal [get_runs -quiet impl_1] ""]} { + create_run -name impl_1 -part xc7z020clg484-1 -flow {Vivado Implementation 2018} -strategy "Vivado Implementation Defaults" -report_strategy {No Reports} -constrset constrs_1 -parent_run synth_1 +} else { + set_property strategy "Vivado Implementation Defaults" [get_runs impl_1] + set_property flow "Vivado Implementation 2018" [get_runs impl_1] +} +set obj [get_runs impl_1] +set_property set_report_strategy_name 1 $obj +set_property report_strategy {Vivado Implementation Default Reports} $obj +set_property set_report_strategy_name 0 $obj +# Create 'impl_1_init_report_timing_summary_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_init_report_timing_summary_0] "" ] } { + create_report_config -report_name impl_1_init_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps init_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_init_report_timing_summary_0] +if { $obj != "" } { +set_property -name "is_enabled" -value "0" -objects $obj + +} +# Create 'impl_1_opt_report_drc_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_opt_report_drc_0] "" ] } { + create_report_config -report_name impl_1_opt_report_drc_0 -report_type report_drc:1.0 -steps opt_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_opt_report_drc_0] +if { $obj != "" } { + +} +# Create 'impl_1_opt_report_timing_summary_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_opt_report_timing_summary_0] "" ] } { + create_report_config -report_name impl_1_opt_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps opt_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_opt_report_timing_summary_0] +if { $obj != "" } { +set_property -name "is_enabled" -value "0" -objects $obj + +} +# Create 'impl_1_power_opt_report_timing_summary_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_power_opt_report_timing_summary_0] "" ] } { + create_report_config -report_name impl_1_power_opt_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps power_opt_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_power_opt_report_timing_summary_0] +if { $obj != "" } { +set_property -name "is_enabled" -value "0" -objects $obj + +} +# Create 'impl_1_place_report_io_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_io_0] "" ] } { + create_report_config -report_name impl_1_place_report_io_0 -report_type report_io:1.0 -steps place_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_io_0] +if { $obj != "" } { + +} +# Create 'impl_1_place_report_utilization_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_utilization_0] "" ] } { + create_report_config -report_name impl_1_place_report_utilization_0 -report_type report_utilization:1.0 -steps place_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_utilization_0] +if { $obj != "" } { + +} +# Create 'impl_1_place_report_control_sets_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_control_sets_0] "" ] } { + create_report_config -report_name impl_1_place_report_control_sets_0 -report_type report_control_sets:1.0 -steps place_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_control_sets_0] +if { $obj != "" } { + +} +# Create 'impl_1_place_report_incremental_reuse_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_incremental_reuse_0] "" ] } { + create_report_config -report_name impl_1_place_report_incremental_reuse_0 -report_type report_incremental_reuse:1.0 -steps place_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_incremental_reuse_0] +if { $obj != "" } { +set_property -name "is_enabled" -value "0" -objects $obj + +} +# Create 'impl_1_place_report_incremental_reuse_1' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_incremental_reuse_1] "" ] } { + create_report_config -report_name impl_1_place_report_incremental_reuse_1 -report_type report_incremental_reuse:1.0 -steps place_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_incremental_reuse_1] +if { $obj != "" } { +set_property -name "is_enabled" -value "0" -objects $obj + +} +# Create 'impl_1_place_report_timing_summary_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_timing_summary_0] "" ] } { + create_report_config -report_name impl_1_place_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps place_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_place_report_timing_summary_0] +if { $obj != "" } { +set_property -name "is_enabled" -value "0" -objects $obj + +} +# Create 'impl_1_post_place_power_opt_report_timing_summary_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_post_place_power_opt_report_timing_summary_0] "" ] } { + create_report_config -report_name impl_1_post_place_power_opt_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps post_place_power_opt_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_post_place_power_opt_report_timing_summary_0] +if { $obj != "" } { +set_property -name "is_enabled" -value "0" -objects $obj + +} +# Create 'impl_1_phys_opt_report_timing_summary_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_phys_opt_report_timing_summary_0] "" ] } { + create_report_config -report_name impl_1_phys_opt_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps phys_opt_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_phys_opt_report_timing_summary_0] +if { $obj != "" } { +set_property -name "is_enabled" -value "0" -objects $obj + +} +# Create 'impl_1_route_report_drc_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_drc_0] "" ] } { + create_report_config -report_name impl_1_route_report_drc_0 -report_type report_drc:1.0 -steps route_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_drc_0] +if { $obj != "" } { + +} +# Create 'impl_1_route_report_methodology_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_methodology_0] "" ] } { + create_report_config -report_name impl_1_route_report_methodology_0 -report_type report_methodology:1.0 -steps route_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_methodology_0] +if { $obj != "" } { + +} +# Create 'impl_1_route_report_power_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_power_0] "" ] } { + create_report_config -report_name impl_1_route_report_power_0 -report_type report_power:1.0 -steps route_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_power_0] +if { $obj != "" } { + +} +# Create 'impl_1_route_report_route_status_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_route_status_0] "" ] } { + create_report_config -report_name impl_1_route_report_route_status_0 -report_type report_route_status:1.0 -steps route_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_route_status_0] +if { $obj != "" } { + +} +# Create 'impl_1_route_report_timing_summary_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_timing_summary_0] "" ] } { + create_report_config -report_name impl_1_route_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps route_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_timing_summary_0] +if { $obj != "" } { + +} +# Create 'impl_1_route_report_incremental_reuse_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_incremental_reuse_0] "" ] } { + create_report_config -report_name impl_1_route_report_incremental_reuse_0 -report_type report_incremental_reuse:1.0 -steps route_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_incremental_reuse_0] +if { $obj != "" } { + +} +# Create 'impl_1_route_report_clock_utilization_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_clock_utilization_0] "" ] } { + create_report_config -report_name impl_1_route_report_clock_utilization_0 -report_type report_clock_utilization:1.0 -steps route_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_clock_utilization_0] +if { $obj != "" } { + +} +# Create 'impl_1_route_report_bus_skew_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_bus_skew_0] "" ] } { + create_report_config -report_name impl_1_route_report_bus_skew_0 -report_type report_bus_skew:1.1 -steps route_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_route_report_bus_skew_0] +if { $obj != "" } { + +} +# Create 'impl_1_post_route_phys_opt_report_timing_summary_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_timing_summary_0] "" ] } { + create_report_config -report_name impl_1_post_route_phys_opt_report_timing_summary_0 -report_type report_timing_summary:1.0 -steps post_route_phys_opt_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_timing_summary_0] +if { $obj != "" } { + +} +# Create 'impl_1_post_route_phys_opt_report_bus_skew_0' report (if not found) +if { [ string equal [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_bus_skew_0] "" ] } { + create_report_config -report_name impl_1_post_route_phys_opt_report_bus_skew_0 -report_type report_bus_skew:1.1 -steps post_route_phys_opt_design -runs impl_1 +} +set obj [get_report_configs -of_objects [get_runs impl_1] impl_1_post_route_phys_opt_report_bus_skew_0] +if { $obj != "" } { + +} +set obj [get_runs impl_1] +set_property -name "strategy" -value "Vivado Implementation Defaults" -objects $obj +set_property -name "steps.write_bitstream.args.readback_file" -value "0" -objects $obj +set_property -name "steps.write_bitstream.args.verbose" -value "0" -objects $obj + +# set the current impl run +current_run -implementation [get_runs impl_1] + +puts "INFO: Project created:${_xil_proj_name_}" diff --git a/tools/xilinx/build_ps1.tcl b/tools/xilinx/build_ps1.tcl new file mode 100644 index 0000000..3a526ba --- /dev/null +++ b/tools/xilinx/build_ps1.tcl @@ -0,0 +1,890 @@ + +################################################################ +# This is a generated script based on design: ps1 +# +# Though there are limitations about the generated script, +# the main purpose of this utility is to make learning +# IP Integrator Tcl commands easier. +################################################################ + +namespace eval _tcl { +proc get_script_folder {} { + set script_path [file normalize [info script]] + set script_folder [file dirname $script_path] + return $script_folder +} +} +variable script_folder +set script_folder [_tcl::get_script_folder] + +################################################################ +# Check if script is running in correct Vivado version. +################################################################ +set scripts_vivado_version 2018.2 +set current_vivado_version [version -short] + +if { [string first $scripts_vivado_version $current_vivado_version] == -1 } { + puts "" + catch {common::send_msg_id "BD_TCL-109" "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."} + + return 1 +} + +################################################################ +# START +################################################################ + +# To test this script, run the following commands from Vivado Tcl console: +# source ps1_script.tcl + +# If there is no project opened, this script will create a +# project, but make sure you do not have an existing project +# <./myproj/project_1.xpr> in the current working folder. + +set list_projs [get_projects -quiet] +if { $list_projs eq "" } { + create_project project_1 myproj -part xc7z020clg484-1 + set_property BOARD_PART digilentinc.com:eclypse-z7:part0:1.1 [current_project] +} + + +# CHANGE DESIGN NAME HERE +variable design_name +set design_name ps1 + +# If you do not already have an existing IP Integrator design open, +# you can create a design using the following command: +# create_bd_design $design_name + +# Creating design if needed +set errMsg "" +set nRet 0 + +set cur_design [current_bd_design -quiet] +set list_cells [get_bd_cells -quiet] + +if { ${design_name} eq "" } { + # USE CASES: + # 1) Design_name not set + + set errMsg "Please set the variable to a non-empty value." + set nRet 1 + +} elseif { ${cur_design} ne "" && ${list_cells} eq "" } { + # USE CASES: + # 2): Current design opened AND is empty AND names same. + # 3): Current design opened AND is empty AND names diff; design_name NOT in project. + # 4): Current design opened AND is empty AND names diff; design_name exists in project. + + if { $cur_design ne $design_name } { + common::send_msg_id "BD_TCL-001" "INFO" "Changing value of from <$design_name> to <$cur_design> since current design is empty." + set design_name [get_property NAME $cur_design] + } + common::send_msg_id "BD_TCL-002" "INFO" "Constructing design in IPI design <$cur_design>..." + +} elseif { ${cur_design} ne "" && $list_cells ne "" && $cur_design eq $design_name } { + # USE CASES: + # 5) Current design opened AND has components AND same names. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 1 +} elseif { [get_files -quiet ${design_name}.bd] ne "" } { + # USE CASES: + # 6) Current opened design, has components, but diff names, design_name exists in project. + # 7) No opened design, design_name exists in project. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 2 + +} else { + # USE CASES: + # 8) No opened design, design_name not in project. + # 9) Current opened design, has components, but diff names, design_name not in project. + + common::send_msg_id "BD_TCL-003" "INFO" "Currently there is no design <$design_name> in project, so creating one..." + + create_bd_design $design_name + + common::send_msg_id "BD_TCL-004" "INFO" "Making design <$design_name> as current_bd_design." + current_bd_design $design_name + +} + +common::send_msg_id "BD_TCL-005" "INFO" "Currently the variable is equal to \"$design_name\"." + +if { $nRet != 0 } { + catch {common::send_msg_id "BD_TCL-114" "ERROR" $errMsg} + return $nRet +} + +set bCheckIPsPassed 1 +################################################################## +# CHECK IPs +################################################################## +set bCheckIPs 1 +if { $bCheckIPs == 1 } { + set list_check_ips "\ +xilinx.com:ip:axi_bram_ctrl:4.*\ +xilinx.com:ip:blk_mem_gen:8.*\ +xilinx.com:ip:smartconnect:1.*\ +xilinx.com:ip:processing_system7:5.*\ +xilinx.com:ip:proc_sys_reset:5.*\ +" + + set list_ips_missing "" + common::send_msg_id "BD_TCL-006" "INFO" "Checking if the following IPs exist in the project's IP catalog: $list_check_ips ." + + foreach ip_vlnv $list_check_ips { + set ip_obj [get_ipdefs -all $ip_vlnv] + if { $ip_obj eq "" } { + lappend list_ips_missing $ip_vlnv + } + } + + if { $list_ips_missing ne "" } { + catch {common::send_msg_id "BD_TCL-115" "ERROR" "The following IPs are not found in the IP Catalog:\n $list_ips_missing\n\nResolution: Please add the repository containing the IP(s) to the project." } + set bCheckIPsPassed 0 + } + +} + +if { $bCheckIPsPassed != 1 } { + common::send_msg_id "BD_TCL-1003" "WARNING" "Will not continue with creation of design due to the error(s) above." + return 3 +} + +################################################################## +# DESIGN PROCs +################################################################## + + + +# Procedure to create entire design; Provide argument to make +# procedure reusable. If parentCell is "", will use root. +proc create_root_design { parentCell } { + + variable script_folder + variable design_name + + if { $parentCell eq "" } { + set parentCell [get_bd_cells /] + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + + # Create interface ports + set DDR [ create_bd_intf_port -mode Master -vlnv xilinx.com:interface:ddrx_rtl:1.0 DDR ] + set FIXED_IO [ create_bd_intf_port -mode Master -vlnv xilinx.com:display_processing_system7:fixedio_rtl:1.0 FIXED_IO ] + + # Create ports + set FCLK_CLK0 [ create_bd_port -dir O -type clk FCLK_CLK0 ] + set FCLK_RESET0_N [ create_bd_port -dir O -type rst FCLK_RESET0_N ] + set ext_reset_n [ create_bd_port -dir I -type rst ext_reset_n ] + set_property -dict [ list \ + CONFIG.POLARITY {ACTIVE_LOW} \ + ] $ext_reset_n + + # Create instance: axi_bram_ctrl, and set properties + set axi_bram_ctrl [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_bram_ctrl:4.* axi_bram_ctrl ] + + # Create instance: axi_bram_ctrl_bram, and set properties + set axi_bram_ctrl_bram [ create_bd_cell -type ip -vlnv xilinx.com:ip:blk_mem_gen:8.* axi_bram_ctrl_bram ] + set_property -dict [ list \ + CONFIG.Memory_Type {True_Dual_Port_RAM} \ + ] $axi_bram_ctrl_bram + + # Create instance: axi_smc, and set properties + set axi_smc [ create_bd_cell -type ip -vlnv xilinx.com:ip:smartconnect:1.* axi_smc ] + set_property -dict [ list \ + CONFIG.NUM_SI {1} \ + ] $axi_smc + + # Create instance: processing_system7_0, and set properties + set processing_system7_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.* processing_system7_0 ] + set_property -dict [ list \ + CONFIG.PCW_ACT_APU_PERIPHERAL_FREQMHZ {666.666687} \ + CONFIG.PCW_ACT_CAN0_PERIPHERAL_FREQMHZ {23.8095} \ + CONFIG.PCW_ACT_CAN1_PERIPHERAL_FREQMHZ {23.8095} \ + CONFIG.PCW_ACT_CAN_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_DCI_PERIPHERAL_FREQMHZ {10.158730} \ + CONFIG.PCW_ACT_ENET0_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_ENET1_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ {100.000000} \ + CONFIG.PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_I2C_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_ACT_PCAP_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_QSPI_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_SDIO_PERIPHERAL_FREQMHZ {20.000000} \ + CONFIG.PCW_ACT_SMC_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_SPI_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_TPIU_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_TTC0_CLK0_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC0_CLK1_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC0_CLK2_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC1_CLK0_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC1_CLK1_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC1_CLK2_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_ACT_UART_PERIPHERAL_FREQMHZ {100.000000} \ + CONFIG.PCW_ACT_USB0_PERIPHERAL_FREQMHZ {60} \ + CONFIG.PCW_ACT_USB1_PERIPHERAL_FREQMHZ {60} \ + CONFIG.PCW_ACT_WDT_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_APU_CLK_RATIO_ENABLE {6:2:1} \ + CONFIG.PCW_APU_PERIPHERAL_FREQMHZ {666.666666} \ + CONFIG.PCW_ARMPLL_CTRL_FBDIV {40} \ + CONFIG.PCW_CAN0_BASEADDR {0xE0008000} \ + CONFIG.PCW_CAN0_GRP_CLK_ENABLE {0} \ + CONFIG.PCW_CAN0_HIGHADDR {0xE0008FFF} \ + CONFIG.PCW_CAN0_PERIPHERAL_CLKSRC {External} \ + CONFIG.PCW_CAN0_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_CAN0_PERIPHERAL_FREQMHZ {-1} \ + CONFIG.PCW_CAN1_BASEADDR {0xE0009000} \ + CONFIG.PCW_CAN1_GRP_CLK_ENABLE {0} \ + CONFIG.PCW_CAN1_HIGHADDR {0xE0009FFF} \ + CONFIG.PCW_CAN1_PERIPHERAL_CLKSRC {External} \ + CONFIG.PCW_CAN1_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_CAN1_PERIPHERAL_FREQMHZ {-1} \ + CONFIG.PCW_CAN_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_CAN_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_CAN_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_CAN_PERIPHERAL_FREQMHZ {100} \ + CONFIG.PCW_CAN_PERIPHERAL_VALID {0} \ + CONFIG.PCW_CLK0_FREQ {100000000} \ + CONFIG.PCW_CLK1_FREQ {10000000} \ + CONFIG.PCW_CLK2_FREQ {10000000} \ + CONFIG.PCW_CLK3_FREQ {10000000} \ + CONFIG.PCW_CORE0_FIQ_INTR {0} \ + CONFIG.PCW_CORE0_IRQ_INTR {0} \ + CONFIG.PCW_CORE1_FIQ_INTR {0} \ + CONFIG.PCW_CORE1_IRQ_INTR {0} \ + CONFIG.PCW_CPU_CPU_6X4X_MAX_RANGE {667} \ + CONFIG.PCW_CPU_CPU_PLL_FREQMHZ {1333.333} \ + CONFIG.PCW_CPU_PERIPHERAL_CLKSRC {ARM PLL} \ + CONFIG.PCW_CPU_PERIPHERAL_DIVISOR0 {2} \ + CONFIG.PCW_CRYSTAL_PERIPHERAL_FREQMHZ {33.333333} \ + CONFIG.PCW_DCI_PERIPHERAL_CLKSRC {DDR PLL} \ + CONFIG.PCW_DCI_PERIPHERAL_DIVISOR0 {15} \ + CONFIG.PCW_DCI_PERIPHERAL_DIVISOR1 {7} \ + CONFIG.PCW_DCI_PERIPHERAL_FREQMHZ {10.159} \ + CONFIG.PCW_DDRPLL_CTRL_FBDIV {32} \ + CONFIG.PCW_DDR_DDR_PLL_FREQMHZ {1066.667} \ + CONFIG.PCW_DDR_HPRLPR_QUEUE_PARTITION {HPR(0)/LPR(32)} \ + CONFIG.PCW_DDR_HPR_TO_CRITICAL_PRIORITY_LEVEL {15} \ + CONFIG.PCW_DDR_LPR_TO_CRITICAL_PRIORITY_LEVEL {2} \ + CONFIG.PCW_DDR_PERIPHERAL_CLKSRC {DDR PLL} \ + CONFIG.PCW_DDR_PERIPHERAL_DIVISOR0 {2} \ + CONFIG.PCW_DDR_PORT0_HPR_ENABLE {0} \ + CONFIG.PCW_DDR_PORT1_HPR_ENABLE {0} \ + CONFIG.PCW_DDR_PORT2_HPR_ENABLE {0} \ + CONFIG.PCW_DDR_PORT3_HPR_ENABLE {0} \ + CONFIG.PCW_DDR_RAM_BASEADDR {0x00100000} \ + CONFIG.PCW_DDR_RAM_HIGHADDR {0x3FFFFFFF} \ + CONFIG.PCW_DDR_WRITE_TO_CRITICAL_PRIORITY_LEVEL {2} \ + CONFIG.PCW_DM_WIDTH {4} \ + CONFIG.PCW_DQS_WIDTH {4} \ + CONFIG.PCW_DQ_WIDTH {32} \ + CONFIG.PCW_ENET0_BASEADDR {0xE000B000} \ + CONFIG.PCW_ENET0_GRP_MDIO_ENABLE {0} \ + CONFIG.PCW_ENET0_HIGHADDR {0xE000BFFF} \ + CONFIG.PCW_ENET0_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_ENET0_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_ENET0_PERIPHERAL_FREQMHZ {1000 Mbps} \ + CONFIG.PCW_ENET0_RESET_ENABLE {0} \ + CONFIG.PCW_ENET1_BASEADDR {0xE000C000} \ + CONFIG.PCW_ENET1_GRP_MDIO_ENABLE {0} \ + CONFIG.PCW_ENET1_HIGHADDR {0xE000CFFF} \ + CONFIG.PCW_ENET1_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_ENET1_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_ENET1_PERIPHERAL_FREQMHZ {1000 Mbps} \ + CONFIG.PCW_ENET1_RESET_ENABLE {0} \ + CONFIG.PCW_ENET_RESET_ENABLE {0} \ + CONFIG.PCW_ENET_RESET_POLARITY {Active Low} \ + CONFIG.PCW_EN_4K_TIMER {0} \ + CONFIG.PCW_EN_CAN0 {0} \ + CONFIG.PCW_EN_CAN1 {0} \ + CONFIG.PCW_EN_CLK0_PORT {1} \ + CONFIG.PCW_EN_CLK1_PORT {0} \ + CONFIG.PCW_EN_CLK2_PORT {0} \ + CONFIG.PCW_EN_CLK3_PORT {0} \ + CONFIG.PCW_EN_CLKTRIG0_PORT {0} \ + CONFIG.PCW_EN_CLKTRIG1_PORT {0} \ + CONFIG.PCW_EN_CLKTRIG2_PORT {0} \ + CONFIG.PCW_EN_CLKTRIG3_PORT {0} \ + CONFIG.PCW_EN_DDR {1} \ + CONFIG.PCW_EN_EMIO_CAN0 {0} \ + CONFIG.PCW_EN_EMIO_CAN1 {0} \ + CONFIG.PCW_EN_EMIO_CD_SDIO0 {0} \ + CONFIG.PCW_EN_EMIO_CD_SDIO1 {0} \ + CONFIG.PCW_EN_EMIO_ENET0 {0} \ + CONFIG.PCW_EN_EMIO_ENET1 {0} \ + CONFIG.PCW_EN_EMIO_GPIO {0} \ + CONFIG.PCW_EN_EMIO_I2C0 {0} \ + CONFIG.PCW_EN_EMIO_I2C1 {0} \ + CONFIG.PCW_EN_EMIO_MODEM_UART0 {0} \ + CONFIG.PCW_EN_EMIO_MODEM_UART1 {0} \ + CONFIG.PCW_EN_EMIO_PJTAG {0} \ + CONFIG.PCW_EN_EMIO_SDIO0 {0} \ + CONFIG.PCW_EN_EMIO_SDIO1 {0} \ + CONFIG.PCW_EN_EMIO_SPI0 {0} \ + CONFIG.PCW_EN_EMIO_SPI1 {0} \ + CONFIG.PCW_EN_EMIO_SRAM_INT {0} \ + CONFIG.PCW_EN_EMIO_TRACE {0} \ + CONFIG.PCW_EN_EMIO_TTC0 {0} \ + CONFIG.PCW_EN_EMIO_TTC1 {0} \ + CONFIG.PCW_EN_EMIO_UART0 {0} \ + CONFIG.PCW_EN_EMIO_UART1 {0} \ + CONFIG.PCW_EN_EMIO_WDT {0} \ + CONFIG.PCW_EN_EMIO_WP_SDIO0 {0} \ + CONFIG.PCW_EN_EMIO_WP_SDIO1 {0} \ + CONFIG.PCW_EN_ENET0 {0} \ + CONFIG.PCW_EN_ENET1 {0} \ + CONFIG.PCW_EN_GPIO {0} \ + CONFIG.PCW_EN_I2C0 {0} \ + CONFIG.PCW_EN_I2C1 {0} \ + CONFIG.PCW_EN_MODEM_UART0 {0} \ + CONFIG.PCW_EN_MODEM_UART1 {0} \ + CONFIG.PCW_EN_PJTAG {0} \ + CONFIG.PCW_EN_PTP_ENET0 {0} \ + CONFIG.PCW_EN_PTP_ENET1 {0} \ + CONFIG.PCW_EN_QSPI {1} \ + CONFIG.PCW_EN_RST0_PORT {1} \ + CONFIG.PCW_EN_RST1_PORT {0} \ + CONFIG.PCW_EN_RST2_PORT {0} \ + CONFIG.PCW_EN_RST3_PORT {0} \ + CONFIG.PCW_EN_SDIO0 {1} \ + CONFIG.PCW_EN_SDIO1 {0} \ + CONFIG.PCW_EN_SMC {0} \ + CONFIG.PCW_EN_SPI0 {0} \ + CONFIG.PCW_EN_SPI1 {0} \ + CONFIG.PCW_EN_TRACE {0} \ + CONFIG.PCW_EN_TTC0 {0} \ + CONFIG.PCW_EN_TTC1 {0} \ + CONFIG.PCW_EN_UART0 {1} \ + CONFIG.PCW_EN_UART1 {0} \ + CONFIG.PCW_EN_USB0 {0} \ + CONFIG.PCW_EN_USB1 {0} \ + CONFIG.PCW_EN_WDT {0} \ + CONFIG.PCW_FCLK0_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR0 {4} \ + CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR1 {3} \ + CONFIG.PCW_FCLK1_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK2_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK3_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK_CLK0_BUF {TRUE} \ + CONFIG.PCW_FCLK_CLK1_BUF {FALSE} \ + CONFIG.PCW_FCLK_CLK2_BUF {FALSE} \ + CONFIG.PCW_FCLK_CLK3_BUF {FALSE} \ + CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ {100} \ + CONFIG.PCW_FPGA1_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_FPGA2_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_FPGA3_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_FPGA_FCLK0_ENABLE {1} \ + CONFIG.PCW_FPGA_FCLK1_ENABLE {0} \ + CONFIG.PCW_FPGA_FCLK2_ENABLE {0} \ + CONFIG.PCW_FPGA_FCLK3_ENABLE {0} \ + CONFIG.PCW_GP0_EN_MODIFIABLE_TXN {1} \ + CONFIG.PCW_GP0_NUM_READ_THREADS {4} \ + CONFIG.PCW_GP0_NUM_WRITE_THREADS {4} \ + CONFIG.PCW_GP1_EN_MODIFIABLE_TXN {1} \ + CONFIG.PCW_GP1_NUM_READ_THREADS {4} \ + CONFIG.PCW_GP1_NUM_WRITE_THREADS {4} \ + CONFIG.PCW_GPIO_BASEADDR {0xE000A000} \ + CONFIG.PCW_GPIO_EMIO_GPIO_ENABLE {0} \ + CONFIG.PCW_GPIO_EMIO_GPIO_WIDTH {64} \ + CONFIG.PCW_GPIO_HIGHADDR {0xE000AFFF} \ + CONFIG.PCW_GPIO_MIO_GPIO_ENABLE {0} \ + CONFIG.PCW_GPIO_MIO_GPIO_IO {