From fad6932599c2bbe4f4cfe1c545efa61ce9b3ee26 Mon Sep 17 00:00:00 2001 From: Rob Graessle Date: Tue, 16 Jun 2026 14:40:29 -0400 Subject: [PATCH] Add transpose-form FIR alongside direct form in SSR_FIR example Adds a transpose-form SSR FIR (TRANSPOSE_SSR_FIR) as a second DUT next to the existing direct-form filter so the two architectures can be compared side by side. Both forms share a unified fixed_pkg/cfixed_pkg VHDL base, are driven by the same stimulus, and are functionally equivalent to within one output LSB; the direct form is also checked against the golden floating-point reference. - New: TRANSPOSE_SSR_FIR(.vhd/_CHAIN.vhd), WRAPPER_TRANSPOSE_SSR_FIR(.vhd/_config.m), fixed_pkg.vhd, cfixed_pkg.vhd - Migrate direct-form core and support blocks (SSR_FIR, SDELAY, BDELAY, DSPx8_WRAPPER, WRAPPER_SSR_FIR) onto the shared fixed_pkg/cfixed_pkg base - Remove obsolete TYPES_PKG.vhd and SSR_FIR_TEST.vhd - Model defaults to SSR=8, TAPS=64, non-symmetric; update README and screenshot Co-authored-by: Cursor --- .../HDL/Digital_Filtering/SSR_FIR/BDELAY.vhd | 30 +- .../SSR_FIR/DSPx8_WRAPPER.vhd | 13 +- .../SSR_FIR/Images/SSR_FIR_screen_shot.PNG | Bin 69985 -> 224761 bytes .../HDL/Digital_Filtering/SSR_FIR/README.html | 77 +- .../HDL/Digital_Filtering/SSR_FIR/README.md | 54 +- .../HDL/Digital_Filtering/SSR_FIR/SDELAY.vhd | 433 +++++----- .../HDL/Digital_Filtering/SSR_FIR/SSR_FIR.slx | Bin 62899 -> 77313 bytes .../HDL/Digital_Filtering/SSR_FIR/SSR_FIR.vhd | 262 ++++-- .../SSR_FIR/SSR_FIR_TEST.vhd | 77 -- .../SSR_FIR/TRANSPOSE_SSR_FIR.vhd | 382 +++++++++ .../SSR_FIR/TRANSPOSE_SSR_FIR_CHAIN.vhd | 324 ++++++++ .../Digital_Filtering/SSR_FIR/TYPES_PKG.vhd | 776 ------------------ .../SSR_FIR/WRAPPER_SSR_FIR.vhd | 69 +- .../SSR_FIR/WRAPPER_SSR_FIR_config.m | 3 +- .../SSR_FIR/WRAPPER_TRANSPOSE_SSR_FIR.vhd | 202 +++++ .../WRAPPER_TRANSPOSE_SSR_FIR_config.m | 196 +++++ .../Digital_Filtering/SSR_FIR/cfixed_pkg.vhd | 407 +++++++++ .../Digital_Filtering/SSR_FIR/fixed_pkg.vhd | 20 + 18 files changed, 2122 insertions(+), 1203 deletions(-) mode change 100755 => 100644 Examples/HDL/Digital_Filtering/SSR_FIR/Images/SSR_FIR_screen_shot.PNG delete mode 100755 Examples/HDL/Digital_Filtering/SSR_FIR/SSR_FIR_TEST.vhd create mode 100644 Examples/HDL/Digital_Filtering/SSR_FIR/TRANSPOSE_SSR_FIR.vhd create mode 100644 Examples/HDL/Digital_Filtering/SSR_FIR/TRANSPOSE_SSR_FIR_CHAIN.vhd delete mode 100755 Examples/HDL/Digital_Filtering/SSR_FIR/TYPES_PKG.vhd create mode 100644 Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_TRANSPOSE_SSR_FIR.vhd create mode 100644 Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_TRANSPOSE_SSR_FIR_config.m create mode 100644 Examples/HDL/Digital_Filtering/SSR_FIR/cfixed_pkg.vhd create mode 100644 Examples/HDL/Digital_Filtering/SSR_FIR/fixed_pkg.vhd diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/BDELAY.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/BDELAY.vhd index 6cb46fb12..3ef0bc1f6 100755 --- a/Examples/HDL/Digital_Filtering/SSR_FIR/BDELAY.vhd +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/BDELAY.vhd @@ -4,7 +4,10 @@ library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.NUMERIC_STD.all; -use work.TYPES_PKG.all; +--CB use work.TYPES_PKG.all; +use work.fixed_pkg.all; -- VHDL-2008 IEEE standard SFIXED type and functions +use work.cfixed_pkg.all; -- user package, SFIXED_VECTOR, SFIXED_MATRIX and many other goodies +--CB entity BDELAY is generic(SIZE:NATURAL:=1; -- SIZE has a default value of 1 and cannot be negative, this would require traveling back in time @@ -27,6 +30,7 @@ begin -- l2n:if (SIZE>=66 and SIZE<=65+33) or (SIZE>=130 and SIZE<=129+65+33) or (SIZE>=258 and SIZE<=257+129+65+33) or (SIZE>513) generate l2n:if DDR and (SIZE>3) generate signal ID:BOOLEAN:=FALSE; + signal OB:BOOLEAN:=FALSE; signal T,TD,SEL:STD_LOGIC:='0'; type TBV is array(0 to SIZE/2-1) of BOOLEAN; signal OE,OO:TBV:=(others=>FALSE); -- delay line signal is SIZE/2 in length @@ -38,7 +42,7 @@ begin end; else generate process(CLK) - begin + begin if rising_edge(CLK) then ID<=I after 1 ps; end if; @@ -71,12 +75,28 @@ begin TD<=T after 1 ps; SEL<=TD xor T after 1 ps; if SEL='0' then - O<=OE(OE'high); + OB<=OE(OE'high); + -- BF O<=OE(OE'high); else - O<=OO(OO'high); + OB<=OO(OO'high); + -- BF O<=OO(OO'high); end if; end if; end process; + + --BF Added for DDR Even Filters + o0:if SIZE mod 2=1 generate + O<=OB; + end; + else generate + process(CLK) + begin + if rising_edge(CLK) then + O<=OB after 1 ps; + end if; + end process; + end generate; + end; elsif (SIZE>=66 and SIZE<=65+33) or (SIZE>=130 and SIZE<=129+65+33) or (SIZE>=258 and SIZE<=257+129+65+33) generate signal IO:BOOLEAN:=FALSE; @@ -158,4 +178,4 @@ begin O<=D(D'high); end; end generate; -end TEST; \ No newline at end of file +end TEST; diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/DSPx8_WRAPPER.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/DSPx8_WRAPPER.vhd index 704c01706..a6c2a0e5d 100755 --- a/Examples/HDL/Digital_Filtering/SSR_FIR/DSPx8_WRAPPER.vhd +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/DSPx8_WRAPPER.vhd @@ -4,7 +4,10 @@ library IEEE; use IEEE.STD_LOGIC_1164.all; -use work.TYPES_PKG.all; +--CB use work.TYPES_PKG.all; +use work.fixed_pkg.all; -- VHDL-2008 IEEE standard SFIXED type and functions +use work.cfixed_pkg.all; -- user package, SFIXED_VECTOR, SFIXED_MATRIX and many other goodies +--CB library unisims_ver; library UNISIM; @@ -81,11 +84,11 @@ entity DSPx8_WRAPPER is INMODE:in STD_LOGIC_VECTOR(4 downto 0):=5x"00"; -- 5-bit input: INMODE control OPMODE:in STD_LOGIC_VECTOR(8 downto 0):=9x"035"; -- 9-bit input: Operation mode - default is P<=C+A*B -- Data inputs: Data Ports - A:in SFIXED; -- 30/34-bit input: A data - B:in SFIXED; -- 18/24-bit input: B data - C:in SFIXED; -- 48/58-bit input: C data + A:in SFIXED:="0"; -- 30/34-bit input: A data + B:in SFIXED:="0"; -- 18/24-bit input: B data + C:in SFIXED:="0"; -- 48/58-bit input: C data CARRYIN:in STD_LOGIC:='0'; -- 1-bit input: Carry-in - D:in SFIXED; -- 25/27-bit input: D data + D:in SFIXED:="0"; -- 25/27-bit input: D data -- Reset/Clock Enable inputs: Reset/Clock Enable Inputs CEA1:in STD_LOGIC:='1'; -- 1-bit input: Clock enable for 1st stage AREG CEA2:in STD_LOGIC:='1'; -- 1-bit input: Clock enable for 2nd stage AREG diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/Images/SSR_FIR_screen_shot.PNG b/Examples/HDL/Digital_Filtering/SSR_FIR/Images/SSR_FIR_screen_shot.PNG old mode 100755 new mode 100644 index 36b8af84da866ce90c5b8b7d2744308099704a81..05076c4566c6e0f4d2a73b896a295e883910f7ad GIT binary patch literal 224761 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

Z)3Byg?b( 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

Q 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 -

High Speed SSR FIR

+

High Speed SSR FIR — Direct and Transpose Forms

Open Example -

This reference design can be used as a starting design point when efficient implementations of very high data rate (over 1 Gsps) Single Rate FIRs are required. This PL based design can be used in any modern AMD device - 7-Series/UltraScale/UltraScale+/Versal.
+

This reference design can be used as a starting design point when efficient implementations of very high data rate (over 1 Gsps) Single Rate FIRs are required. This PL based design can be used in any modern AMD device - 7-Series/UltraScale/UltraScale+/Versal.


-




-This Single Rate SSR FIR reference design illustrates a number of advanced Vitis Model Composer design techniques:

+



+

The model now contains two functionally-equivalent FIR architectures side by side, both driven by the same stimulus. The Direct form is checked sample-by-sample against a golden floating-point reference, and the Direct and Transpose outputs are overlaid in the Output spectrum analyzer to confirm the two architectures produce equivalent results (matching to within one LSB):

    -
  • This is a fully parameterizable design - you can control the filter order N, the number of clocks per sample SSR, the filter type (non/even/odd-symmetric), the input, output and coefficient fixed point quantization; you can set SSR and TAPS in Model Settings/Model Properties/Callbacks/InitFcnall the rest of the SSR FIR parameters can be set in the Model Composer block dialog
  • -
  • If desired, you can floorplan the DSP blocks directly from Vitis Model Composer
  • -
  • This is achieved through the use of Model Composer HDL Black Box flow, all these features are implemented in the underlying VHDL-2008 code; the reference design shows how to pass ports and parameters with generic sizes between Model Composer and VHDL code; the underlying VHDL-2008 code shows how to use arbitrary precision fixed point types, recursive component instantiations, how to instantiate DSP primitives independent of FPGA family (7-Series/UltraScale+/Versal) and floorplan them from VHDL code
  • -
  • The Vitis Model Composer design includes a top level Simulink self-checking testbench, which compares the fixed point HDL Black Box based implementation to a golden reference floating point model
  • -
  • This is a very high speed design, clock frequencies up to the maximum data sheet values of 741/891/1150 MHz in the fastest speed grade 7-Series/UltraScale+/Versal devices are possible
  • -
  • The design also shows a technique to avoid the Versal 795/824/872 MHz fMAX limitation due to SRL16 minimum pulse width spec
  • -
  • The VHDL code inside the Model Composer HDL Black Box can be instantiated stand alone in a Vivado RTL project. MATLAB and Vitis Model Composer are used here to illustrate the flow and make functional verification easier.
  • +
  • DUT – Direct Form (SSR_FIR.vhd): partial products cascade from the first to the last tap through the DSP PCOUT chain. The cascade is TAPS deep.
  • +
  • DUT_T – Transpose Form (TRANSPOSE_SSR_FIR.vhd): the input is broadcast to all DSPs and partial sums accumulate stage-by-stage through the DSP PREG/PCOUT registers. For SSR>1 each of the SSR lanes implements a transposed sub-FIR, so the cascade is only TAPS/SSR deep per lane.
  • +
+

The two architectures are functionally equivalent, with outputs agreeing to within one output LSB (2^-16). Each form is independently verified against the golden floating-point reference. The two forms have different pipeline latencies (direct = TAPS+2 clocks, transpose = 3×SSR+2 clocks), so the transpose output leads the direct output in time.

+

To generate code for one architecture, point the Vitis Model Composer Hub block's subsystem selection at DUT (direct) or DUT_T (transpose).

+

Why two forms?

+

The critical path of the direct form grows with TAPS (the PCOUT cascade), while the transpose form's critical path is one DSP multiply-accumulate that is independent of TAPS. This lets the transpose form close timing at high SSR and large TAPS where the direct form's cascade does not.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDirect FormTranspose Form
SSR range1, 2, 4, 8, 16 (2^n)1, 2, 4, 8, 16 (2^n)
Fmax, Versal (SSR≤4)~822 MHz (device ceiling)~834–841 MHz
Fmax, SSR=8~670–740 MHz~834 MHz
Latency (SSR>1, NS)TAPS + 23×SSR + 2
PCOUT/PREG chain depthTAPS hopsTAPS/SSR hops per lane
DSP count, NSSSR × TAPSSSR × TAPS
+

Rule of thumb: use the direct form for SSR 2–4 with TAPS ≤ 64 (shorter latency, simplest dataflow); use the transpose form for SSR ≥ 8, or for TAPS > 64 at SSR = 4, or whenever a TAPS-independent (short, fixed) latency is required.

+

Model configuration

+

The model is parameterized through Model Settings → Model Properties → Callbacks → InitFcn:

+
SSR  = 8;               % clocks per sample — MUST be a power of two (1,2,4,8,16,...)
+TAPS = 64;              % number of FIR coefficients
+Ts   = 1/SSR;           % input sample time; SSR*Ts must equal the Simulink system period (1)
+FCOEFF = fir1(TAPS-1,0.25);  % shared coefficient set (hardware + golden reference)
+
+

Notes:

+
    +
  • SSR must be a power of two. Both cores assert this; non-power-of-2 SSR is not supported by the SSR>1 accumulation chain.
  • +
  • Ts = 1/SSR keeps the buffered input frame rate aligned with the Vitis Model Composer Hub's Simulink system period so the golden-vs-DUT comparison lines up. Changing SSR automatically rescales Ts.
  • +
  • The remaining FIR parameters (input/output/coefficient fixed-point ranges, rounding, symmetry, optional DSP floorplanning) are set on the SSRFIR Model Composer block mask inside each DUT.
-

This design only works in Vivado 2022.1 or later.


Copyright (c) 2026 Advanced Micro Devices, Inc.

diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/README.md b/Examples/HDL/Digital_Filtering/SSR_FIR/README.md index 350d1147a..eb322b546 100644 --- a/Examples/HDL/Digital_Filtering/SSR_FIR/README.md +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/README.md @@ -1,24 +1,54 @@ -# High Speed SSR FIR +# High Speed SSR FIR — Direct and Transpose Forms -This reference design can be used as a starting design point when efficient implementations of very high data rate (over 1 Gsps) Single Rate FIRs are required. This PL based design can be used in any modern AMD device - 7-Series/UltraScale/UltraScale+/Versal. +This reference design can be used as a starting design point when efficient implementations of very high data rate (over 1 Gsps) Single Rate FIRs are required. This PL based design can be used in any modern AMD device - 7-Series/UltraScale/UltraScale+/Versal.

- +

-This Single Rate SSR FIR reference design illustrates a number of advanced Vitis Model Composer design techniques: -- This is a fully parameterizable design - you can control the filter order N, the number of clocks per sample SSR, the filter type (non/even/odd-symmetric), the input, output and coefficient fixed point quantization; you can set SSR and TAPS in Model Settings/Model Properties/Callbacks/InitFcnall the rest of the SSR FIR parameters can be set in the Model Composer block dialog -- If desired, you can floorplan the DSP blocks directly from Vitis Model Composer -- This is achieved through the use of Model Composer HDL Black Box flow, all these features are implemented in the underlying VHDL-2008 code; the reference design shows how to pass ports and parameters with generic sizes between Model Composer and VHDL code; the underlying VHDL-2008 code shows how to use arbitrary precision fixed point types, recursive component instantiations, how to instantiate DSP primitives independent of FPGA family (7-Series/UltraScale+/Versal) and floorplan them from VHDL code -- The Vitis Model Composer design includes a top level Simulink self-checking testbench, which compares the fixed point HDL Black Box based implementation to a golden reference floating point model -- This is a very high speed design, clock frequencies up to the maximum data sheet values of 741/891/1150 MHz in the fastest speed grade 7-Series/UltraScale+/Versal devices are possible -- The design also shows a technique to avoid the Versal 795/824/872 MHz fMAX limitation due to SRL16 minimum pulse width spec -- The VHDL code inside the Model Composer HDL Black Box can be instantiated stand alone in a Vivado RTL project. MATLAB and Vitis Model Composer are used here to illustrate the flow and make functional verification easier. +The model now contains **two functionally-equivalent FIR architectures side by side**, both driven by the same stimulus. The Direct form is checked sample-by-sample against a golden floating-point reference, and the Direct and Transpose outputs are overlaid in the **Output** spectrum analyzer to confirm the two architectures produce equivalent results (matching to within one LSB): + +- **`DUT` – Direct Form** (`SSR_FIR.vhd`): partial products cascade from the first to the last tap through the DSP `PCOUT` chain. The cascade is `TAPS` deep. +- **`DUT_T` – Transpose Form** (`TRANSPOSE_SSR_FIR.vhd`): the input is broadcast to all DSPs and partial sums accumulate stage-by-stage through the DSP `PREG`/`PCOUT` registers. For SSR>1 each of the SSR lanes implements a transposed sub-FIR, so the cascade is only **`TAPS/SSR` deep per lane**. + +The two architectures are **functionally equivalent, with outputs agreeing to within one output LSB (2^-16)**. Each form is independently verified against the golden floating-point reference. The two forms have different pipeline latencies (direct = TAPS+2 clocks, transpose = 3×SSR+2 clocks), so the transpose output leads the direct output in time. + +To generate code for one architecture, point the **Vitis Model Composer Hub** block's subsystem selection at `DUT` (direct) or `DUT_T` (transpose). + +## Why two forms? + +The critical path of the direct form grows with `TAPS` (the `PCOUT` cascade), while the transpose form's critical path is one DSP multiply-accumulate that is **independent of `TAPS`**. This lets the transpose form close timing at high `SSR` and large `TAPS` where the direct form's cascade does not. + +| Property | **Direct Form** | **Transpose Form** | +|---|---|---| +| SSR range | 1, 2, 4, 8, 16 (2^n) | 1, 2, 4, 8, 16 (2^n) | +| Fmax, Versal (SSR≤4) | ~822 MHz (device ceiling) | ~834–841 MHz | +| Fmax, SSR=8 | ~670–740 MHz | ~834 MHz | +| Latency (SSR>1, NS) | TAPS + 2 | 3×SSR + 2 | +| PCOUT/PREG chain depth | TAPS hops | **TAPS/SSR hops per lane** | +| DSP count, NS | SSR × TAPS | SSR × TAPS | + +**Rule of thumb:** use the **direct form** for SSR 2–4 with TAPS ≤ 64 (shorter latency, simplest dataflow); use the **transpose form** for SSR ≥ 8, or for TAPS > 64 at SSR = 4, or whenever a TAPS-independent (short, fixed) latency is required. + +## Model configuration + +The model is parameterized through `Model Settings → Model Properties → Callbacks → InitFcn`: + +```matlab +SSR = 8; % clocks per sample — MUST be a power of two (1,2,4,8,16,...) +TAPS = 64; % number of FIR coefficients +Ts = 1/SSR; % input sample time; SSR*Ts must equal the Simulink system period (1) +FCOEFF = fir1(TAPS-1,0.25); % shared coefficient set (hardware + golden reference) +``` + +Notes: -This design only works in Vivado 2022.1 or later. +- **`SSR` must be a power of two.** Both cores assert this; non-power-of-2 SSR is not supported by the SSR>1 accumulation chain. +- **`Ts = 1/SSR`** keeps the buffered input frame rate aligned with the Vitis Model Composer Hub's Simulink system period so the golden-vs-DUT comparison lines up. Changing `SSR` automatically rescales `Ts`. +- The remaining FIR parameters (input/output/coefficient fixed-point ranges, rounding, symmetry, optional DSP floorplanning) are set on the `SSRFIR` Model Composer block mask inside each DUT. -------------- Copyright (c) 2026 Advanced Micro Devices, Inc. diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/SDELAY.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/SDELAY.vhd index 8e08543e7..0d311f7d6 100755 --- a/Examples/HDL/Digital_Filtering/SSR_FIR/SDELAY.vhd +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/SDELAY.vhd @@ -1,212 +1,223 @@ --- Copyright (C) 2024, Advanced Micro Devices, Inc. - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.ALL; - -use work.TYPES_PKG.all; - -entity SDELAY is - generic(SIZE:NATURAL:=1; -- SIZE has a default value of 1 and cannot be negative, this would require traveling back in time - DDR:BOOLEAN:=FALSE; -- DDR implementation for Versal -3 clock rates over 872MHz - STYLE:STRING:="srl_reg"); -- acceptable values are "reg", "srl", "srl_reg", "reg_srl", "reg_srl_reg" or "block" - port(CLK:in STD_LOGIC:='0'; -- an input port with a default value can be left unconnected, this could be useful when SIZE=0 (a wire) - CLKH:in STD_LOGIC:='0'; -- half rate clock, an input port with a default value can be left unconnected, this could be useful when SIZE=0 (a wire) - CE:in STD_LOGIC:='1'; -- clock enable, if not used can be left unconnected --- I:in SIGNED; --- O:out SIGNED); - I:in SFIXED; - O:out SFIXED); - attribute secure_config:STRING; - attribute secure_config of SDELAY:entity is "PROTECT"; -end SDELAY; - -architecture TEST of SDELAY is - attribute syn_hier:STRING; - attribute syn_hier of all:architecture is "hard"; - attribute srl_style:STRING; -begin - l2n:if DDR and (SIZE<4) generate --- type TD is array(0 to SIZE) of SIGNED(I'range); - type TD is array(0 to SIZE) of SFIXED(I'range); - signal D:TD:=(others=>(others=>'0')); -- delay line signal is SIZE+1 in length - attribute shreg_extract:STRING; - attribute shreg_extract of D:signal is "no"; --- attribute ram_style:STRING; --- attribute ram_style of D:signal is "registers"; - begin - D(D'low)<=I; - lk:for K in 1 to SIZE generate - begin - process(CLK) - begin - if rising_edge(CLK) then - if CE='1' then - D(K)<=D(K-1); - end if; - end if; - end process; - end generate; --- O<=RESIZE(D(D'high),O'length); - O<=RESIZE(D(D'high),O); - end; - elsif DDR and (SIZE>3) generate - signal ID:SFIXED(I'range):=(others=>'0'); - signal T,TD,SEL:STD_LOGIC:='0'; - type TSV is array(0 to SIZE/2-1) of SFIXED(I'range); - signal OE,OO:TSV:=(others=>(others=>'0')); -- delay line signal is SIZE/2 in length - signal iO:SFIXED(O'range):=(others=>'0'); - attribute srl_style of OE:signal is STYLE; - attribute srl_style of OO:signal is STYLE; - begin - i0:if SIZE mod 2=0 generate - ID<=I after 1 ps; - end; - else generate - process(CLK) - begin - if rising_edge(CLK) then - if CE='1' then - ID<=I after 1 ps; - end if; - end if; - end process; - end generate; - process(CLKH) - begin - if rising_edge(CLKH) then - for K in OE'low to OE'high loop - if CE='1' then - if K=OE'low then - OE(K)<=ID after 1 ps; - else - OE(K)<=OE(K-1) after 1 ps; - end if; - end if; - end loop; - end if; - end process; - - process(CLKH) - begin - if falling_edge(CLKH) then - for K in OO'low to OO'high loop - if CE='1' then - if K=OO'low then - OO(K)<=ID after 1 ps; - else - OO(K)<=OO(K-1) after 1 ps; - end if; - end if; - end loop; - end if; - end process; - - process(CLKH) - begin - if rising_edge(CLKH) then - T<=not T after 1 ps; - end if; - end process; - - process(CLK) - begin - if rising_edge(CLK) then - TD<=T after 1 ps; - SEL<=TD xor T after 1 ps; - if SEL='0' then - iO<=OE(OE'high); - else - iO<=OO(OO'high); - end if; - end if; - end process; - O<=iO; - end; - elsif (SIZE>=66 and SIZE<=65+33) or (SIZE>=130 and SIZE<=129+65+33) or (SIZE>=258 and SIZE<=257+129+65+33) generate --- signal IO:SIGNED(I'range):=(others=>'0'); - signal IO:SFIXED(I'range):=(others=>'0'); - constant HSIZE:INTEGER:=2**(LOG2(SIZE)-1)+1; - begin - d2n:entity work.SDELAY generic map(SIZE=>HSIZE, -- 65/129/257 - STYLE=>STYLE) - port map(CLK=>CLK, - CE=>CE, - I=>I, - O=>IO); - d1:entity work.SDELAY generic map(SIZE=>SIZE-HSIZE, -- 2..34/2..66/2..130 - STYLE=>STYLE) - port map(CLK=>CLK, - CE=>CE, - I=>IO, - O=>O); - end; - elsif l513: (SIZE>17 and SIZE<=513) generate -- infer a counter plus distributed RAM implementation - signal A:UNSIGNED(LOG2(SIZE-1)-1 downto 0):=(others=>'0'); --- type TMEM is array(0 to 2**A'length-1) of SIGNED(I'range); - type TMEM is array(0 to 2**A'length-1) of SFIXED(I'range); - signal MEM:TMEM:=(others=>(others=>'0')); - attribute ram_style:STRING; - attribute ram_style of MEM:signal is "distributed"; --- signal iO:SIGNED(O'range):=(others=>'0'); - signal iO:SFIXED(O'range):=(others=>'0'); - begin - process(CLK) - begin - if rising_edge(CLK) then - if CE='1' then - if A=SIZE-2 then - A<=(others=>'0'); - else - A<=A+1; - end if; - MEM(TO_INTEGER(A))<=I; --- iO<=RESIZE(MEM(TO_INTEGER(A)),O'length); - iO<=RESIZE(MEM(TO_INTEGER(A)),O); - end if; - end if; - end process; - O<=iO; - end; - elsif (SIZE>513) generate --- signal IO:SIGNED(I'range):=(others=>'0'); - signal IO:SFIXED(I'range):=(others=>'0'); - constant HSIZE:INTEGER:=513; - begin - d2n:entity work.SDELAY generic map(SIZE=>HSIZE, -- 513 - STYLE=>STYLE) - port map(CLK=>CLK, - CE=>CE, - I=>I, - O=>IO); - d1:entity work.SDELAY generic map(SIZE=>SIZE-HSIZE, -- SIZE-513 - STYLE=>STYLE) - port map(CLK=>CLK, - CE=>CE, - I=>IO, - O=>O); - end; - else generate -- otherwise use the behavioral implementation and the STYLE generic --- type TD is array(0 to SIZE) of SIGNED(I'range); - type TD is array(0 to SIZE) of SFIXED(I'range); - signal D:TD:=(others=>(others=>'0')); -- delay line signal is SIZE+1 in length - attribute srl_style:STRING; - attribute srl_style of D:signal is STYLE; - begin - D(D'low)<=I; - lk:for K in 1 to SIZE generate - begin - process(CLK) - begin - if rising_edge(CLK) then - if CE='1' then - D(K)<=D(K-1); - end if; - end if; - end process; - end generate; --- O<=RESIZE(D(D'high),O'length); - O<=RESIZE(D(D'high),O); - end; - end generate; +-- Copyright © Advanced Micro Devices, Inc., or its affiliates. All rights reserved. +-- Portions of this content consists of AI generated content. +-- You may not use this software and documentation (if any) (collectively, the "Materials") +-- except in compliance with the terms and conditions of the Software License Agreement +-- included with the Materials or otherwise as set forth in writing and signed by you and +-- an authorized signatory of AMD. If you do not have a copy of the Software License +-- Agreement, contact your AMD representative for a copy. You agree that you will not +-- reverse engineer or decompile the Materials, in whole or in part, except as allowed by +-- applicable law. +-- THE MATERIALS ARE DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR +-- REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +library IEEE; +use IEEE.STD_LOGIC_1164.all; +use IEEE.NUMERIC_STD.ALL; + +use work.FIXED_PKG.all; +use work.CFIXED_PKG.all; + +entity SDELAY is + generic(SIZE:NATURAL:=1; -- SIZE has a default value of 1 and cannot be negative, this would require traveling back in time + DDR:BOOLEAN:=FALSE; -- DDR implementation for Versal -3 clock rates over 872MHz + STYLE:STRING:="srl_reg"); -- acceptable values are "reg", "srl", "srl_reg", "reg_srl", "reg_srl_reg" or "block" + port(CLK:in STD_LOGIC:='0'; -- an input port with a default value can be left unconnected, this could be useful when SIZE=0 (a wire) + CLKH:in STD_LOGIC:='0'; -- half rate clock, an input port with a default value can be left unconnected, this could be useful when SIZE=0 (a wire) + CE:in STD_LOGIC:='1'; -- clock enable, if not used can be left unconnected +-- I:in SIGNED; +-- O:out SIGNED); + I:in SFIXED; + O:out SFIXED); + attribute secure_config:STRING; + attribute secure_config of SDELAY:entity is "PROTECT"; +end SDELAY; + +architecture TEST of SDELAY is + attribute syn_hier:STRING; + attribute syn_hier of all:architecture is "hard"; + attribute srl_style:STRING; +begin + l2n:if DDR and (SIZE<4) generate +-- type TD is array(0 to SIZE) of SIGNED(I'range); + type TD is array(0 to SIZE) of SFIXED(I'range); + signal D:TD:=(others=>(others=>'0')); -- delay line signal is SIZE+1 in length + attribute shreg_extract:STRING; + attribute shreg_extract of D:signal is "no"; +-- attribute ram_style:STRING; +-- attribute ram_style of D:signal is "registers"; + begin + D(D'low)<=I; + lk:for K in 1 to SIZE generate + begin + process(CLK) + begin + if rising_edge(CLK) then + if CE='1' then + D(K)<=D(K-1); + end if; + end if; + end process; + end generate; +-- O<=RESIZE(D(D'high),O'length); + O<=RESIZE(D(D'high),O); + end; + elsif DDR and (SIZE>3) generate + signal ID:SFIXED(I'range):=(others=>'0'); + signal T,TD,SEL:STD_LOGIC:='0'; + type TSV is array(0 to SIZE/2-1) of SFIXED(I'range); + signal OE,OO:TSV:=(others=>(others=>'0')); -- delay line signal is SIZE/2 in length + signal iO:SFIXED(O'range):=(others=>'0'); + attribute srl_style of OE:signal is STYLE; + attribute srl_style of OO:signal is STYLE; + begin + i0:if SIZE mod 2=0 generate + ID<=I after 1 ps; + end; + else generate + process(CLK) + begin + if rising_edge(CLK) then + if CE='1' then + ID<=I after 1 ps; + end if; + end if; + end process; + end generate; + process(CLKH) + begin + if rising_edge(CLKH) then + for K in OE'low to OE'high loop + if CE='1' then + if K=OE'low then + OE(K)<=ID after 1 ps; + else + OE(K)<=OE(K-1) after 1 ps; + end if; + end if; + end loop; + end if; + end process; + + process(CLKH) + begin + if falling_edge(CLKH) then + for K in OO'low to OO'high loop + if CE='1' then + if K=OO'low then + OO(K)<=ID after 1 ps; + else + OO(K)<=OO(K-1) after 1 ps; + end if; + end if; + end loop; + end if; + end process; + + process(CLKH) + begin + if rising_edge(CLKH) then + T<=not T after 1 ps; + end if; + end process; + + process(CLK) + begin + if rising_edge(CLK) then + TD<=T after 1 ps; + SEL<=TD xor T after 1 ps; + if SEL='0' then + iO<=OE(OE'high); + else + iO<=OO(OO'high); + end if; + end if; + end process; + O<=iO; + end; + elsif (SIZE>=66 and SIZE<=65+33) or (SIZE>=130 and SIZE<=129+65+33) or (SIZE>=258 and SIZE<=257+129+65+33) generate +-- signal IO:SIGNED(I'range):=(others=>'0'); + signal IO:SFIXED(I'range):=(others=>'0'); + constant HSIZE:INTEGER:=2**(LOG2(SIZE)-1)+1; + begin + d2n:entity work.SDELAY generic map(SIZE=>HSIZE, -- 65/129/257 + STYLE=>STYLE) + port map(CLK=>CLK, + CE=>CE, + I=>I, + O=>IO); + d1:entity work.SDELAY generic map(SIZE=>SIZE-HSIZE, -- 2..34/2..66/2..130 + STYLE=>STYLE) + port map(CLK=>CLK, + CE=>CE, + I=>IO, + O=>O); + end; + elsif l513: (SIZE>17 and SIZE<=513) generate -- infer a counter plus distributed RAM implementation + signal A:UNSIGNED(LOG2(SIZE-1)-1 downto 0):=(others=>'0'); +-- type TMEM is array(0 to 2**A'length-1) of SIGNED(I'range); + type TMEM is array(0 to 2**A'length-1) of SFIXED(I'range); + signal MEM:TMEM:=(others=>(others=>'0')); + attribute ram_style:STRING; + attribute ram_style of MEM:signal is "distributed"; +-- signal iO:SIGNED(O'range):=(others=>'0'); + signal iO:SFIXED(O'range):=(others=>'0'); + begin + process(CLK) + begin + if rising_edge(CLK) then + if CE='1' then + if A=SIZE-2 then + A<=(others=>'0'); + else + A<=A+1; + end if; + MEM(TO_INTEGER(A))<=I; +-- iO<=RESIZE(MEM(TO_INTEGER(A)),O'length); + iO<=RESIZE(MEM(TO_INTEGER(A)),O); + end if; + end if; + end process; + O<=iO; + end; + elsif (SIZE>513) generate +-- signal IO:SIGNED(I'range):=(others=>'0'); + signal IO:SFIXED(I'range):=(others=>'0'); + constant HSIZE:INTEGER:=513; + begin + d2n:entity work.SDELAY generic map(SIZE=>HSIZE, -- 513 + STYLE=>STYLE) + port map(CLK=>CLK, + CE=>CE, + I=>I, + O=>IO); + d1:entity work.SDELAY generic map(SIZE=>SIZE-HSIZE, -- SIZE-513 + STYLE=>STYLE) + port map(CLK=>CLK, + CE=>CE, + I=>IO, + O=>O); + end; + else generate -- otherwise use the behavioral implementation and the STYLE generic +-- type TD is array(0 to SIZE) of SIGNED(I'range); + type TD is array(0 to SIZE) of SFIXED(I'range); + signal D:TD:=(others=>(others=>'0')); -- delay line signal is SIZE+1 in length + attribute srl_style:STRING; + attribute srl_style of D:signal is STYLE; + begin + D(D'low)<=I; + lk:for K in 1 to SIZE generate + begin + process(CLK) + begin + if rising_edge(CLK) then + if CE='1' then + D(K)<=D(K-1); + end if; + end if; + end process; + end generate; +-- O<=RESIZE(D(D'high),O'length); + O<=RESIZE(D(D'high),O); + end; + end generate; end TEST; \ No newline at end of file diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/SSR_FIR.slx b/Examples/HDL/Digital_Filtering/SSR_FIR/SSR_FIR.slx index 42e3906442d471426c5c5ac8cac7f873fffabba1..8d4406fad93c0912991a66615bf77e0357ecac9b 100644 GIT binary patch delta 48997 zcmV)FK)=7U>jQz@1h9Dn4!E7$oNEC90E`9z03-mD?(HUj#nroR!Y~vD;GL(iyf+S) zQm6)J|r%&9r>67Z(k$Yl7x~9R4HT5FQ5OD2WK?dsEmAoMQL&H@-kpyd z)pf&KT{mn%msp;sGUnM-JFp8L7v7EIEORj4lZ% zC5XYXl=MX;-N@cb9TNxr{KV{S(K8QXlx#QIfoa<`pOjx2*j4~5EPVF{Ws$=Ew%zRz zE;bKbUb9;9nlFjpk%0|XQR000O8 z001EX#o=^I-2eapBm)2dD*%%L^b?al2OEEqv2KJg42E}}BJzF&kSMew+*YaU={i>t zxDY`S6sNuN_O;aI5LKs&(ZA*I{{}bbFFT7*3}n1hkf#|4be->w8x*`=pHDRiirV#h z_6`-SNFdH_(p+%Xk&kFJ3kjw;QZUB2JV{C2h*neT7j(RN_rdDOV;JP3yGaiyi!6V8 zkl~&IZ6d@5D_(j9v{FR-mRFA;t~v}D@3WNgoUaS+%DHm9`7lx1c`M1-kJ-41i}P$- zEPrqy{}!mry+B@6aWAK2mk;8 zApio4$SsNi000*Q000{R003=ebYYW82pWHD<1i4#@A(u$cUyLhO)!ZH?QTz7ShiVq z=}nO*uBi0~Y1$;;er3n@x}_9+u-?4+>1mkl%~^Nk4SZ16>}Z~5lz@@8QKsF|-~0Py zLrFkk8qrw;J9>dY$qip^rK_d&@Y7od9u))S=mDza?YIdDYr}R_|zL-B}e;1QQ@@)aS&hy+4w{e^4WK(}Q} zX|h;@@fnXO@HO!7XJL|m7Aw6`_Ml!uSe^7Oe{KO4!v;}$Ml^D_z>6SsGzyMaBmOo z5b}e*OsPlt>zGxNRY_j$^G#ipbyh86PJk(chd0&lFJGs{aQQ5ZhH=07Vu%Wpv>Hdc z++@D`2ear21p*GKud0o?SpWbXVgLXZ0Fx~67=P@0WmJ_>_vfXNM!HMsMx;9hrAv@h zTDmVC64C;KAPv$jAsqtJotH+WyL--k=RdL5e4a0}W~~R1%Ts%wy?=4eF+xp60ULuH z0|J3yzfzRdfItw=;9uyd;FE#r<96Gz3jE)WRLZ}=BN5*rQ$1VRgWB`c-n`F(HE z>wlfr#sk{X$TzZ3GIu;FcUigL&z*in)p>JHo>$GrT*fPd-!^?lxQ~PePDK^) zAb({Qpb--@8Ojs42jCAek$y+sw%-?fLWP4f}Pl(HcwD zusUT~*~#&rDU$Vi>?uMnKV)EogM+^#2$(468S(Mem49m<{I3TD5>sqhTU+BHXMamQ zf(Fx11HXfgYjEFBtr?)Dr*CBWIV*_5vI^=6a}o);hf5x0DhX6{P_QC@Fa=2EC#y*G(f&=3=Xn%vGP(D}P}|#9R^% zdRy~;b$dG~nu0gZxg7oAfHjJmD)h(^7t)>~rt5Shi32f_lomPLUXR_|<1M{4CWlDk z1-yJ9$D*M|EYpb)SQZQ-G2VGnrt|jwJ!EBdHK^^)c7S%t@cNQ>uH%^%HO^l0bgmjk zc+^>Y99@SRE1N@mL1u=$zJLA`dU{cAS1ayvqcOT&C9;EG1!DdEgQGT7j|D#~E78r( z&2b!(|CX2=%jmLZlMD6CY2&RP_qsFCcOq&2a1Ci{!cdiHsTiKoV>e6c9kj4b>Mhm5 zH~S>#;&PV4XDNY-Z4=g)kQ?Xo3^&u?eg2}k??c&7AGh5SdoiL+34j0AKNl^`I>u~} zQX?09sSf+C#aMR1&RqjJ5Az|L_Gc!b(5`r;o zy8VvJe{r@JVKlK4brizsWNnWbpWrbcG%@hp3_JQXY$3-`4tH$~2=C3g5VhQ1F_b4u zyk=xO$ZW)BO+xGn3x8W#R(>d~dkB!^fL?qI&JcrTDVO3xOx~`M>6Ovr?2SlC1>%G2 zauqxzC`D5u1(roM^3!Ri^G!Q~#68c(NL_dSe(IzraCSaxa4jNyyxTlSib-7>NL@0f zSFov405uwJ<#5~DIB|$c%-%l0)wb~cxjLI0C?GR4A3V~+?tccS_=eqbbV&P^Q=94j zV<-ZII^!3?VKa>6@!|57ByyBI=5RV&XWQ4auz~{2f31#?hX?Wx=G#YmE{kJ5BSa(O z^)xoMh%UxkfhuE5kO13j)P~}ut;s$L@M*>1uJ!HR$hR6APF9rangMQW4MO=CjPAs? z`}m-%?P3Sp}ku;Am%f{Se5L?-9z0X&i!RMo-HwRSV1*kpQb z;#94z$jgyNV~DQm%!ji&U(n*C+5CPBpN? zV4xjZAB2gF?>*2Vw0t#${=fJk9d!2SI8I%$643z~EPwD1={oGg!xLksb^UlqmGT4r z{uRBtY0U9(@P|ldia%T(>TarOeUR>KcfZ=qA>jU2>gZJD^L;!wEVJxkC*)HTY(6UD zxaa=Tq2lZ=Rw9p%NjDaENg{MygRe(5{HNIEm_mW$o)vYS-GH=p(XW2*>z-W&H64pk ze*^3c?|*V{I~txGdE2qTa`KlLX7(zzBfi%g$tl8atPn{;IU|Px#`B)EmgC6;?`$15 z$K5i71`lV#`MRlgt7g9eMG-AMPw7$w#Dp8iv|g6SXyF9l7NaG5NXI92NXX02s6=0RUw zrGNI^-pJ6a`6r#U@4H(ju2w`?H?iiDaTti=@O&L~hh&A(1F3-c)2b@*6u~O7C0`~o zf2vcq#@{z4lYi8(TEs{LeiBr=@5@2jzwv!S$Gr?lPIld9VC+FFP$9}vz-?1HcUaE& zq*(xzUu&z)*&&VI_Vr%|FGn}+P8<9x^M3*JC>ol#+t*D!@+&nXD(lxI(3K?JFDA7{ z67$r2j935)7u*f-4k%lS`n{h(#Mb9m0Hp0)N-@}k5L0ahg)v1Lvm%xn1d{ebJ3YAPwNxxP^7Jo}j zr!`M;2(92BYzQ9lKlKeL2jsOsH~9ojl)QxnOY1cwQAP9j5P{{L=)+dA*r7HHX*}eu z^YP&jjUq`{9YEqHcY8;tc|$(`NZ&z;f?kgUQ#Aq(%sjJ$;U>XuGk zvYi~MbqoxkESIYGmd;g$N7@Eg^MAV3)+P@8VJ@p~K|ztfx+=6Akd^fWxgf}zF^Ee{ zjNHsv4D$tyrdUS4|h6?k48c24#TAq(g;TItm7qqtCnd=DfL0Bu%1g(Gel)vU-KyN&8ccEOs+9a`>LR zLkuamYaF9iiHe{WDwZA^TwjGziIkgwj@ugTz%*>SHXBUg{w`z?zJF!qfQ)Lx^HC2S zvT|00SZe5vPw*g$V)X7qab51((JEbShVvoidbDYmH1`KZ?g#hfL&Y~7(qTA8{G7(| zwCDkPx88kiuO{E=zss`C@O_f|{(Y7olryNg#ZiiImB*5LFxVkXo6t$NK;hhp6Tf7a zLv|8fO3MDvh=56tjDHB;>@apRSCZLyi~6WdzGhjC<-U|+I0cXwCikbO_5S`ZRnl1{ zot>$PeP?kqGB`c|ZTkxPw~`hW$)yO@xFl(IZ8W-Fc1612n%v*GdO{oFxH=*}LlqxS zt=DiQXykv-9W?(d`{(Z{G4Jx}w{7ydzhMqc>pN4tQDg*0+ka8*?_)hW)?@cW+uGPL zFyGW(_~7EWccpuTnjVMwuRK^&m6Sc_9Y^A7`yO&#aoMTNMP2%{B^V7YyJ7YN3}I(} zh-89hHs+5a?q3qp)%|?=#|H#}S=}Y4ICO%)v2%!+nYm5C7&>hzZQKfro_-Wq5V2-^ z`V6tLNIqo@2R zQXlD_q@<*Tf8(=6goNJT^1b8W?7_vA2xs<}D9rT2?~yyC7i)v8wu+zI^YQT!FsXcR zFI3M>E&kXT;d?eF+SHS6z)r8E{QBrjLsz(ZdVA2(rGKf_;ci|6$8>KIAC%Om659>B zclr4iRxkRYpFWLQfg>=i_dHi6QZ8ifV^aCGz8o`QZGA#oZtv*`P5TK^FsSk(-qMoh zA<)hF=aUL9eE zGO7Gs-+!&pJidVW?#-hrjP7#OWxB{L5A59C7p-5lJ>KFhHr4P^O{qqTNTUTTTS#bZ zKY}O`0}M@7{#q&JL%1B=l6u)fg&>87Nq8YU!G9K89@?A%|J%52P{Y6p`5HF$<=kix zDZ2J4ZJXRiZZ3x!Is`34j-UV~nD6?9ia)nL`F|GyL3DBP@fdZtLuBuLpy1Kg07#W3s4vmkGv!-u`r_QrgXi?p4u-nZym~9t4 z8RqQj>6Q!Zj->Kt)h{BXTw)v>D(ptSxxZXK+if{y6HQ?^0_@M?$J9M^F*Y_#SiM6S^MB{rW-mVbmUEr&f=-A=Mn;}T9cb~HnXy4Z zhQYBMn_c!NitV!JD(cEc6f_`^`yu7^JChZVNdy!@V_xm2K@SN~`ZbW@#OHKE!5)T;>?_!p?~tZQjZV!PHVrPgoK2c{QVQZHDAjHku1_$J7_wT z|M1}%2tg(D>%YF2q*!VtC5Kruz@2^JzpboIW%MsPIHsT}xq76?g#EN8kdGookiz>o zvUpXST^ldja@@1Ly6)XGXO5?>uB8>8={G2Cwx&v1Cx1R|){{-ZFA&@jkbmiS^8{69 zYFj$uJInLuD8lJDHI^gto}LXg1KDZF|J|$VU);m3X`#{oWosPJKZk;+KHvr_vDBa* z2jm;acEW^vW!k_&E>ql>a+(pJ-zCdoshO-mH8WJFq-^Ho+qZ8i68?S@#B#FyjXu}B z^0Cy>DJi63wcpaxBJE&xJb$ARl%;QxS}H5?fGL&m@$uQI^)WLuBha06~f7lZx$+;eLRXM=g)DOgVxr{o*qOdRm6=BzkeOV(fr8wGlmqA zC~7*h(+Nz0KVM`S2+*=){pm-Hp+*S`3NWybZygyxdS@88)PfLAB_e@_i@4aNTrt;1 z!_1LHeR+unJ%hwhB0w*Ykr8HFsVepJ$%Wk$zb-cE>N`9>%-AmdA|MqUbvo=F%6UUU zX;cFYqgF|2DV9aeuYaWhgEAdYC{#MzS-J5Pl@Qm~@;0YzwoAs) zf7-G6W~O3%_y7q;MX($}{Pu19^4qt74#<|P#tLG<9M;|}LVrjIBwYk)a|DTm3(@xm za@d9|`XGo$$u8FF#>Q=mSm`Im?ZS9;=#Nxmsf<8Dh+Jxj`8pGakQkB12Qrw(R3=lA zY!e%WoRbsavYB^tbAh78YO*Z80vw0kq*cJEn#rj}(NMc&QOm|aU|&Lh`%(kG=b8FS z7)?O7Okk$}*ME$G{x9yRH$NlWl0BVt7}BD*1m=%Z+*84B&^_LfV; zwg;&1b$=Y5^=6*vXxj}&iU?42wk)MY7}g4s*>N#FP3}oM;n7JpZ1wi(KL*DqscWeuA97|Q&)Qja}6GO{a$=l#b4^dP`$Pip1{b6s*Q)_zLHfiX3(X3$x4pR4a&iEci_>QYO-&(J3 zK7Z3JS`@lvWzE#}@v99k2I72ug&#~#U3jNXFK^=h*RS!qydQ`jODyTmu~CVw67E=6 zTMR4TEX&(k8|{8r@H_uiyt_a2uQ*F#{;a5~ssLCKS*m@lJ5pU=AH(0@U$0CjWyqpQ zWr#q1U5H~e^7H4F{r%{@y^mM7w=($}rhn}L2!MXuf4OXqR=rmU2@8AQ6GaxSKk{&Y zdwjJX%fQKrb0t0_H3ciWvm%5vH|OPAadB;vpIj~@QB#krv(lohdn_BaO_$9muV#Mp zx=-|xV^UExwXRa6+udd<4)~;sWu|XvvauhTmzP(A=W$Mr@-rJZWcAX6 z3dae(7ASuxHigAZWi614!sP*nE`Nbs6^P5if-ia=>CPQ#_AR}w{^iK&x!>+jaXIk5 zQWy+yO*Amf3_R%_X#2c&&TvCP7MeNtX zp#i&WZmMMKx`#rr+NGd|t)twqY31>Cj;g9EqZ-w{LA*s^7EyE_}45awD4fvRwwVQ%`Z?1m|h7R^5*8m>ou%@m{= zk?F;&c?x3&bnUJtaZ@8*s%UJNteux?k>)ScoDLR*K(V6}iR1qIr6P?TFZ~#Qk`u=cPF0FicHtkM*2uO;Z7ns zlS}*CP@i-OE?@p{d75VdlN4<~=9*b?G)u~-&s>WHnoHP5OOjpfTC@8{Ad~!2Lmv=h zXp(p4n{=UEYwK)>j-*(U&edo9&t!|)1RE~S3w}&DFI=CF565V*)PL$aiS@?3f|Y9- z(L6<0Ox8d|+-bY#Q1nVk{)($ynq}DJu2L8t-d|fTnYp!mw|loQP{c5wpsLi>Rp*e5 zD8}*%BkRg@<;0xj4u>)hkq7*~(dwJO!j9WlYn#72J2o~xS`k5zj~5-4h`6~Po1bwC zBDWNZ%-_MQxxdX{v437R!uWnd-oLBgtk=kxk%rm)&^XBk7=C-XJ#f6}@^jZDr}0W;e2Q8U{gFPe|s@rd;1yYcR;D8L603s@p2EU z(0pPS^SSs=oLY!J{oeD|&Sd;qk>+asGU9r#F^&67c{*WvcYn8rfw}p(RghG0o}IXl z-h9OIWwIZ2dASDO?Tyl5K}E%6Y}VTC*ErfKr`@udu-QfDNW%HYy8^A-Mz`@eNy(jA zUGW!A?U3yjjz=;tZ-HBdNos3r>#0y7d?Di+ROn2(VU^8PF*KG>cVOd1=@jdIyo84e zMq;{1ewMRaQh%uTJ`7FtIAk){cT=T^q(KQ~Z(jRX`mA1&jA3sKFiGP_RXp$WDpQ2D zG2C!*X+_^b_l|o@aCj&r;2!b@r{_<+#>mZy?JN(EhG4oF8;Xup;7^9*`nFdhSV4}y zDf;ST=cdjB$-0a7z;S5e>HJ;c}^Zht^Nh!hE!eweYBQn$7s|?c=-#h3gVVg-wKx+8)>iw$WyS!J9;@8Lx z`!8AcqUE=b2Vbv@(iH_8yB$){x?Qo+n30gPVzaPU7!u}RK8>4aqe=BV$vdlIc_dpL zO>55oRev=Qtx`~v?yjn=-1Xy4T3ljc2$1&7NlK(xs6aSlk#a+lxr{^qjqnLmCae7Q z93tNu8ymASo;dnpgI;SW(E2TklrFl%9;PF#^hOm8756LRA;5Ksn}>&S>+3UDmPsF< zJlaBLQA*Eq?QN@r`^$Wj*(P1#r&`Q;m28KLMt|jNczh+=HVnf0`o{J4qRF8mrF^B&0WwGVJL~Qa$Ijq@*y$9oHm(d4X?HQCP4` znJ}Dg1BVtAV`F2GA4*|Ybj=^HJ2J$)<5E*Gz=wc>%XA_`LXeqs-aJzU=_=7FlQuOq zZE+B;vK*oIxjXKC^G=&DJUlK&av7>D+$Yy_`rm%Juv)Lg{Z=S38gsG zc*DKUK1pQ?6Ev81`_z*&ZvQgg`@M?0*Ft z@YtHKOH!#p(pU~Wu|q9)kg@o2MqZ{f|3t4^Rv3CPo_|u=#AnGm(_k5U=9d(^NrKFh z(&QS?c*?>OA9NY7kVigWTXNGn^`qIn_6F*YoU1+`sHmJ!UNsO98Hw5Gwj28Ux9m@c zWonBWGOpGu`kol7$dwf^x~zlWg?|WeCGNQY4W~znd0z-NeW0JSHtd?lNIODT#A6-8 zH{Pw}U%81lyXG$YEYoK1bI>#MmVFA>yGB2MCegn|9boGD?O~w6a$*d*oVtE%`2Ypc zjLSNAZEEP!RNmSJ$2)Y1aqsA*|wS(DZ3M;{$IdM-QOxA|BZ*x0a6+VIOqlcNN5 zO^2r{?d}j>UK7!_M%cgd%0l<-iJ?9dcnGW@jjN6BE+^HH+>m7UZ~igkvCC*^>33s& z+v~0SZX~*EaxdMxZLP64x_@N3Zsz9@KlZn#svkF4O-)XV{8MI!+%2i|PAg)VsmdlM zv_8JRY-0cZ{X?xkQKlyXIdeT&AmicTQ4=<^Vz3d5Km8wj0r01G{@q57lj4)F(2xXf z$zx>~56@NqpupKwWSu%s>-YRiy*b}CB!A zPG#i1&%eOInDy&sXn&cSD!Q|xE!6XUg-wn=X|((vtcfI}`3W}uTwl><7Y?;3Iv9h$ ze?P!GO;zliaK6?yEMGalsaW_#X^9oynj0x;6lg5lu=WQlR2pS z2hKSLaFHC7{gpPWDF?HPyY5L(fkoW62YKq#7Wergi)(wjx~8WoED2P79&Xrx!QS6HiTF_V7HQFh+XR>f zZHvU>zP<#URtGOVvBUc}vQtVxCcC=6a22L%blnaD{(o{0R*ws$BMS@5(fRo&{j#3v zGK1`i?YOiw%vyazb6#?K=VlA+GpF^QRsC)X%gJoZk&HKbV3gQsX(2!_cWh4-9G{Lz z$du{GluYHQW{L~?TyZZfEUavAN35-xfw!k)Vp0(Ic=OC=HPwyNgWiTpRy~9ky{V0Cu8Ej}tLI7ZOz=S?#cjl$jd`1t%ab#}0Mx6RStzkj2ah56R} zAM+C{{NP89h2zd7OQ~KJqJCLjzl*uKd5XBNFbHvc<$?_Uj3JZzn{&NN69lc|;xXHo zX;oHZIr1pNs=o-pGmwHi)a+7_0+jNDI!vszZhu9knds@AD*<|;2L+%}d$wPs%zZ3B z=XVn`CV|hB)CyygaE3HBc_-BR@6Gb~ob)llZ~a3heg4C4Q8;)z?Z2Cw>%e#g$mcrQ zP*DlHN-nqhrt2g1B{VgOPkO~LdrIEiO;`^O8*VM-mB^m>&5TWL3a_~mfwtVFr<-3+w1_)I#}-?aoQ@m|PgJbLSO2G8R!nTz z%D?GC`iOAKjlX>fDWYDyK0ZEsP(zu+0Drm3cRM&|cCf5#*mAM&@X>@S_uj&jipSeF zn@oZIC2VD=uoe$bbjcTBqinP-v)F=yvv+2z<~IkaL^_`{74&SD>6X7JZcqhE1*iv7 zVOM5kDJv}l*~u5L841Ag&d@MhjoE~o)Z}GawnkBwPRa3ZMcY~(%s$wtLP100segUb z{!4dv1{=ian=%czEy(@OR7`O`1_=oXGAgQB-1-(%KTj`S?Gc=I@}NLnTvGPD@Q8vEZ9c`Ujm*C^9f zE9XLgm6*NHj*0cq;+Wc*E~ChR?tictR65L6qvSBZ+!l_|XNc?`&sydHR1al1$z{HHt$cO`_xmT#YQ)odizDkwck&us|ff5f!v6q5+SZ=xgehh@Nzhlq-R;G`=jo6DkN?9R>xf~4Bf_g!udF71 zV6UyMWoZQv2UI z4W^6K8x8y@D0n|tZGLXw#K_6XIa~D}O+Jb=P=VSDxhoXAMr@|l*Zc0__ArIp6p;`^ zE_xzRxR}_vb+O4~J(8=nJ&sO>+xOQnO8g7H1m`^nd-&21zd8L$QAJ9TnQ}T@gZ0jJ1@=`em`>n+P{v$RSIv%ce4Pb|0ArfY-zX3615C; z3-nNL(gL2LqYgA4hb2);ai4~9m&fZ7|12$5r;EL}zbAR=d(~^>PT!=ycoIZw(i!q( zsBwwYuyJM4W7)3yB7g10=nxA_rTsFFT$B5`U-WYUk{f7KR*b^*eSd9(WJLtvCD6C6*Z(LC;_7SGwZ!rHGXWZ|{E25E755PYM8Cf09R6`Q zT_jB8paIFt%j?g;Ko=m0Sy$bW5b7T>VZwd3DV8iiX;dZRqi z#>R#zV2%_a7si98!&cOaUTQbg#_L!KwVOUByhNo2u@iJ9i7SX2>*~WGU((l_cMSp6 z4sD-USus*yC8&uyP?siib=`j=A%FMo8sE#_o|94Kdw5n>7HYkmEHVTM6{~%(U;E6sd;)zKAw(L5)&a1D@S{nmQ;Y`WE;2n zVL8(~r;LuOg@lF*H(@yk1*74v0hNV^i~t0n;(zPcfO0EgguCBjz+w-*h&I8RkU^pXSQmgy$q%=Pt&%TA|tHc8Y8KE;1Y2C2@QlAKewC-cz z$|{0XZs2h{Lb#Wgqxao0Dv9OD2O>b1Q#|C+dcT~XH+me#eB-m!fgS+)rPt`n0`KRo zEq^PBWcDz+KQ8|}Z6$O>NB#^hl+24RsTL^`Ze}DOEVNy zH<5k#@PU?_yK-#e0>AbdsDG6@Q4xJ%adCCGT)wB4m-IC;>3=zD$W2rI6*tpCn}nSg%ipv`VJ~hm@mQ?K~IYwV1%nIkE)d}BE!z{$)xuzhC>Q~Q!rC9h#I~? zrBnVc0x-Df%~mcm3rh#QZmh=W;R)!NddklsARutI51Rp+k$)aE><<6)I{Dl{(0EG9 z%62U?2@{xj>$^dPm1*y{%+mwye}DOq%@=8^Uu+~-ez52~xxaMWp2GY(sa4qM5$4p3 z!;FYz`s!6+mQI)3nbnrS$ADrPG%FgCF-v$9T z{%Jjd3StGS^3R_?0nDG_Q}BHsq>YTIk)_%LkQzTaFq+d!d!TSK2M32;=;u96%Pd`w#In}?x?;?)nNYNVw!4j+ORZPx>iBSf z{QWy+^YyJGF3zc1V|$Man8#RPq692ffU+G z`cSW&%xU^N9Dj7%b!)PSV0?T$E-o(M;r>>jaUW3n`|Fbpy?<68ubQRhWPK8KLOS%I zeOtF!ZJ*(#I)tA)2DAz5Wq_-IEC=1KnBRMPa#H+Sx%oriQ_<_c2}5r)WTx0gqYdh% z#T;p6bJfX%4|Xur3xWY;-FYc%cKsVt!==KI%8eK9{?&-6LVYs+1xPE?g$5_jwFo9W zV&c$+g?I1{8-KN_#j$Q{XdqRUxPKvjcO*ldO@M#@ics!u*Z8qhQ&r3y_I3eCqB{G< z&q6N$W}%G^vy})yt%9Hu_y+6}q0h^oi%~UlwT0-t!}?TFLAa)0b~e>5r>{t;4m_k| znmAQs5?l7sabRyr#Y^*jj-Gf11w1@FHFMlivnu#%F@GSYF2Ku2*PEH^fTirekpG4H z8`}tbLED`ZGBYt92OqfmQfSfPx=8$Hi$V0L9qH)oOxDLo6mFz;K;VSOpdqEobe1Pg zab^MJbqrzmA2~A1$e7-_RFi!wU}8_^e6@^*EVo3!+V)&ip4aw`>l z_J!K-%70Y!cCSXzyo8LX$INe>q92z#h8hkfojUNhAC~MGyo-#H{ zL!O3BwxRLW8f9l^d;X1AI69v(MuLF4gha~+AGSSG&&|z|^4lcJ-0%t+v>+OKuk*i6 zcoLLJlSoIGB+`}SZ+u*pCTr+1T=WL`xw6=~pu0*)ioOTlq&5#J4LEreGo% zv=-WF^HMrnqYHc|lw(e0Wqvn_hm68`poc_KhQ=;0b|-QvH66d4t!0ZR%GqmQ9?U#y@-z&zwe@vU7TyjE z)e1STK&X9=q~LTE@Pbo}pPwjAz@f*sqJO1_yMVZ_kS)~1lO)AeuEEujfKZ8~0WE~? zHns(i5aUYLJy^OZq=yM&|3Jt5D-|cU-SPWk1C~WFj*S3U1N6E>OXqX-9h>7NuH5AQ zW%dgZDx>VN(GByCJhsrPJcvaub&i!BhjU}Nxh&>Xd^WR zpE>Bp9)@(vVe6_&gzI362Is1QSAWrOqfIm%2=bOB9fVppm#NBPN#DfC_H(hByxhui zo$4%mgZ{1swxYkI9!^{oTndt5dVe6>|04+!P*-*Qr_GUaEi<7T5-=`@^!}KC3$r@= z99#C``u!13WazX&G%1w8IMxzqfShD9>yH_Vzx)UMyz%KYs{WjAZQZ zeWCm@EIHEOFa6=eGhp8J59JfSd{NWUnJ(;vtN?3nuf}Wy0>_f)4;GskczMU^ z_SM&?L`Kh{Vt03UmG+CmQKURM{ii_gGjnpfTRHLfjg0huQ-+7yb7P?u&biM^MB{h_1gSeWae}J)%!pCJ!4`LfTE2oE>c}CdSnI{=QQrk)%2Ry z=S}UN&(_&dSpN9g1)qTT_kVYSFo_`$VUL5s zG$Fx`FdDybT!}lp09UbhgmNiE7BCKeId$1rub$-O=6^c<{e#b>t1LV93donf1STH) z1wj~9Yfm&q*zG|RE@MJp-&B0d4wfqo4GpD`GqO$zQA9*Uil7tybh)8z8m33zm**+` zw!}crU;+j4UDyrd`ubWC+zgD<9_JPiE>_E}Vt@$6VWel()x7Kmby!_txM5Q^pQN2y z_*C6Y{eOv-R=E6u&j&pm$NIm}l#`vrTknlkc=wKy^IZc3 zk|OHm9LzLFzgc|ix8=WtJvcEz5EvNPuv^}A1O`hcTMfQZsT)}NX!sP&vu9aA4}kDU zMLoIU>M29ad){#L`g9ZS76A0kmeW|(>a!a)H-9YI0Uan@dP=N4(%V}w%|ZZVN?c+h zGU!eMCY3CMdixaWy1ziUZV#EU{kz=#Mx_{Y$O}c8_LS5tE)#t#cHw0qfw20 zj(<_AtE=PE)Axb1E+m$ck_wNBad#&x>xq?k2=`d_t)Ew?2jcYVZ-VO4Ud_n-qJ0Z$ zj`+zRhO39$Lj*;cigf$JBZUX=o91RwNV}oOB8n8= z(cS5Y$S+>{;uv5zfNb9<*O0@u%CNO$*0zU?CIW_DzUw%(qTG^JN1QG*2+PaMLnV^I zu7{r6up75hLf{(}!)lv64vl=yr*z?J8}6r}E%IeLxs{c8ZTA-xknPx3xaU$*V&(9F z*P}t*plNOY900&7pKIs6g36^dpA&xX zPZO9_-4)ZF1+2%P>9G@oVxNV_Q)=8soi6Ow+3a;nKBWRI4lsnFZ4c)a=(xDOQDl6S zT6Ef*zat15?k`|G{trF?*?$`6&B>uc?DX_GQkSs8S1!K8Om9*{q=HdRJ42qldAN1G zIkUzh<3$D@r570bG*?46)SGmVr3gD%9UTKh?oxDPQ`35O7`2U-DMTM=>$6G!A3;ClV(@O74do&%n;gyYzjlHLZ2sXD=t&b14*<)5F+@v29 zf@*;?L_)<1NJ}%|(|=(x#=fVR$E!uX0Ym|xnzedCzTh$<2DfRzz#CPBH8qKVda8Wi zivyp&mCwbusU-*Bf%EMe?KiiygfS9hU}CyB^UG=_oV43C(iZ91f3- zbr^j||5vmY73$=~gMopOHM1L^nd#8vYvJiBh%6-u=mn^3;D5xjCbn1B*Mq-&d3tqo zL(jYy*z{?H#k6yDh0tHMtXXB zJaY2SgM)+r3V$>83#rART8&~mXf!@6ziq+`IpOLV3l-_}=g-`(TWak3KhZrFoX`$h zE{#g{YcVo1G8~F+Y`MPvms9iAP_1M_tKxG%%78l#gp2; z>SvCRYYcwlD;Vca>5e3EsmLfqVQaHBH!-2rDbxQH5`TgW8PDUx{#F~6n%QM;P zbpYUKw$;}=zjw)NGhIm}RCbd0NstMqOXIIewo!qPvjKpV;GqG5a&&YQAe|jB_c0U< z9|(~7vl=rYH+l3P-c0}bK8(co_5%KYC1uN$S`b^ZvLHdUw7?%Ea~bzkz3+wZg5I02 z#Z-u;mVc9#MTSqN88*3tl1Ebh%D#%~Bwavl000Z^Fp-=oH#Ft_283%U zP>g4La|x!Lnn2S1l#!W*!CkU1es4ssifqnGN@l zqHX#oCFnHmsRGqZ#_eZ&l|~1$=lr(Q?7zFar)=i{l8YYyCird_6JCgeD>!MEleTOHd@$F^cBcPx@16C|yq{{XQ>)H8U#jZVZ$JAfD&<>*kbgNKa1GOcSwqU16f`tC(}w4; z?;jDB6Cflr@}9DoD0MP?2K!+CP00S>r(bj#H!9Y6PuFI-xx&KjfQ>LdYpCtZZ(f$(V6{Ho9S*w~mD)r|yO zDLL{@T{}`?A)(pnz!op~K&qjV7_ZD0XkvuQuUQC0IKwR^W~=PRlXzmIVAiKIH{+s7 zNGv^ToFBBaH}KQo_(zZ3LIEJQ2(Vndyr!WanLTasgQ1cGBqYM3H@Bv|Ov!v6cY-*G z(uu(QgJ_`6G0WcadQTqRycrnRkCmNZ2xgoaU-in-+LiNh@L8rBvFcsiX{Le#xQX{Y zc$~o2c<2`ixsE)ABX`W^iQEzoi82 z3YFVh+qK&17A56LA_1gwSJynWLWa^28GL zTfr-HPW@MpiueVo@XDJd#fZP9?MGhkA_0Tw%y7CXzSs1iG&DXKhe`Q@SM1SrlM1JI zv6xec{`+T;M|)3u#HA5ucN-nOW;@#>&a(t`qR`<*hw*c8S{I!R)V z(XC?OxrIa6*y>6}^I#lX96Jq{vj=z8Z>1@(hAqxG?imHGg7gf@pazY}r4^HISWQk^ zTAGQjdy2i>xOkaF0h*kFdrjpDa}r4FSqBN6)5`AcHNVY-g+1yFETg>gV{uCe35ygW zZ_XHw`KJfZWx|H+o7Yj8eDTqne!~mE6J1fQ`&j?6nBP+|@V=8r2c&)f;iHX@s5fQ= zhn$?BPo!{jwD|dD0%s)0BQ)3dgbmux^0<#UylsbpiZTpWXDGRZKrH%?Gyqo5-=Q{w z&?1eKlSV`f{_axa!GG5@_0YR`CyynkBv#O$CPpsgBYcB5%j};uw4QbCdNp^KeW;sw zJv}#aIuPpi2G{HfkE>Pr$K#k6P4a`t%dyakg9WjvYwydyK+sRvJ9MZXknW$rF@vs7 zBfm2uM{t3`La3=>GP$lwi~vd%OpJ_IR$&dH+s|SiQSH%p)=6bL;l#n{g$v_5njrTw zhn#^fnFc{cUzSsdApALS>RIv7Ra4N^x$q^z4fI|_t=BOLQkYDXrR9<#R*n~ zX`O-7A{4fHd0{$?4fwlK9cTWS1HH`X)MtF#N>9Q7_P`F09ykrq7kA@};-UL$2}DIj zp;=vAT*^M8zB}Y}CnIfL`+xRU5(PcF7d>@E;`9;wjS(dUL(O23clbaqYtkQkh>#D=s1moKO{XrG91R$Iu2!O zdR#q9P^Ce;p4{My2fq=^ow^7|84&X$GGRQwO`vy4t*y6yceH&^XeGHf;JLC+JfAg+ zM43+eRpAAhmb0-aYBEP_r?)d=Z5XTi-|6v*nMM8HWQk2%W)qHpl)oCqc7m__pAsz{ zn92|UxK9KH=$?m5<~6Y5%Yk-xuL_D_sF z%BU})&Vu^AY+bjOO9pW1m;5Rza{n}{Zy6c^Mh?eR(PMO)_ul0_H^LmQ^1Yxla;0gd z|I%%)R9b!p&$2?`Wsk&2J_t>-P!E3hxcs%#tKHzzD=r?#1*_VXU#od91?qH7RzwMJ zVm*Vij%SzG@rU|kfQm5=`;X%9yr{`OMK-6^>gTHBwj#|Nb{EY+*zEz~z2VksCV1XA zz`$@NUb4Nqy_tf9gyh#~f2U^-xsXafw~DM}Ij&d3ay7f0$+YKja(K9!HRA<}{A&-N zq64!H4SgIBw{t7DOj_}>)-rXWI|nrYcr9%2I0l9#I_S zyVA+w2pp}Fw!OYMBv8A)=3iY() zfP7pkk(`v6m|JF<@(4c+3ePGLAJ@VEu8y~9nQwZ5Z_}VU|FybKK|Qx=X1lzKN067d zB72Eb=L9N@>Tx<(wo-8E{MH`tSNf~DKJaBAmr{7Kt=)kkaILFF)gcPBJoSJnAl?m` zdD~l~V8yoZ?)Qr?C5DOra;I8dr6as3^$#SbdaF< zGTWPO$1^JUQr{Y0^>o(N`)3j$qWByT2eIyMy$uy^$mgF_gk&@CagTpr?M%l zS(o)C)p4skqlBjALlirXmm3SUvgy88I;0#_fEp6@bG)~?+i1Nucs_-3dMuO<{Oao6 zndSy2DGAA5Z9EctJ0?q#!TPF9^q`^_Yna!^-se**)hf zC%p8}%ti@Hi5QK@3wyfqL%}|X){9OZ}FtFk-=yP<2&y9_&06xxW zyWwxG2XkNfp-9WuIm^8(6?Abz zY%Q5@@M@?7( zOAXzjKQmi@6wqgA10p3Ha_)DV)ek4k*KJe9B7JjXe{imIcPfs7af5@iBE7y+{S0Qc z90UYl;t;_lrD-BzrW%6(!R(_b;)1HW{)xJ!K4m*Mxg0I6ew_hYHucef`&%QvN5EY~ zuDnWSOiZaaf1d0!J(pkxCP>JN)7HqYhjTaUl@C;#sN_7JJ~Zu{evrMN-S?juiGme& zbeVp}s5pC9zXrPM^CI;#Xg9x5alF;{yuJa*P7o-+AzxmMa4ymbk=n&VPe`Xn$Sh!#1k-_KNj^KlKHZgDI0kX_Xk*g8z>%!@LrXv6HBLOIRtggx2+b+9Kl?{Oyc}xV@Hp&m zVqrV^YHMqK_+Qxg1paY)_JjERU>}b|&M0W%1`n%Tx~j4h#f4^FB(#(q#dj#bW!r{X z$#||Ms$=d_%(#6(gI~w3OO#?BizR^s+$1K9x5CMN2XO`@r1+P27%n`D2GP!Ix7BK# z#d5z=vqt7~B5-SE=IWDyhH)6?o(iN`B2Uoeb6e#(-GW!oBY$S+sHkSLDG^0mT{3EJ z%CpTHB1ih?i<7S6l1S4jNXIrZ+A`RC+lj)9)m4>U1H*|uy6L5*rMmFHB#l6(L<5+e zipif#spT-QAiykClC-um1ck~Ho6Y&N{Ea5!gocK{f%8g70ZXC}aj}HY4Yn>JvM#fV z4@wOGMzxX4RxL4C=B!F`YlZeL3a%H8lSQL_{I$lzWmsMee%B;lh-t=1U0s$6Kl)dS z?k$RHkv08M5#tOs4d?8eGa_&$K}Gop5_9#N4v(hG(0We6OHuZW93Cw*j52^ThsLK%C`Eq~8$vQcFu3>t_DUS@69nLo4qsVkdtk7@{SuJnH zMnA}&XJJxjeQ-{8o*gm8v%7}YEuD3!^YJ5dSrVRR@Zb}OYTiy>LTOJpzEnFytw^#ukaAC&v|Lj%3$WOpZcUJnr&3dK z4zjW6#|70B6vFs?&o&>JHG_qOx&F4B+TEY7!otsLr7fDW%dGP}ckE)5h&kd1x~|H3 z_(vcP247Lr+3^5^ehwz6J4~Qi@RHjxVpG%ctj3v!3PqzO)3TjJHihdj4JgH_Rn_f6np=$!(F-M#AawR!K3Iuj^v`ul57@>e&4T$xFu8xla0omwOc5#TV{sRLS zeh!2b!pr8fmR6ajsKU1d==@6b(&mW^EnXvL(-Gt2Q3>pLkXw9YV=X=LCQj1?n=N!oexT`neypN`8 zHq=8uXP0EY5ri5MtIsUL$V64zAL1paoSOTLV*tE=SawE-X~;MwY~T%`qj44zHq_D9LNwI(sbJF$wJ+@ErCR+2oyVMzWxT*@g>$?3I^53ZLS zBB}<1$(x6MF6A3LEK8Q2{kzTB#{4qBnR6W6$vjD3F|^yn-{sK{SO>pTPMw1VfViH- z&;bm;EScMAr{C{#*qRpm7iCygKaV+JWvHHh3rjFQ=qwy*JBIfBoTV2K+^*3P36qeM z_>&c&W2!XfMIST1;e=$T_`9Pw#eHoLX_kHx`Bxy9P=llUQfG76gB2jklXD=c=d)-I zeY4_&(=Kx+nbC_Tr7+1rmf%9UAxfUWBoB1^k_{1Q9_^j2?`vZH?h4naLS#4`F?g+- z?&ad6Ny;gNcWn*VUypTaA7_ZssGP%K_sVvpp1OW<;oo{fTWz=F?f8Bo>X{t}mwv|9 zr(KqgPUH7To9W1D%iCxw2%?(O^R^XaUmm^JmWquQ3Z0)@6ovOR7WuSXKm3<5wHpZA z15CiAlNS@A4xL*#e5{6`RBz{5vPSvJ+@5Y{Qg50MlfAFi2DE2%yTf_8Pky;5i)^al zl@O1e?hX7twH%nXR9xuX8FfAnj-}USH`ii(WGI8){W;>QZfCZiK4J7KLLn^cvpn?y8eksz{_z-%t`l{nV)ZbVl&3Gk?R{h zyUn|~oTf%rwIDtdB>z6{@$6ebx+`uiiG3LtCW{FUA0uH#3SO6p(mc+#vPnThnV#68 zc9p21PWSHr$=Ej@cR{iK)`(qbx=B+jo920Kz~C3+o#za|^)GpJ-3I zJ+OgCR(nbc|L`W#7&&Dbk*(?q*T}kKkLHwpthuthi4b2?jR(>Oy8flHkQ0s5Rb6x> zLGUM%%uTxf$MR6iC5@Yl5hWKZeH;xZOTyKkKNY3(Rd4(%dsfV;__OF4G-`Qw*DQi* zQDl2{RZ#0(kZKOG!GBjXsIq}O`4b}ZZrV-dj^0G6Vp`sH&#UbVI5_7M3z~YP3cu~W ztSW(sT>2#F$G{vzXyP9R*C!@b?iMdve!T4iH;Bh#*hbgP27I?2{lVu&HFXDCl@*l) zS6U`JlMaHqA89ZhncVNn(Ku?V6sZna;kGtC4<@Ns>(@@aS$9R0B%uJU-}bKU^H%un zKZU!dQUOSjqZbZitX2uF6K*6f`sVSz03ao|$jXuDk%cp{l$hIjbxiH#5gO%f!iKNM zdZoHaIJVVT?=+z@Gw=0@^}~+p8yg1(knmie^of93Yn9~)zaifM>A8RH0$^vh$UW2c5 zV+uyR6tudpzTjDOaX0F`j{lY8QDvp&=vcR#^tM+vx3?_EDFt+h=L<4=%x6pLl6Rzq z2nG|) zwgAo+Z(RJ#b`Mya2?9-R`GZ4tzErIl$k~A9wSC7fn4QN3m8vp0C7+s-!m2&}zBkCh zB)$;e7=#s&@S#ktW^PLKN%o~+Kzjr(u?~dZ zrg0CmyW2gp8sDf@&NX7y)*o>unHXdN_f3J4zY7tq!(%|LtSHV#Wq7+q+02*KrTo)` z1XUeI2k}vmn?LoHc-3-yCq!S{Mj+PMPwIMI3r&P|F&z*@PneSm&7(JW(#ZoIST=>~7ylP_$A0 zc;sF4xY|l@*hn!1^c%bXn#CCyf&d@ zwF0T=-?9NiNpYXm05j)heptAa`DT`YSqw0(w-o>>lIU?g}2Hinmo=gwL7J=(6 z@O^GUf*c%jHuYuPV%AVv*wWx-3KvklcUdB-_|EbLU&8BVM+;-6%-Xv(Ew`N_B?#Ht zx9`Dm759FykHP1HRhbjweb&?5kPL#!LTW?;O=O5(AX@@8pL~fH{NW1P_`#SsP>K;J z?sT>h@^VNiFOV0fgD`+~L@myIUaO8FcHssZ~n^!8pEH@Zfmdk_= zmZe#m-o7zZR8~%Qefya>%Xh8RG-O(|2bB~~<(eUYR6bLBsY)3Tw7ODTn@UE=2@Ap% z8*;NDucBZXvF(!0%Fev7urR#TSUdTg$T0SmyaGl_S0suiRQ4fu!V54;$lARn_BsZ_ zLFTwv*Y1b!?|w$)efl-z0Wtfz6jy+#^y!nvYqH8UYRx(r7`TH^-XQlR~c7;)G}HM z@o#pJU|tX@?!b2yzNMg$SBf--=jQ6O;1Tnib0Z1+i-|$dq$a8nq<&hzPB`SL_N3N+`>!wW*wFN(4avZ`*Jr7?Ca5g@2ym z83-UCI4ME~=uNUZYT!U zpG>R1&Y(NSFHjt--W+9Xr%FVZNNbO`_1#YPb(+<50UoEj@`gm%YnN!nZLe7W_t!4U zX~o=wfq<+x@flQrIVfXZBJL*lko6+VJm1H?y9x68N_v=3$!7JW<+}BLe0!D@yH?5Y z;}L9K_;CK>UFsuva@vSIl59;bJ{(NSI9Dh6oGHK`jeH~ibyx1_#>@KIo^*}5Slml*oRh@!p$=7%sUxAAn6xkHDL~xfJ#o|dVTS7GZfC};`~1YI zu!?FGnC_U)I>UOkANA(_gXIibN*wZPZCZPwH86s-i0@?WNBo)oTa%{il^DeDqlQG9 zIcgh!I?=8ya}3hM(4#1KMU~^Vm#zI`!RBszMwp(*j+GW`0QH{7p06Tr zp>OhR-RqhOH=!mEL-oXu4b1)M=}`OZ&w~2}`yRbA53wNe>7Tk7`D<*@tSsn!^M9(Y+Ba3?%I$o zSa-r$a6^v|FNoyU**$VXN+EO+TgoKb3g|WBil8<S#yk*f4 zq3u+8@~K4a+g2+?kRabufs`3*IL_zM4%u>B9O;iYy1pZs$=~-aG{d22WfK^)RkeYP zo}bznw?gQY7PZuIiV*K^JVJgI$Uvw6N2%2 zMWdc(+~2rV7NcqvqU3~j%$yNWJB9Y86rJJn#ty3+h6WLpQF5hjAgRh`LJ9%W0BRMH zJNpwUT#t=T5Cs^X`X4rqR@XV_rQ@D0=hMrYj{(KBWapXP4#g(1`1olKraK{L@mvCK z^-mZK9))tK2t1fAI(xrmi2w`-iPk4Ma!I9^nmS@uUE@sYs1*0+P^N0Xd%FDFN^(78 znslmX?+1vllqeiy-GXRIFBs;2a|*1&k$Ak>84y0L8z-5?lyw|OvRbFP7SdVbhHp;W z3$ydKkjtZ~-<5&r9UN`{s(`1b%JXV6o;eJ7T^v;DhY8f2n(cCsV!m3%8`!$-;{~gz z`Y^34tAZm^o}xDcCu&9~UUr{mrA=Z+!85uc{!Z%QD~l+ab?}X%=Q|xD8Nk}$0%(Gd zav(;+bA`BQ`nSjlV}gJXgQQsBkpfeh`i|>N=;2pybU&>!(%?el(|D<83+FH?X035m z&2kn@_J)!!+|<;+-tdWI?MUQ#hre@Y zZ#6qy*16e7t_89%cQ=izeo%0YJWv>uy83Z)27&De%6}1h( z1^l66L%^eu>d;bYWTXY-7K9tK|LLMxpD9)ytt5ae?yPUgtFs?;BJV$^sEDrmf zUfw-!u!vrx+XMaQR97N6TRTvi6u4PB15Q^icXIj#tAEM&Nx=BjlQpnl>Eb%EJ+jR8 zU8do@*vQ|VXWx0}#%*l@qhgXtyNJOsO_3rjId$63Wru+J_v{9$|0AEpfw)&q@&1We zo^SBPEruY(gCZ1Y_o-aCJIzeKv?v3pqh0$;YW6Fo+@4 z7N`axx8~%KNmKkM-@nf~M4r-{DjKjGRBf}Q;}GD#@(D2{K+-f3_%Yz*mUn1-X|;*B zGd;@eocv8Y&U)*cr9cKq8H5XFZr<6eMg!07r*(bS3<^ekzj>At^*$_X39&c;kmMSv z5&VQkxDLMA;VgG0It+*=5`(39Gps?@{*>uWk|>;9Qec<$1zyvA>L~6e!%yH;#7mh} zifvc(5hzV8fYoE*EC>~A>v~+y1NKm?I}X*P;8V^1Tl=TU5D{OiDus1{g83qY(-&@6$wqi~qVx3&$z|r0G(Qsm zEd?7l*t$@PaZ|5JlAe#9JFes*@`=vG_Q@AMBB4p~)3UeRg1rY=y#|W>F4BWzi0^}0 zT~tdj4>f%rA2-JIQMp?l7b}<3F?;gp3)Y?yiCC5gx!k1@Eh&90rpM}Mp8&&>bhRp# zi)0YJc2dafQ{U{X^T*h=$tK^WT+Aw&XBQ zjwzz4tEVifo2xg)2VGBRQ2>eP=`=n8AMbAv+ahzzBFaYV@Th|ExWiSyvY1>t8%z46 zT6OE!=9jDMPO7II^|O2A{usgC4GdK2a609vcc6KqXYEZv3!K^L`zsny_z=xqkHt>0 zmIRL6d0(av12-oDK-ahUS7-CAebq&#WG zzp~w!aOQg^42F-tDS7=ig=D$D;KW4e%K z>*x5{mmr#Hq%SRo8wZR=+5QIGZJ}E^BKr0h=7P=SPzpM{N@&o^u8nve1UZ<-rn=UK zW+N$M_H}6}&RV}pwqx6FNz{`s>g-`>-142#h?BjTG5kV;b*2k+u4(qc^yq~ZEmdIG zJQsL?Dlf0w(LYc5M$joB%s$4&W{I{E%{4p&&CAN#N;v~$L;~vr2@n7=ey+ z^%ZNfuW(l$&pyqhFTFTLbQg4q4Bli}w7KlK%>f6QjCBxB;xW%21a5v z09A7zJ`mg>G{(DIZ^RUk9bzHjPnW19I!a+OmK4@>YZ^x* z5KmmsT^-W{Ou*$YMMmPz^hzXR=VWYAk3LgAM@|BBcRc55XJXFPxJ4-%#ELt0pfY9$ z?l037i?w4!u@<_!@B`KIj;y4}n1W)7VDgbGc37E9q2PH?Giq8B1Zji(JaS@2>^mf^9N(g$F%fGqH3l@l-7ix{H^gW$aW+I;7D|Z6c83@*2Aos=XBt zGeh^LPquIlGsZ>hp?r$(NwyM;+f==59>#vT`QrZIf%EZLdO_9}IiXB>B3QGti05E8 zAbJK8j6i}<*dVffcht!nx(oA8lKCfv1UL;xrTY$Kj}o3M(i#G5^k#!#cU;SDb1T6- zHH%P7B-m1@0Ubxn{1}VmoFM>j4};S2+={avM*aywDPqTE z%*3t-qz{E96QkgqCzcrL2`JEGvNDB|i=*LzDj_T3uPTWC1RHS1CTHFIOc}K{C0y1k zv{Qg_aNl&U!P^ouJ-sUD@B7(Yiob8IqOW|)^6u>9DayZ^vRh8RCNIBmTs*)R=kL-d z4=7&`0+;S;;erLTixgd&oAjo&Y)@G*VfXyP15r!hHJ}? zD~yA4YAlvnGDf#Y6ISrtEc+x!R73lm1XU88~&AfuXEGf7MbME>r5-3 zAt)s!br}7yHy4Dj@#2$%=B9;N$RnF+2710T;e~<@4(_)$r-{d>w&yf{4F-Mix%AHW znt5Y>eT8b~A66Iiy;-)_#N;TR@#tLFDg_^VpvB+zS zrU%2+s87HZL}q>Sr;Fs1`m+p1X8Y7XMo&=SjQ6=jIXI>QD{<*Z6pH}0g-8y*2c!s% z;~ngM6EYz~iv1QbqI+~!(@!HBA;}msN7Af*e65i{74c38RSVfpa8v7r_-Y5SO8(8L z>1P?=y!=@dD97U(e*IMEUzEs>@%_s6;6*1kCK@ywvjCNfR+A-qy!EltTr?7T+U1IkiI;LMcf@up_<%Ky z$GZq{YcqHOk$MUt-%MT3Am15`1$(_<#i^U8`)gfR1W++qNf?GXF0|`OPT1I zRQG3uc*)a$7l&xleaj!8N~Q~)w_!a5m+G@5>2^C=vfaV={x17hK{ii>OCR7mj*L)u z$$R$SiAxBnM+Wy&xR~wY`6=v@eHPQKEpve+uspuIAixb zA1wamYIw4Vgc~=nWgU@viGz7?wu_rM@m(4}Q6ES4oxBj)AODY69|ZcX|JW!mucYMB z+W{EfeiXc3(AbkhVsaboJRQUo4gDoJ`sthJ#Y$D0Pl^&a% zN*hHT#7&en#4K58`z??gVHS*vmpA~071bgPEmUlW0IWz%GVGum`U410hkeI)J@rxQ zZd$=`bM z1txwkTYpUApn{u@YIvwDemr_!3D zcxpQ^uxONGTX+6^{R=z(V&i~_m--EI@Iw~2h}S6nuQ&NOBx*e55eG}lK6B)@b5Qu= zFpFZl@Hqc#|5Q0=d<$bEDvcc2gu$U-t6F_1p;XGs}80$#w^WyRO!l)ww3FQ`y> zS1Bnk;XhxYYmDn)?xx*QjQkl+tB4bpcL zwJA@fYg%_)E?6u3CH(3k;Z`4NUhbh9_`MoZ%D|h^d z!lH*gV^#~b!Qi@_r9ZzX!6?$#b$mHg$55ibMTkcUBYHHjx5W!)iy|CcywGa7wZ$%n zmSP~OM2W|7Q^$`XJ=H3y_`BL+=C>_T0z!IOwmq>hnN7fww6RT(me6YX9D3b9e4pX* zX?cTjOE#eWqZ{?@;Z3Zdb5&5w@$2ItV?*#ceqT^A!80=4b^Zz+bpb*b6HB#Ggd%<6 zjsSzlMV=A+>G?yw63p>hZ04O9f|aKF*(e;W=JW1%400m7hd+lzJKbrNnI6c{SWMr} zBq{`pi#E_Lq-H9uVbRsrvG^R;yX<9jtbjK2(0eZFY|_~;u>JTrfq26rLTRuES0rU!&fa3U4$4R28*K^-?zH_|#Jb?w+u2%K=DAX3 zGad(kpXxi{TUp~Q!5TG{%D!$o;t1@Q)wL`prU&j=Xp&DllIR|4>!H*Zif?Ahp7@#!U!g0grNEFunOhgi=;w3tbi6moumRzH~}kI=l|O!Rr8+# zRVZp<1*7o7IvByg|Bh)P_zhs@tN-)(KLd|%M3g%J&+B`HVSMJadej@7#*6o^yGW3v z&Q=6uGU63FF&VKsHlJbzePh+(F$+Mi(C0RNWNopOczT~NQWYW=c@+HMSHRl}_L`S3 z?j90gY5_4Pm@s%2M)v@J`5N*vyeDy>#RqiZTL$u0k*A>lci-yiHK&~x-@AMx7+ntt5Hj}GGJnA*48#2#_^W(GS3i+e@lcp<!5oW zG?1+7yG>@2g$@lLxyP}YYk1THb|>0#U_yz)@@5NmS1lW%8T1#A9z6#SBFB*ks@rlb znj$h3Qa^vC-bl&P{QZS_Si9O((p^N1Y;gGZI!i=f)zQsGPxArF51G$v{N?Yje@R>X z#gG1sQ2qXnw#|EF5Rd%6iI%n^^UK_{YgL23_35k(jjHpxFOOWS=iBLdV8xPS;SkYX z`=@GwlzGQ49@`IwQpZ`l8V;;p;X81elM$KQldTeo$0Bu;~yijX|KcOYTL)vkw9hpb((+ZsabH@MZ4OX4>_wNE3VKo-8 z*UU{2Rx#SagH$kiITT(GO%Q4<50&{8de@RRQy)EXAv6R>J(BFYo#kELlkGEyN|DgU zeZI*vt!+c^q3_Q;Q8?BJn&4m|YkFyRXH(mp{af$-~OyEpdkT2@dpYf($z4TC? zBNa`0OC)79SlQJ-;iwbM^eW|Ps%`CJLh1W<^*i_e1uCN(U5sV_jKuOFMW=L0=}7G2 zj3(DTrbWwJ4>iw}TGyK>`9*>wWMa6YRcNX&<2-`SS~q9E@u^ikV_e0g_7;+@&9IfX zEBNbH`*u_U;}KO{Y_tw)n-$N@)m$w9C*t^@sLk|WUz_rcsfP2)zt*|<&*;xTdH-o8 zh7+`hbtQ)5qVX^UEij(`({j>&epEiMoxG}Ku0J$wO!`0Sh*ej^>NGGg!`mbn3tvRu zHsC_!oQW~I&@pO$zX9sVV@6@4s$LNH&6q6JyVBb|v=1-CIw9*01QzM|heeFM3C~li zs{j7pkcVzJnX5emIfz0xP2%xT2+I3j5)D^3hnh+2o-_4kQgv+JYH+s*f@%=+r^d)^ z!A&PnEmeQoy3;s&3MHTvQcY(_B^9?&eWxOz$`+(|KUS?O6BD?KLEkTZ)MnKM;T^$f za%wTduyq11;*#Ud8f6Uz+3C48zpB_w5ehn0ZHvnUxtdCQa(5ydBWaMLYL7<-zq zu4xP%Ah#M+{|V#~?RWPaF}|pL;e``)!4DecGkW27?ybH%F1+&8z(^w9fBs1vOtS1x zbTR(B!vL?R$qc>A`kLO1heAw^>Kw6mOEtt|n1<>x>5*Og9IK;Wpnq%oQFJRqpY^B4 z3F2ouyiEU3yx>u8T_C=8WxV+&qD0_p1TNiNJa4ON)YN2t^{!%UVj<>!) z>W?B2^~8MM@)Li`MrIPclosn|G!k$A`zP`XW8>HR{!EL8;IQY;4g-|PgbESL=P@qj z0e5iXsGX1r2Qf2VqTdQ$;!m8vRGwnyBysEB5S9K?JzoWf`wugknpd^Zn-WOdo^^m% zz|&pziV48fXY2DT+9@X*2KodBdP$s1>(dmHJ#c@*e)XMTqyObij0;7B`^b;*nrH0K zwcAqGt9D=2YS~$x``*Ws@%+>fQ_8lcfD~>{yoC9_cY9`Iro0NO82KL`WA|XlVsi>p z0X*!`_m@^4JhGw6acaU00i_$ezO9o`mjo}g9Vp__kKe`NQI1*_HSbqO>sD(``n6m?@}ZtPoab20 ztK@^aJzjxdO_j=Ui8P)R~z@i+HR!`i5C=U2f#(SOTTE$UOVkO?~}Rs#@f$%Qre^Tp{P@2sAwqcj zuJ?>6s_oD-FRnmBB0|zGf~))1dHe7|!;!$~)-p9c$+n@->(kSISF&ezgCnE`;D7ic!17=BTwmz_Kag>kGm-7Qxy1U1vV(NV_xpOv#pNd{}|_8>qj<*5X>u!n%FR#4z4 z#f{Z3^|zL$I}<0gVYl@)l7nF!Z%g?T;|qYiz6RT8iKkcAy{P3(%z>_+f-d>~MSR~b z>KPDb;%`0Yg0Uqa&gAU91$%=x{yRK{aP0H>9cEu=y;_qjWP8q7URj5|WQLg!o|H3f zd+|)nKFA1`!_Az5m$93O2c6=qiebi_Gjla=@j5Mx^a52}$EHfEQ@bd#aosOmgcq2g z#LZjyhG<-JtT(=2oPj00JB6WM8dlWTj7J`T&mOJ5qK4hBudQN4u8V7DGvf0QcW85` zyHd!Q!j<{2M4+K+8CIhBKa3Gu=f4_NH)OYxy*w$>Pyr~*cL1iw-{IL;)UfFP;>XK;=?w1J~@wQ z!O3hb6Bg0K$ZE9p*F?E-mHf6T_vyk=%$66b%4FemU+yvw zrk9S`$!l>S4@28oE4}w#$}Sw$NECaC0R-A^Q>2ZFc-ddQBG`Cq=l}qJ0OCxFbl!?j zLC+Nvq)xwG;46|k!m1pHRWjbF0*)9lR0p!o%d(WkK&&Go0!9ae}Cj6g=MI1%#?FIB) z>RZA@TKezm1hVq~7$fF?F-ErR& zRuFJ22!*cSlSk}wV16MWkS~)I61ABSabt4RT4kkOVW7aK^=6Q5ToU`ige(I|Z*JYU ze>seQj8T;-zx97J#$W%<82?hk)SfAU6n}SPcNnd`Xq>}~w9#Bf94}Q+H<*$d5}#Ej z6Gq*C%7UQyMIy}p4>I!n{~@Dxk}c=|0~rD4|DlX8MT8pv8#1~c|2Jgp=;8h^$k_T1 zGJ^a!Wc*FH5=GUbAiF34NAIgpVD&$c(c^z0 zknmjkS~VGei3vb>t@u~ryF+jvT!My$y9IZ53+@`+J-9=#kNbZ2qwlw?cJ29d^_n?n^~hRP-A7-2HkSKn z3jOb_Z%V~27P#VxnkBU}L)Mr<7+}dVizRy;Vz43vrNj5IFtCVm9+ogd{0&}%4ZI9C z7mu4-Tp}@@5M+m252vAXqfPC&6*TUCn<)$WZmI~dbi1;vYO5th#Oj*KJAb=%#xRi^ z!OTp&S&m?0O}g^A|AdSxI!nLo7Z3taOj2ttdQ~OToB=X)6Vkm!dMyQ7HJzH@Nl1*l zGb0gk*jP4m^G>g{>T4oQ1AzvOi7(GvBKR$kBxH-|If7#qE8QIcysVBCyOh;W}DAusr)+ILwpKyOxfH4fsmG8I417 zU7bZpA3;2%ZEQ&oGGZiuqK1YbsdD1ZKMAcb@$&I)P~$A(D(Y^+1LB?TpH|TVR-wjd zA}So^cW{g0j8#U-<1{12Ly>AZTtBh}h{6z=fC&~X{UTtLu&GZQIa;Y=VN*hq2m7G% zIi^imBn)zUV0YwJfUThu4E!g|5SOe7jr_?F)L^_(yb2{6CCkC5$f$Co!{rZ#$dL8j z!*JmweNn+$tngwps{j$$KQJS7Bh<6xuesYCFN>lTz}IK>_-@e;3InlSPKtcN&B!sI zuV#p{KXUKT60Dlo=%68oERP*wl8(>R0}^|SQ!1x6h?Zg+@=UPaV>eV;e(~ZWYb-S< z?~|LG*Z#_Sded!|=ggZO2{Hm%7ODU*Vn=0wA+`u9K$^Q3djyW$Pb-cT>k>rU4E3Br zZQRklYjVGwk>-~vkHUMcH}H&;8l40T0fFhIAEqjI()S|0T~&H`rynd>4=GG)ZOX4V zO>%)hSEIjZ86^dINYndKqexpX$IDM4CxVgnjrVn&;i4(gj-dcLjOU{#*wAL~WLw4J z7c*R4gaXJfxgLlQ?${`~ZGDb8G??SdXAA^IvJs9Hvpahl=iwy~^wai5ddx>7Fr!d2kcb7S%841xlNs(kGHeW82nGl z2>c5({u^aHYquqx^s;h6r#fq6U}(NI)*q*C-Ytc#z6WXQ35fq#J0PQLe5Ml;?@uyd z^bId*IFd<}ph-$1=i06Vf~UHPK$DiOI<>94m#QcrWz zZY)>bc9_H}1q(z(PI4pVjg;G(lyKJJL-~^ir432ioi=C(C#QY&{;O?E<{}p+!C zPxb?y;+M{dN5PMTD;)%9jT5aIedRb9=4&Sph1|*#?q%M}GB3zZ7~=Nb_tiTe(@2ni zzi!I)RvPN*+W&z8Yg07b)7G74yPuGKpk+3!==5(WD+az;#J)ED?(0r=PwEs>RY-4| zqtq$trkRD>$QgE_^$jX)T-JSt9>>6a`=}35K(O2``2`4sYi0IOJx~rdR@`S?jk>J z#4_vDG7h`VjM^iK!Be8}GOMuvRHn&#brO#3Ci+~*5;4iKILGO4A`I8-;Z(>t^kAX! z^y7NlyBqUx`MGQC(EH9&upBLb-8bVq402TM%yu$e~-tp z<#6jzdopwiTWFF|V{*Ap#<7sf>aMZot+7aR!p}vrupbT@_jr@Y%TnF+0s{ao5p{dQ z*G=#5$q@1W1Y_Qwv^5>^DJnoVgK>O7Ty#BjJe1LbdV?%Bfg%o<|2T}g!@1JPQe`Ks zR7tYXYB;t0F^|IRx;>{fc1dhYptc3Rcu>z5x#Hkpp)WM${Ph#(MwkQlhDe`WG_drA z6#_#PacQJTbm0mRL4;KV7JWdz;7bpA78q8zo*vNIR|kG4%w*g}5Vnh7#9lEQUBrU~ zhg&p^I2I2kMep@x=-__Q0M&r z?Og2nRNzh$4Y~d^dNSuLA+%|!tJlws)~?q(X9thzr)NdYUo7c}by0v&hzlZpsfGTX zD{k7=IuEG_ClrTrcNZIc)Q~z4#%_>lXt&6c zBAmR#iZn7Xo$JR@^$alOX|;=L8ZMc~NC|yfXauI!*mSm%?idQOsJzP%0goKmg*l*k z$;yM2-`z7oru)kq`O`_##x0e=ru(GJ6CZ~Tdp*;zh&Erk876q}n~+#*DA z8HE{B*2$yHMlQhQFOrXkQ{^}$Ae0zVZVor0Y7VDlQTGA#8P!%uuKL&luGsXqs<2#h zPVAia!wagHGTX38tddS>k*=Vgj&V5(ls9TlvtAh)>Li``c>`wOz&Z`IlYhF zE6Qx4D=vDZva{>$%t;XXzq9Z}WzwCo#SY_xCTeaoLK$3Ts7S+3Jt1$#yhKYx^}c><(Nk82Vj^mn@=)R*e2I~(BP&=s&-4?$GEqU+UimD< z6Eav8W)=GCE#6!902!TDY_#lT4Qfg@%wU0aeTGMy)yGK2|3|c??(Rarn6s z8{vMXs{ZTBVtJV2k@phe-&CH;QyE$QACUjccO+h`4X}%#tcx)_tug&oonr`Br=}xpEx8s<0ch}!#bJpAI+ZH zyv@V9)@hxuU$mIphPaJ4IL1-d_&xo>t|zP}u@;w?UB)>7%$N#0uXyT+Q*PzRlUX7%~YhgYPR%UL1VY#{WB=T2LtkOGTxFGA%@_=AZ&krnnU z%p1-T@OpWW_G|KT?f!l=Ansxgra&0|(+>fuxT|6$={aZ$Ysh#KFUWY#qUV!yL_)>kPtkQSDBrORI7$u z45=MQTiyFM4$LC@? zwhfQKarH?uOpZ-)V5jzbhpspU#Vn>bIC61_C6R+@d~Fh0CJv(Sp8}iAk(#{QOP-7b zA=52e=}#vdxyn~m?bm_gxCI)k-4#>BgTP$N=9aWHFucuTXYlI^xhS8a%qO-v8SdoL zUn7Og9XEfM_zO2?W}a(pm~G(B0-=et@?TURDu2HE1Uhd}`x`&kYBz`L%|fT)YKE~U z7r%R_VYxVcft6DGVbHT(>gYy>)-w|M2-y@?)x_rSwe0?l!OM8Acc}mV*G?k^;PV25 zHkt8;@VS_s9?N*RizsBlmmc35?A97NaucJ7$4W-f&*F4$Vh_u-iAaHYI$6r~XG^bQ7n?p=w<+o$xE_es~Xz!WBm|$RF@9iNlGO)u= zQDM-ZN(z9Dll!k$(T^_%HY+TszwTLmby}jgmitaP0i8xKlhMRlltc4m)KB5DdLt$rk_9ZSjDnb2lsBbm><+&^bLRY zPzA2&=Hb!lvLb3BCL<4qBI$2I?thkl0t!N&(NwJz6;xq@QlKsYWF0;O31k%1l2bQ| zEy>f-KoayCkkzze#$4t_pv6GdU1^bXSyrcH$Fb%uX4(`tKQm9R5D)TCFpg#aCS;yZ zw7kN$vXI(4Ls^F6(TF!(I99oC=g^Vj0{~ezvWs#)I0qW=bSXokAmQ+N>w%}ZlbyAA zj8)G_YW{9;*vJ)naTRWOP&URvt`t%C<_K~9+=g^7%tgtyyxkPBUH%0&C2Wdr5r} zBq74C^_|Pg(mc@u!WnOKT19nPvyThwbtHoZpah2dEZUJ+oRQQv3SrmJ`9Mj!SlPt7 zMMGIieq~;?%R|9Y>7Tv9o)EBSIZVdbRV)1dOu=!Ek@;j(tbSU*vlGf!C!&Wfg-LRD zccOw9kHn;{LF%x6UEn0G%YiYI|P z*f`t6);+Z{#ol>71wQYNw?~Uy^thJre5?r7Y>M(Y9Qr6?k;?pxVB!`jLiTX6t}y%G zS(4Yh@*lC=qXjmPd-!DX&4fOy22Bu0?AT1k4s$Sa_{aKxkaAY)zXk@u&02lX^{Xt{ z4WUTld{^ZAt5qkhAeZN?Br~W>eVZRj!&WoljpClUE$dsF@NHugj#ZqnifaI z2hqr@aLco6*PeTQj$RW-V)(ues~`GcRLq6Jo*+H$&8-RgD9UeSv%kn^x0n~FYI}=~ z*EFwfTXn}g5G%ScG7S)M=0;jtKNyonau$VjBz@SbY14(;9T_y6nr-ayY|mnONg?xn zIQy1gR;C>pKb@X1HYG-*0yuVE?1yPCsB*qEebb zz`N(V-HEl=>?j5OETy$@iak$5b{r6V{F`ex&@v7;>SH|UgnBlmK>TrwDZb5faW zTwDfZYcS+#!96hLGQ;_Ra{jB>Y~t4XRv8oIiTKkKM%mw7UA~=euIBvv3+E!ZVXMND zde_qJw}DLIh_#1fZ*$zhapS4S+uoV(88s@HTB9_OAZBOLH%=Q{oV5@pw;n4hEihrrk%dmMkgCAtWYUe_Jrbz{4{_ z#1~u&(h?I8Oq6-uwuH@8A{(wS-qUq;fh5AMyYfj71Y~Jw?e7Nn6qNX}=cj|^ix5P6 z?6%njzchel=ay4O#SH4MIQEJr2xVcEeEmacqcu-jwBY9*DtyH?3cG;UuS!W1=9$Ak zo`+)Tt#=Q1Rd}z0Fvm?Q#iOK3lRn_i5pKyKAE^PPFLEeq8^ZbcZsE{OBKE~ z$_`EC=i>pKUDUYM2o+@F{gWZ&c;J7HvM8^Lr!oPnEEJ-70@+*E%2f7Z?KmsNZYhCZ zzA~E_us4Y}g*MDib^C=aXLJ1tKKz(w9XWp@ZTtKw?uOF6s;O3VFJV`*)9y?xA|kLL zpVxS+(X`lZ{o7-aa{S7B%GAQT5Oo@8JfgB;Y}oOkNSSSnc1fm{14)pTLaeR?W=V3m zSX&RM!Ad$KOv-*LnzlXQSZMj6GbQg!CR;cCF|2VHc2lvS#h8?s=*&PuIS%7gEy7-H z1DhBvXJ;oWZrNxQQLem4?^K|T*=VgTxUYFwk5nxXIq^^|af@#(J=>u0;Jl>#^(jJyngC~|xpXnT!dO_|ViIr!Khij97+pu6*y!|icDq$cjcXyH3lC+BU7PRC zrb68AFSDTM&Sc60)UihU0J`Upp38CkZQ(y(R4>kPKA_~)<9W?eKL{4u_xMf2D6REq z{Or|G-AJ%RhT5*4!t-Bj?9~UazG(p-Mn=9qcbY_DdNhFlcpa*SVps&T9rZ6Q#5v zi>4Z8S;fQstaUKCW<^nY$=&m%ypE%etc6Ux%CbLRCcn+$@jq9Rt+Ay$k@%W&RLfW( z^OTB>P}D`splh`E7MMpjK;-S*ItjZ3RdqQ8PTk1UqRho$#um{LCE6fnn3z&TSs5OTT{2jEG{Q7WI@rAMS3Uy(H z71}ZR1a9u5waj|IhF=9``h=!;C#_SjRq&k;5k>nLU3ZHIq!$=YfU??h4W+?NzIF6v z2g&C#B=lbJ^`{8oVNWo?Ipa&lA2Qn719tE8nkHtbVwBEgCZ2>}C=6e~DB3&KYTk6j$2sYw03#g*RKBBvPSXo?r6U@h# zKXGW^HzcAaAa=6adddi{A*nmbvK8+*HVyKzE+z;&`%NeI>B|f)P~V1EwMzRwYXkdb zlb$1d?~6l3dbvq$uwEQP`MmQI;*WL9bjU3y_~-<)wFP-BdY2?e*H zgoMIj-sC7a$X=`#a*r|&8$XG$PtD+6!qg9cU;Jn>&f~gMue&tMH9lxnPq%1>K$*`{%7fjJ3Tt(s70}%n~Aq-$ML(-K&<+lDo zk#b)TCleTGf2z)g$dD2eFF$STd7Vl1= z9oBXwOS7v#TA44lVc{}{ATR28Mr2C5qZg0Jj!il%4%;z3pV-NQ4nJ5XX;9mN5D4J> z#kV6yt@4*aK)NpG(pb_mH%nCxcK`ak!$xW00F3a>Mg3O{9K0jn#Mh(W>aWwvnJ477 z21`;AX6#vkHPWBv(ru^s`9e)?x$%O~@9sb-reXvmir=-Ao@W$t^^F;GiP)fB6@vU7 z)*MeqK8K5%x!h5FqpVKWuV z{3C~-IN&Tg=;YE5p5N1G`pD>mJgGUAeSYl|o4gqy`jVedpET(t8@~&`%nnVJ)4N_F zFd|8t{uSEs=#f2JVT~u6Ruwc)(KAwDz?D&=;LDPJJ_)#<{GVWzY(`goZLO-QE+e4K;MNx z5}F;oj|L5T(y|KKcdsZQy!c`d<4f@EZS`cnIINlAxRM0vyE$<|1Zk1!XR%nEuV3W4 zHsO~%z7mpxLln{$-S14+WH&qqbsVr$`@JNg-2$7~T>{M#U)kPrV6NzdQ#86vSxDqW zC^x`k{dMFHzh5$)I+;K7lU|N?L86l=V_z7A3X*AN zaGj-(?g&cn=zUPJ#=dg%h&Mp~#ZXvT>|>Hahq75Ep{!u;sX<$G z#)e(PAsQ^|!dAwmrCuN<%V zzygUap`+{8!cN$t52?F!Y!^pWs+R}wHm9Yg>ufMupF|_CgwoW6EOH*MW9#2rRmenXLA=EW_{V#L{@@a3pGzZHy9Vus6F zQtK!#c;5Qa%|MW1>(pS^rC*M_`P-V0I(#}RkJ_N}CYDX45JuKCms-A@>u*0G`d41m zzSLlU@29)EFFl6F4p?=;R0H4fZ0+@@FArD(Yg%f4p1n|}d=6KRKH+R_efL=9>O<1t zb#{31R0hY^bVtT$%+8BR`U)MYphRSt)k*W~#f)7Z>*;JRZR-q{V3AX@2qI3VADrp zH^y^jweTp`{?=my{Gmh5#DlfFjVAbMM#tD9+QzBi5)(=fCV&;Z5IK1NA1AO@%?-lfvm}J9 zyctF1qoU#)Rkc5~bd3IjfW(iLyqUDzJ!PwvCGj7(3ToQGH(8*n*hO)+qO&wMqtfWU zCn4^~)VBHnM9h2lroRFKdG)QRnG+{7{=fi9-+3B+B9YUc|M$-K&o7ugG4INo)Au4E6ey^M^@$x5kebJuoq2mjI~m!NPiC?$lk?I5 zSM~QK)N~_RNaA*nVL_C4V6_U}d)I|wk^U&WTE zWqLDPv^(>41_wqeo6Cc&TgkAFkI4Lxh|_JvQEbjH1q^=jNs?R>e~4|KS*iGauH}0; z&d=ecBv80cF(_^CzrxjDP!zrR39I$nTD*}lFkC6S$O-HwjOkr8^|cziw51uSga=|W z@S{;&9Bd7~cpD&QvR2858!8Ve>WKE17D5Z2CiioeK48aT@a?v>Pi;Zp*mmrC`w{bu z9}c3GXi32A-bt8ge#00+q3QG_{xlg>m2Em7^QR(pxSs<3Za^`$AJ=gDN3D2*)rOqc)IA5d{f@}MSg0T zH3+WJ_IDj&btH~Nw0LHOlMuwmc;;3yx>X4u0bUSh0@$kC>sRj}2cS zNPlO+Z|W?dOz)*Me`ROkW|BBjTXT{qP8#FGwgsWwoUSDCg2j}kREI0r6yP?V0LXK8 zCihaJyS3%YC0YvO;?-ym({BO%dLmNUZ$lKJ(CiznOO?5|3eJZvA=>qfT=Qw>_Pdg{ z<=?PE+yrwCFausbEQk2D-VOElj*FMa2dW#o(%wf6YLty@iWKt*zCC^dvorkZ3R%du z|KrDFNwLhgvRj>|80F6!N=W%h%D|02xWYz&YWa`Ldy_=*&=m~-rIK+n%@MN7F$y{N zhjRMb(Zai;5+Hr}in_GuWU^fV}Y2 zcJFzlTlq!RB+bsurAv#iQI>hnnmx%Zxk?ak6l*saIXlX%hslF2DLZP98Zdbr)?_li zPsSZhGos_uH$dj9V`@{nuBu5?4#FiMP&9^IPO~~UW{ebki?;378#k+{I{NiFYPtT2 zpysHGBeBKS&W_%hcD-M7{rBU?^WKPyi@6hTzwh<0#YJb)heWd;odS9Hb~<(_;~d06 zH~W`y`}s_&MVbU&p$$e&Yd}oLO1|#;Pmc(({4DrT^t|A{kxQ@my3VWJWqKS6RjvZ3T_ohw6Cwe5if#$s~R+QeTEdZuMP0T>UxRbpn(iqsy-#`IvTw zF1M_5%h96Sd+;`ygZc`pQt-9UZztA=L!7{Lk@8yVHKP919n{VDorxqWO8W@ypnNS0 zXmw)Ejat(p?l<7~ei48@JX;E8k|P}o*abNwOfY!WAf5;abe2J_ zRsX1K0`l774lGAxe*%SN_tkdWkg#V*X8cVvNnGMg$l!X8x^PxD+U_piEa+={swgG+}cn?1k9@Df)c9k zmItkCbFYb6JHE(LcYpCpuz=gW(e0ZaL!pCiGsLV27*s3TzbBpR$qN`_ma^R3m9kju zlTpu9rO#HG`abAREk~Eb`2q&Z0JV_r8}%Dk&f9Y`iN5;SpNeR1X1_3Hr3ahdT=c@= zJ60Bq%Bsxy02DC(u-v~|rj{kDBpz_YpxNfGLb!dn@X6^o$hXE_xFge={LA?oRa0eU z^huVR*ED&@SLdGyQxzz-?Z6e)tdhfTHbw}D^!C^mMyCM&?uz1zr%!rJJ#*Ur z5TCK^TZ1UFM$!r@N+(c?E;-N3v1uOh3lSEb;%$6T2@dVve%%&G4kQRQog%CC!{e}L z5`>tI%DN*upzBICu~u6E@Pv0FdNfvjC;B0U3$i*2$qPb!x(l}LSU9MUfzbTM`1KIE zUbjCXQq+K^UT7brW3~%x^vusppL?}#Hiq|`vR6w&WzZSud+LH^dmca7P{Zu|FU`~H z+<$da1{bBb+aIK4=`2BrGptFB9?Kp~Ok}#*~+LCA>5&Rq{r!5yj|u4EhAfHPu@B?OF)k7((%Vb?mypCSH83 zOXZXnV1uD#*d)4%n}j#r3Gc= zHSJ{zmclk}X&nzCss1*h>1<(9!$M=uLi$_R0`_hS(PwgH5v5jLq;9mpru8A>7~2(= z`mHITQQ>Dzs9R`nLs#02`ilW5kNsClc_?+cYu2u`)7lJA)^^=^1JI5As-gm*J(9J} ztRB++rVkN%lH9H&&g-0&+!ubn*c$+!thSPriyxDG?*q8iGayaTZC>+1PcYD7RO8A2 z>Aq;^7cir7(V$dfMwiwyz^(RmDRJ4&M^OL*Qe?y8nH1U{bpOD2enPm!x|a(<+@?x>6qa3yY_wY(w`!)$c%Tv)lPwFlX|KW~^} zrQWvMEb_Ugv3o7fS*Z|2%4OXZTe0dyOX)ep!Rs}V2)deAKoG_(dp?TH4zVt4mYk2t z9;J?b(xN5tTlu2Yl{{A)Pk&FeN~oF?I%HAl#=JzsVp8{GWIJ1;;<}shOL8A10A)t1 z+)i+B^B@utPeO%F7?DXSOVA*rmOtP|T%|s~Of+r3j`kJ7yIJI@fq#3-3U6ZFtl6um zTs`u7%Wav%bm5>zHNZSbgWElKqSS=SZGk7FA(G9}I&5c7=J%r`N=^)3(tMG-+-I~j zTe*&&M)9kagaw)fy|m>`lqfePKtIM*H%4Qne!fNG$q4rcM<2+{Pb~{-;^7aiHoYph z8hSk4&gGBo&@870fK~lj$#WnczgFO@n?Q-}OcxA{J*xcbkpdeJ+{=w6J{=ph{nabs zBA8dq+7|{4;nddPSn3o=;_VQE%T<(?nVmO^O{rJG%fNk89L}^*(Y_IyZN5YalEoUkw^}`4noAU zv$H?$lEU8(g33mF_R@pafscC7g?!R8i`j*~%zM0UDIE8RFaus`qG8z)$7b2AOeMkL zlr|Rx^#%oxne!tFdmUHW(aFfQ`*7w+^t6S-mnW*0d?{2iMh{;!;C%K__UyNc3X;oL zX+2BIjc0!1&e87?^gD=nkF*kDDrbnVYxMVT&|I)Wu#HaTS9sL00g$@h3^Wh%YXr)z z#xX$@EcwiwuC9|^8_J%(R;AX^{vDl&MpXi)jR1e+T zp|SF-rKG z>lyjf+Q(7XS&L_~U|ChzOAv4GDu08+lyI#=iG+=Ept{EaxJwK|jcARQ&M|qJd6iMv zCwTqh&qY_fv1l@9TC`*1N|4rH&24|4(2*}WTaxfFV>LqaXiHQDxdwfmu4|(1k|a8y zk`I8?NPe=|iM+l{Kd$gFLhAW4EoB(F*a+F_PbJst!@#}I`fgX3LB7`)3z-y9dw=rZ z4yD!9(mLqxX#mb3@;x$OO(S3WefDkFM{1NO7Q5GG5g!I;%Pkvp=$AA>)-nbjbb%ZK;yqitAC!}pQ1G{^+T290$FH@<3 ztgkM!g!;A<*rOoeCL^m!6g@|uSvxV`VQ_uTEaQVsqo=`|)%D>R$&Y^d>_DSGx2b&L zDidi^RJ2q=w?UT+E*iflcr--e2? zEa)^>j&gjUEYHWcxv~a`*m=TOfHZKB$qC&|kSl@x!et_#Y9_`cnct^~pk`Ru6HF-& zADCh_(jf^%!kbH*e;uI+fF5P~a=Ls?{szB;pKD_CEiAa7!6>CK??X8&R?~z2&+SGs zDDtsT?@{A#Rb@31YaffXzT~Ro{}hI@UZ@kjN>PKxCwD_CmPrzgo)5-n$1Ou-I+PQe zN+yvre86Hae>Uob)^BsIUWn`EvNaM0P+bDkLXj$fNfK=$!#e=X@CO6%v0GO31)>|f zLCVfwISB1z_~Ua4ViR_95?OIQ9;V1xBWWTSAx|CBNQj-v%Dy;_-2C85rJ#spP@lPy zDlF)$w0{yD-gsj{Zuk$_?@`OLDYbl?yXhYYIgd>_YQP9BZovkTpjn4rB1-)+;zZ<) z)4*VXl!^pOtj`Wnc&Kg?jItpWu-;JXZYPFS;7gOJ@bKV~aOrTyH674FQOsD00`!O! ztY2K4OSs{X!u4g(I?ST8lDgseRD4W>BV@`lT-2O2)aU|G< zG9mzXM_vrCX#!&sF}uI9wv08hc=BBiuFO9Pba1tJUv3s$FzZ zAOTgSS4DgY^$#|vkWBx3+enCcRX2ks0V*7g3Y9+`cESh4FOV`P3Lj;z@I|)eNay9X z`l^dZNNSxXtVI(|PTCvD zaBfnrQ?!?MRmU}oJEqoBHTzdc_Jo9RxjmP*{+5BoRQn-$5*#v8wf!bst>o)@zX1-} z5Tc^go>C2s(fEw^zP`K`6b;PN5|z?X66)C^(cnFZM@$3z46))nrY&j>&V88WFrf1U zk>fIH&vyd(dtY&OP(MN52T_q$n)~}z-_paUUqttu&V+-i8wxKb+=wuh?oI2Leq@6R z+lnjpzt63oKA@O{@pn!duDX$C3#R3d=BnDJIB>vfxB0D_H1|EH}ivS`s@0A6E9p1wX zyM5}&P?X3j7rtv84R0vKlqh$~uJGPLH!w*0>mmGwAtVsxO4oX#)~m^M$L*)UHz>yq zaTaKS$fliVf;YVP}g8qYHh-4yTZKiya<0!N>^a@G!bM<|y^cM*JqKKV}U-#*mt zpmTmN_NZ=_e9Ej50)Kh>TnZ>U+=%4AK%7h`ovr2wV(h}a3H)}8@(OEx!rK$d%M4=u z!i@MMLaK zY*bz*N|5J}w{r3!&@FST-?Qs&_qcrnV6C&saqrCU9*ry)L{K~*)~_I83&>2IJBiPI z&2b3yds>Bg`CQiwB`196+7xsNd-=*0+12MkxZ_-X?t_O?JLQg%>@_d^dzP5FhC>R^ z;I>3ETV%{D5;xm&&Im{{65;38GAPz53Y#Rkl|gY0s$qf7&aQf50-`h^P3GO7TRZu+ zbcfNKtS))x!X6F4?2_D*A7KbUv}NJT`ujwp1!x&pbUI?RCxa$?Gu;9VSFTfJ!inec|IFCHnZ;^DuIw`Q zrN-OuoV|2iY<*8JBz@P?y~lrSr{Fj+{}4mIy9j_#&hZHQw_N1b-W3$@R_XNr zP`<}ga6H(*#jj^{gb~3tYl~+M>h% zcfA+Z?;;}5?G-9$_W~b+$Ugq^6U2-INc4&bBy55Jvb&@M#{!955rY~pIl=4SOC%tK zD-MYJ@OKH%yV*HDL|*)Rkr;xV1!Q!EOZYFh^LM-W|G1vLEKuT=1cY)vi0m2@baBND z0rvB~$Uyj?e#ZYg=M=o==exVHJVf3AsOef7;^*M|gOr2V9exi4Ad)I*ki!is;lE5{ z!N5rVb@KZIz!-ZM;=lXI!hqV}h5s_?`ETLG^4~&;TO7iFSw#G|=wRnB(cka;@(S~P zcH=)Ll>9BBMV2~8=m4f{r{Iaz6 delta 38070 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 of SFIXED(I'range(2)); - type SFIXED_MATRIX is array(INTEGER range <>,INTEGER range <>) of SFIXED(I'range(2)); type AC_VECTOR is array(INTEGER range <>) of STD_LOGIC_VECTOR(FAMILY/3*4+29 downto 0); type PC_VECTOR is array(INTEGER range <>) of STD_LOGIC_VECTOR(FAMILY/3*10+47 downto 0); - signal SW,SE:SFIXED_MATRIX(0 to TAPS-1,0 to SSR-1); + signal SW,SE:SFIXED_MATRIX(0 to TAPS-1)(0 to SSR-1)(I(I'low)'range); function LATENCY(SSR:INTEGER;SYMMETRY:STRING;TAPS:INTEGER) return INTEGER is begin if SSR=1 then if SYMMETRY="ES" then return TAPS+4; elsif SYMMETRY="OS" then - return TAPS+4; + return TAPS+4-BOOLEAN'pos(ANTI); elsif SYMMETRY="NS" then return TAPS+3; else @@ -63,7 +120,7 @@ architecture TEST of SSR_FIR is if SYMMETRY="ES" then return TAPS+3; elsif SYMMETRY="OS" then - return TAPS+3; + return TAPS+3-BOOLEAN'pos(ANTI); elsif SYMMETRY="NS" then return TAPS+2; else @@ -93,22 +150,39 @@ architecture TEST of SSR_FIR is return "A"; end if; end; - signal II:SFIXED_VECTOR(I'range(1)); begin assert I'length=O'length report "Ports I and O must have the same length!" severity warning; - li:for L in I'range(1) generate - II(L)<=GET(I,L); - end generate; + assert CSA'length=MAX(LOG2(COEFFICIENT'length(1)),1) report "Inconsistent CSA length!" severity warning; + assert not (ANTI and SYMMETRY="NS") report "ANTI=TRUE has no effect for SYMMETRY=""NS"" - anti-symmetric pairs require ES or OS symmetry" severity warning; + assert SSR=1 or 2**LOG2(SSR)=SSR report "SSR must be 1 or a power of 2 - non-power-of-2 SSR causes diagonal register misalignment in the SSR>1 accumulation chain" severity failure; + -- For ES/OS: the SE reverse-delay index DI(-LDI-1+SSR+J) becomes invalid + -- when SSR > TAPS (ES) or SSR >= TAPS (OS), where TAPS=COEFFICIENT'length. + -- ES rule: 2*SSR <= NUM_TAPS => SSR <= COEFFICIENT'length + -- OS rule: 2*SSR < NUM_TAPS => SSR < COEFFICIENT'length + assert SYMMETRY="NS" or SSR<=TAPS-BOOLEAN'pos(SYMMETRY="OS") report "For ES: SSR must be <= NUM_TAPS/2. For OS: SSR must be < (NUM_TAPS+1)/2. Increase TAPS or use NS." severity failure; + -- For ES/OS, the DSP pre-adder computes D+A. D and A are both data_width bits wide, + -- so D+A = data_width+1 bits must fit the multiplier AD port. + -- FAMILY=3 (DSPx8): AD port = 27 bits → D+A ≤ 27 → data_width ≤ 26. + -- FAMILY=1,2 (DSP48/DSP58): AD port = 30 bits → D+A ≤ 30 → data_width ≤ 29. + assert SYMMETRY="NS" or I(I'low)'length <= FAMILY/3*26+(1-FAMILY/3)*29 + report "For ES/OS: data width (I_HIGH-I_LOW+1=" & INTEGER'image(I(I'low)'length) & ") exceeds the DSP pre-adder AD port limit (" & INTEGER'image(FAMILY/3*26+(1-FAMILY/3)*29) & " bits for FAMILY=" & INTEGER'image(FAMILY) & "). Reduce I_HIGH-I_LOW to fit within the limit, or use SYMMETRY=""NS""." + severity failure; + -- For SSR>1, the DI delay buffer has depth LDI=TAPS-1. TAPS=1 gives LDI=0 + -- (null range), which is not supported by xsim or synthesis. + assert SSR=1 or TAPS>=2 + report "TAPS must be >= 2 when SSR > 1: TAPS=1 creates a null-range DI buffer (LDI=0). No practical use case exists for SSR>1 with a single-tap FIR." + severity failure; i1:if SSR=1 generate - signal DI:SFIXED(I'range(2)); + signal DI:SFIXED(I(I'low)'range); signal AC:AC_VECTOR(0 to TAPS); signal PC:PC_VECTOR(0 to TAPS); + signal CS:UNSIGNED_VECTOR(0 to TAPS)(CSA'range):=(others=>(others=>'0')); function DSIZE(TAPS:INTEGER;SYMMETRY:STRING) return INTEGER is begin if SYMMETRY="ES" then - return 2*TAPS-1; + return 2*TAPS; elsif SYMMETRY="OS" then - return 2*TAPS-2; + return 2*TAPS-1; elsif SYMMETRY="NS" then return 0; else @@ -121,25 +195,41 @@ begin DDR=>DDR) port map(CLK=>CLK, CLKH=>CLKH, - I=>II(I'low), + I=>I(I'low), O=>DI); -- DSPx8 Array AC(0)<=STD_LOGIC_VECTOR(TO_SIGNED(0,AC(0)'length)); PC(0)<=STD_LOGIC_VECTOR(TO_SIGNED(0,PC(0)'length)); - lj:for J in 0 to TAPS-1 generate + CS(0)<=CSA; + lj:for J in 0 to TAPS-1-BOOLEAN'pos(ANTI and SYMMETRY="OS") generate + signal ALUMODE:STD_LOGIC_VECTOR(3 downto 0); signal INMODE:STD_LOGIC_VECTOR(4 downto 0); signal OPMODE:STD_LOGIC_VECTOR(8 downto 0); - signal A,D:SFIXED(I'range(2)); - signal C,P:SFIXED(LOG2(TAPS)+I'high(2)+C_HIGH+1 downto I'low(2)+C_LOW); -- must not be longer than 48/58 bits! + signal A,D:SFIXED(I(I'low)'range); + signal B:SFIXED(C_high downto C_low); + signal C,P:SFIXED(LOG2(TAPS)+I(I'low)'high+C_HIGH+1 downto I(I'low)'low+C_LOW); -- must not be longer than 48/58 bits! signal CE:STD_LOGIC; begin - A<=II(I'low) when J=0 else (others=>'0'); - C<=TO_SFIXED(2.0**(C'low-O'low(2)-1),C) when ROUNDING and (J=0) else TO_SFIXED(0.0,C); + A<=I(I'low) when J=0 else (others=>'0'); + C<=TO_SFIXED(2.0**(C'low-O(O'low)'low-1),C) when ROUNDING and (J=0) else TO_SFIXED(0.0,C); D<=(others=>'0') when SYMMETRY="NS" else DI; - INMODE<=5x"11" when (SYMMETRY="OS") and (J=TAPS-1) else 5x"15"; -- A1*B1 when (SYMMETRY="OS") and (K=TAPS-1) else (D+A1)*B1 - OPMODE<=9x"035" when J=0 else 9x"015"; -- PCOUT=C+(D+A)*B when J=0 else PCIN+(D+A)*B + ALUMODE<=4x"3" when ANTI else 4x"0"; + INMODE<=5x"18" when ANTI and (SYMMETRY="OS") and (J=TAPS-1) else 5x"1C" when ANTI else + 5x"10" when (SYMMETRY="OS") and (J=TAPS-1) else 5x"14"; -- A2*B1 when (SYMMETRY="OS") and (J=TAPS-1) else (D+A1)*B1 + OPMODE<=9x"035" when J=0 else 9x"015"; -- PCOUT=C-(D+A)*B when J=0 else PCIN-(D+A)*B CE<='1' when VI else '0'; - + ia:if COEFFICIENT'length=1 generate + B<=TO_SFIXED(COEFFICIENT(TO_INTEGER(CS(J+1-BOOLEAN'pos(SYMMETRY="NS"))))(COEFFICIENT(COEFFICIENT'low)'low+J),C_HIGH,C_LOW); + CS(J+1)<=CS(J); + else generate + process(CLK) + begin + if rising_edge(CLK) then + B<=TO_SFIXED(COEFFICIENT(TO_INTEGER(CS(J+1-BOOLEAN'pos(SYMMETRY="NS"))))(COEFFICIENT(COEFFICIENT'low)'low+J),C_HIGH,C_LOW); + CS(J+1)<=CS(J); + end if; + end process; + end generate; jk:entity work.DSPx8_WRAPPER generic map(X=>OX, Y=>OY+J, FAMILY=>FAMILY, @@ -150,10 +240,11 @@ begin port map (CLK=>CLK, CEA2=>CE, A=>A, - B=>TO_SFIXED(COEFFICIENT(COEFFICIENT'low+J),C_HIGH,C_LOW), + B=>B, C=>C, D=>D, ACIN=>AC(J), + ALUMODE=>ALUMODE, INMODE=>INMODE, OPMODE=>OPMODE, PCIN=>PC(J), @@ -161,26 +252,20 @@ begin PCOUT=>PC(J+1), P=>P); -- Output Samples - il:if J=COEFFICIENT'high generate --- all SET calls targetting the same signal must be located in a single process! --- SET does not work in QuestaSim! + il:if J=TAPS-1-BOOLEAN'pos(ANTI and SYMMETRY="OS") generate process(P) begin --- SET(O,O'low,P); - for L in O'range(2) loop - O(O'low(1),L)<=P(L); - end loop; + O(O'low)<=RESIZE(P,O(O'low)); end process; - end generate; + end generate; end generate; end; else generate - signal DI:SFIXED_VECTOR(-LDI to -1):=(others=>(others=>'0')); - signal WI,EI:SFIXED_VECTOR(1 to TAPS-1); - signal RSW:SFIXED_MATRIX(0 to TAPS-2,0 to SSR-2):=(others=>(others=>(others=>'0'))); - signal RSE:SFIXED_MATRIX(0 to TAPS-2,1 to SSR-1):=(others=>(others=>(others=>'0'))); - type P_SFIXED_VECTOR is array(INTEGER range <>) of SFIXED(LOG2(TAPS)+I'high(2)+C_HIGH+1 downto I'low(2)+C_LOW); -- must not be longer than 48/58 bits! - signal vP:P_SFIXED_VECTOR(0 to SSR-1); + signal DI:SFIXED_VECTOR(-LDI to -1)(I(I'low)'range):=(others=>(others=>'0')); + signal WI,EI:SFIXED_VECTOR(1 to TAPS-1)(I(I'low)'range); + signal RSW:SFIXED_MATRIX(0 to TAPS-2)(0 to SSR-2)(I(I'low)'range):=(others=>(others=>(others=>'0'))); + signal RSE:SFIXED_MATRIX(0 to TAPS-2)(1 to SSR-1)(I(I'low)'range):=(others=>(others=>(others=>'0'))); + signal vP:SFIXED_VECTOR(0 to SSR-1)(LOG2(TAPS)+I(I'low)'high+C_HIGH+1 downto I(I'low)'low+C_LOW); begin -- Input Data Delay Line for SSR Input Samples process(CLK) @@ -191,7 +276,7 @@ begin if K<-SSR then DI(K)<=DI(K+SSR); else - DI(K)<=II(I'low+K+SSR); + DI(K)<=I(I'low+K+SSR); end if; end loop; end if; @@ -207,12 +292,28 @@ begin O=>WI(J)); ns:if SYMMETRY/="NS" generate - rd:entity work.SDELAY generic map(SIZE=>J, - DDR=>DDR) - port map(CLK=>CLK, - CLKH=>CLKH, - I=>DI(-LDI-1+SSR+J), - O=>EI(J)); + -- Reverse delay: DI(-LDI-1+SSR+J) accesses the symmetric + -- counterpart sample. Guard against OOB when SSR >= TAPS_internal + -- (i.e. -LDI-1+SSR+J >= 0). For the degenerate center-tap case + -- use DI(-J) so D+B=2D; with the halved center coefficient this + -- gives the correct full-coefficient result. For ANTI=TRUE the + -- center coefficient is 0 so this path has no effect. + valid_rd:if (-LDI-1+SSR+J) < 0 generate + rd:entity work.SDELAY generic map(SIZE=>J, + DDR=>DDR) + port map(CLK=>CLK, + CLKH=>CLKH, + I=>DI(-LDI-1+SSR+J), + O=>EI(J)); + end generate; + center_rd:if (-LDI-1+SSR+J) >= 0 generate + rd:entity work.SDELAY generic map(SIZE=>J, + DDR=>DDR) + port map(CLK=>CLK, + CLKH=>CLKH, + I=>DI(-J), + O=>EI(J)); + end generate; end generate; end generate; -- Pipelining Array Registers @@ -221,7 +322,7 @@ begin process(CLK) begin if rising_edge(CLK) then - RSW(J,K)<=SW(J,K); + RSW(J)(K)<=SW(J)(K); end if; end process; end generate; @@ -231,7 +332,7 @@ begin process(CLK) begin if rising_edge(CLK) then - RSE(J,K)<=SE(J,K); + RSE(J)(K)<=SE(J)(K); end if; end process; end generate; @@ -240,58 +341,71 @@ begin -- DSPx8 Array lk:for K in 0 to SSR-1 generate signal PC:PC_VECTOR(0 to TAPS); + signal CS:UNSIGNED_VECTOR(0 to TAPS)(CSA'range):=(others=>(others=>'0')); begin PC(0)<=STD_LOGIC_VECTOR(TO_SIGNED(0,PC(0)'length)); - lj:for J in 0 to TAPS-1 generate + CS(0)<=CSA; + lj:for J in 0 to TAPS-1-BOOLEAN'pos(ANTI and SYMMETRY="OS") generate + signal ALUMODE:STD_LOGIC_VECTOR(3 downto 0); signal INMODE:STD_LOGIC_VECTOR(4 downto 0); signal OPMODE:STD_LOGIC_VECTOR(8 downto 0); - signal D:SFIXED(I'range(2)); + signal D:SFIXED(I(I'low)'range); signal C,P:SFIXED(vP(vP'low)'range); + signal B:SFIXED(C_high downto C_low); begin -- MIN/MAX workaround for QuestaSim bug - SW(J,K)<=II(I'low+K) when J=0 else - WI(work.TYPES_PKG.MAX(J,1)) when K=0 else - RSW(work.TYPES_PKG.MAX(J-1,0),work.TYPES_PKG.MAX(K-1,0)); + SW(J)(K)<=I(I'low+K) when J=0 else + WI(work.cfixed_pkg.MAX(J,1)) when K=0 else + RSW(work.cfixed_pkg.MAX(J-1,0))(work.cfixed_pkg.MAX(K-1,0)); ns:if SYMMETRY/="NS" generate - SE(J,K)<=DI(-LDI+K) when J=0 else - EI(work.TYPES_PKG.MAX(J,1)) when K=SSR-1 else - RSE(work.TYPES_PKG.MAX(J-1,0),work.TYPES_PKG.MIN(K+1,SSR-1)); + SE(J)(K)<=DI(-LDI+K) when J=0 else + EI(work.cfixed_pkg.MAX(J,1)) when K=SSR-1 else + RSE(work.cfixed_pkg.MAX(J-1,0))(work.cfixed_pkg.MIN(K+1,SSR-1)); end generate; - C<=TO_SFIXED(2.0**(C'low-O'low(2)-1),C) when ROUNDING and (J=0) else TO_SFIXED(0.0,C); - D<=(others=>'0') when SYMMETRY="NS" else SE(J,K); - INMODE<=5x"11" when (SYMMETRY="OS") and (J=TAPS-1) else 5x"15"; -- A1*B1 when (SYMMETRY="OS") and (K=TAPS-1) else (D+A1)*B1 + C<=TO_SFIXED(2.0**(C'low-O(O'low)'low-1),C) when ROUNDING and (J=0) else TO_SFIXED(0.0,C); + D<=(others=>'0') when SYMMETRY="NS" else SE(J)(K); + ALUMODE<=4x"3" when ANTI else 4x"0"; + INMODE<=5x"13" when ANTI and (SYMMETRY="OS") and (J=TAPS-1) else 5x"1D" when ANTI else + 5x"11" when (SYMMETRY="OS") and (J=TAPS-1) else 5x"15"; -- A2*B1 when (SYMMETRY="OS") and (J=TAPS-1) else (D+A1)*B1 OPMODE<=9x"035" when J=0 else 9x"015"; -- PCOUT=C+(D+A)*B when J=0 else PCIN+(D+A)*B - + ia:if COEFFICIENT'length=1 generate + B<=TO_SFIXED(COEFFICIENT(TO_INTEGER(CS(J+1-BOOLEAN'pos(SYMMETRY="NS"))))(COEFFICIENT(COEFFICIENT'low)'low+J),C_HIGH,C_LOW); + CS(J+1)<=CS(J); + else generate + process(CLK) + begin + if rising_edge(CLK) then + B<=TO_SFIXED(COEFFICIENT(TO_INTEGER(CS(J)))(COEFFICIENT(COEFFICIENT'low)'low+J),C_HIGH,C_LOW); + CS(J+1)<=CS(J); + end if; + end process; + end generate; jk:entity work.DSPx8_WRAPPER generic map(X=>OX+K, Y=>OY+J, FAMILY=>FAMILY, AMULTSEL=>AMULTSEL(SYMMETRY)) --"A" for Non-Symmetric FIR else "AD" port map (CLK=>CLK, - A=>SW(J,K), - B=>TO_SFIXED(COEFFICIENT(COEFFICIENT'low+J),C_HIGH,C_LOW), + A=>SW(J)(K), + B=>B, C=>C, D=>D, + ALUMODE=>ALUMODE, INMODE=>INMODE, OPMODE=>OPMODE, PCIN=>PC(J), PCOUT=>PC(J+1), P=>P); -- SSR Output Samples - il:if J=COEFFICIENT'high generate + il:if J=TAPS-1-BOOLEAN'pos(ANTI and SYMMETRY="OS") generate vP(K)<=P; end generate; end generate; end generate; --- all SET calls targetting the same signal must be located in a single process! --- SET does not work in QuestaSim! process(vP) begin for K in vP'range loop --- SET(O,O'low+K,vP(K)); - for L in O'range(2) loop - O(O'low(1)+K,L)<=vP(K)(L); - end loop; + O(O'low+K)<=RESIZE(vP(K),O(O'low+K)); end loop; end process; end; @@ -303,4 +417,4 @@ begin CLKH=>CLKH, I=>VI, O=>VO); -end TEST; \ No newline at end of file +end TEST; diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/SSR_FIR_TEST.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/SSR_FIR_TEST.vhd deleted file mode 100755 index 68da4082b..000000000 --- a/Examples/HDL/Digital_Filtering/SSR_FIR/SSR_FIR_TEST.vhd +++ /dev/null @@ -1,77 +0,0 @@ --- Copyright (C) 2024, Advanced Micro Devices, Inc. - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; - -use work.TYPES_PKG.all; - -library UNISIM; -use UNISIM.VComponents.all; - -entity SSR_FIR_TEST is - generic(OX,OY:INTEGER:=0; -- Coordinates of the lower left corner DSPx8, use -2147483648 if you do not want floorplanning - FAMILY:INTEGER:=3; -- use 1 for 7-series, 2 for US/US+ and 3 for Versal - DDR:BOOLEAN:=TRUE; -- DDR implementation for Versal -3 clock rates over 872MHz - SSR:INTEGER:=8; -- for 8Gsps in Versal speed grade -3 --- SSR:INTEGER:=9; -- for 8Gsps in US+ speed grade -3 --- SSR:INTEGER:=11; -- for 8Gsps in 7-series speed grade -3 - COEFFICIENT:REAL_VECTOR(0 to 15):=(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0); --- COEFFICIENT:REAL_VECTOR(0 to 23):=(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0); - I_HIGH:INTEGER:=7; - I_LOW:INTEGER:=-8; - C_HIGH:INTEGER:=9; - C_LOW:INTEGER:=-8; - O_HIGH:INTEGER:=19; - O_LOW:INTEGER:=-8; - ROUNDING:BOOLEAN:=TRUE; - SYMMETRY:STRING:="OS"); -- Filter Symmetry, use "ES" for Even-Symmetric, "OS" for Odd-Symmetric and "NS" for Non-Symmetric - port(CLKIN:in STD_LOGIC; - I:in SFIXED_VECTOR(0 to SSR-1,I_HIGH downto I_LOW); - VI:in BOOLEAN; - O:out SFIXED_VECTOR(0 to SSR-1,O_HIGH downto O_LOW); - VO:out BOOLEAN); -end SSR_FIR_TEST; - -architecture TEST of SSR_FIR_TEST is - signal CLK,CLKH:STD_LOGIC; - signal ID:SFIXED_VECTOR(0 to SSR-1,I_HIGH downto I_LOW):=(others=>(others=>'0')); - signal VID:BOOLEAN:=FALSE; -begin - i1:if DDR generate - b2:MBUFGCE_DIV port map(I=>CLKIN, - CE=>'1', - CLR=>'0', - CLRB_LEAF=>'1', - O1=>CLK, - O2=>CLKH); - end; - else generate - CLK<=CLKIN; - CLKH<='0'; - end generate; - - process(CLK) - begin - if rising_edge(CLK) then - ID<=I; - VID<=VI; - end if; - end process; - - u1:entity work.SSR_FIR generic map(OX=>OX, - OY=>OY, - FAMILY=>FAMILY, - DDR=>DDR, - COEFFICIENT=>COEFFICIENT, - C_HIGH=>C_HIGH, - C_LOW=>C_LOW, - ROUNDING=>ROUNDING, - SYMMETRY=>SYMMETRY) - port map (CLK=>CLK, - CLKH=>CLKH, - I=>ID, - VI=>VID, - O=>O, - VO=>VO); -end TEST; \ No newline at end of file diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/TRANSPOSE_SSR_FIR.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/TRANSPOSE_SSR_FIR.vhd new file mode 100644 index 000000000..af39ae127 --- /dev/null +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/TRANSPOSE_SSR_FIR.vhd @@ -0,0 +1,382 @@ +-- Copyright © Advanced Micro Devices, Inc., or its affiliates. All rights reserved. +-- Portions of this content consists of AI generated content. +-- You may not use this software and documentation (if any) (collectively, the "Materials") +-- except in compliance with the terms and conditions of the Software License Agreement +-- included with the Materials or otherwise as set forth in writing and signed by you and +-- an authorized signatory of AMD. If you do not have a copy of the Software License +-- Agreement, contact your AMD representative for a copy. You agree that you will not +-- reverse engineer or decompile the Materials, in whole or in part, except as allowed by +-- applicable law. +-- THE MATERIALS ARE DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR +-- REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; + +use work.FIXED_PKG.all; +use work.CFIXED_PKG.all; + +-- ============================================================================= +-- TRANSPOSE_SSR_FIR_ROW +-- One J-row sub-filter for the transpose-form SSR FIR. Instantiated SSR times +-- from TRANSPOSE_SSR_FIR via for-generate. Keeping J as a generic constant +-- (not a for-generate loop variable) works around an xsim VHDL-2008 bug where +-- concurrent signal assignments and processes inside for-generate use only the +-- first iteration value of the loop parameter. Entity instantiation port maps +-- are evaluated correctly for every iteration, so the row is instantiated with +-- the right J_IDX via the outer generate and handles its own K-loop internally. +-- ============================================================================= +entity TRANSPOSE_SSR_FIR_ROW is + generic(J_IDX:INTEGER; -- row index (0..SSR-1) + OX,OY:INTEGER; -- floorplan origin; chains add K to OX + FAMILY:INTEGER; + DDR:BOOLEAN; + COEFFICIENT:REAL_MATRIX; -- full coefficient matrix; GET() selects K-slice + TAPS_G:INTEGER; -- total number of taps (passed in to size C) + C_HIGH:INTEGER; + C_LOW:INTEGER; + EXTRA_C_PIPELINING:BOOLEAN; + EXTRA_D_PIPELINING:BOOLEAN; + ROUNDING:BOOLEAN; + ANTI:BOOLEAN; + SYMMETRY:STRING); + port(CLK:in STD_LOGIC; + CLKH:in STD_LOGIC; + I:in SFIXED_VECTOR; -- full SSR-wide input + VI:in BOOLEAN; + CSA:in UNSIGNED; -- coefficient set address + O_J:out SFIXED); -- single sub-filter output (one lane) +end TRANSPOSE_SSR_FIR_ROW; + +architecture ROW of TRANSPOSE_SSR_FIR_ROW is + constant SSR:INTEGER:=I'length; + constant D_HIGH:INTEGER:=I(I'low)'high; + constant D_LOW :INTEGER:=I(I'low)'low; + constant CH:INTEGER:=LOG2(TAPS_G)+D_HIGH+C_HIGH+2; + constant CL:INTEGER:=D_LOW+C_LOW; + -- All signals at architecture level - no for-generate local signal declarations. + -- K-indexed signals are 1-D arrays (SFIXED_VECTOR or UNSIGNED_VECTOR), indexed + -- by the lk for-generate parameter K. J_IDX is a generic constant here, so + -- every expression that references it is correctly evaluated in all contexts. + signal C :SFIXED_VECTOR(0 to SSR)(CH downto CL); + signal ID,RD:SFIXED_VECTOR(I'range)(D_HIGH downto D_LOW); + signal CP_K:SFIXED_VECTOR(0 to SSR-1)(CH downto CL) + :=(others=>(others=>'0')); + signal DD_K,BB_K:SFIXED_VECTOR(0 to SSR-1)(D_HIGH downto D_LOW) + :=(others=>(others=>'0')); + signal DO_K,BO_K:SFIXED_VECTOR(0 to SSR-1)(D_HIGH downto D_LOW); + signal CS:UNSIGNED_VECTOR(0 to SSR)(CSA'range):=(others=>(others=>'0')); + + function GET(COEFFICIENT:REAL_MATRIX;K:INTEGER) return REAL_MATRIX is + constant TAPS_K:INTEGER:=COEFFICIENT(COEFFICIENT'low)'length; + variable RESULT:REAL_MATRIX(COEFFICIENT'range)(0 to (TAPS_K+SSR-1)/SSR-1); + begin + for J in RESULT'range loop + for L in RESULT(J)'range loop + if SSR*L+SSR-1-K >= TAPS_K then + RESULT(J)(L):=0.0; + elsif (SYMMETRY="OS") and (SSR*L+SSR-1-K=TAPS_K-1) then + RESULT(J)(L):=COEFFICIENT(J)(SSR*L+SSR-1-K)/2.0; + else + RESULT(J)(L):=COEFFICIENT(J)(SSR*L+SSR-1-K); + end if; + end loop; + end loop; + return RESULT; + end; + +begin + C(0)<=TO_SFIXED(0.0,C(0)); + + -- Anti+OS: center coefficient (last element of coefficient array) must be 0.0. + -- The GET() function applies /2.0 to the center tap; for anti-symmetric filters + -- the center must be zero so the pre-adder subtraction (D-B) cancels correctly. + assert not (ANTI and SYMMETRY="OS" and + COEFFICIENT(COEFFICIENT'low)(COEFFICIENT(COEFFICIENT'low)'high) /= 0.0) + report "TRANSPOSE_SSR_FIR_ROW: ANTI+OS center coefficient must be 0.0" + severity FAILURE; + + -- CS cascade: one process owns ALL elements of CS (including CS(0)) to avoid + -- any cross-driver conflict on the unresolved UNSIGNED_VECTOR composite signal. + -- Having CS(0)<=CSA as a separate concurrent assignment plus a process driving + -- CS(1..SSR) makes xsim see the composite as having two drivers and CS(0) gets + -- stuck at its initial value. Absorbing CS(0)<=CSA into the same process (with + -- CSA in the sensitivity list so it stays combinatorial) resolves this. + cs_cascade:if EXTRA_C_PIPELINING generate + process(CLK, CSA) begin + CS(0)<=CSA; -- combinatorial: all CSA changes reflected immediately + if rising_edge(CLK) then + CS(1)<=CSA; -- CS(1) registered once from CSA + for K in 1 to SSR-1 loop + CS(K+1)<=CS(K); + end loop; + end if; + end process; + else generate + process(all) begin + CS(0)<=CSA; + CS(1)<=CSA; + for K in 1 to SSR-1 loop + CS(K+1)<=CS(K); + end loop; + end process; + end generate; + + -- CP_K cascade: one process owns ALL elements of CP_K to avoid any + -- cross-driver conflict on the unresolved SFIXED_VECTOR composite signal. + -- CP_K(0)=C(0)=0 always; CP_K(1..SSR-1) registered when EXTRA_C_PIPELINING. + cp_cascade:if EXTRA_C_PIPELINING generate + process(CLK) begin + if rising_edge(CLK) then + for K in 0 to SSR-1 loop + CP_K(K)<=C(K); + end loop; + end if; + end process; + else generate + process(all) begin + for K in 0 to SSR-1 loop + CP_K(K)<=C(K); + end loop; + end process; + end generate; + + -- DD_K / BB_K: registered when EXTRA_D_PIPELINING, wired otherwise. + -- Single process drives all SSR elements to avoid multiple-driver issues. + dd_bb_pipe:if EXTRA_D_PIPELINING generate + process(CLK) begin + if rising_edge(CLK) then + for K in 0 to SSR-1 loop + DD_K(K)<=ID(K+I'low); + BB_K(K)<=RD(K+I'low); + end loop; + end if; + end process; + else generate + process(all) begin + for K in 0 to SSR-1 loop + DD_K(K)<=ID(K+I'low); + BB_K(K)<=RD(K+I'low); + end loop; + end process; + end generate; + + -- RD for NS symmetry: no reverse-input path, drive entire array to zero. + -- Handled here at architecture level (not inside the lk for-generate) so + -- there is exactly one driver on the unresolved SFIXED_VECTOR signal. + rd_ns:if SYMMETRY="NS" generate + RD<=(others=>(others=>'0')); + end generate; + + -- K-loop: ONLY entity instantiations appear here. + -- Concurrent signal assignments and processes have been moved to architecture-level + -- constructs above so xsim's for-generate multiple-driver bug cannot affect them. + lk:for K in 0 to SSR-1 generate + + -- Triangular input delay: selects and time-aligns the correct input sample + -- for this (J_IDX, K) filter chain. J_IDX is a generic constant so the + -- SIZE expression is evaluated correctly for each elaborated ROW instance. + sd_gen:if J_IDX=(SSR-1) generate + sd:entity work.SDELAY + generic map(SIZE=>2*K+K*BOOLEAN'pos(EXTRA_C_PIPELINING), + DDR=>DDR) + port map(CLK=>CLK, + CLKH=>CLKH, + I=>I((1+K+J_IDX) mod SSR+I'low), + O=>ID(K+I'low)); + else generate + sd:entity work.SDELAY + generic map(SIZE=>1+2*K-(J_IDX+K)/(SSR-1)+K*BOOLEAN'pos(EXTRA_C_PIPELINING), + DDR=>DDR) + port map(CLK=>CLK, + CLKH=>CLKH, + I=>I((1+K+J_IDX) mod SSR+I'low), + O=>ID(K+I'low)); + end generate; + + -- Reverse input delay for symmetric path (ES/OS only). + -- NS symmetry: RD is driven to zero at architecture level above. + ri:if SYMMETRY="ES" generate + dr_gen:if J_IDX=(SSR-1) generate + dr:entity work.SDELAY + generic map(SIZE=>2*(SSR-K)-1+(SSR-K-1)*BOOLEAN'pos(EXTRA_C_PIPELINING), + DDR=>DDR) + port map(CLK=>CLK, + CLKH=>CLKH, + I=>I((1+J_IDX+K) mod SSR+I'low), + O=>RD(SSR-1-K+I'low)); + else generate + dr:entity work.SDELAY + generic map(SIZE=>1+2*(SSR-K)-1-(J_IDX+K)/(SSR-1)+(SSR-K-1)*BOOLEAN'pos(EXTRA_C_PIPELINING), + DDR=>DDR) + port map(CLK=>CLK, + CLKH=>CLKH, + I=>I((1+J_IDX+K) mod SSR+I'low), + O=>RD(SSR-1-K+I'low)); + end generate; + elsif SYMMETRY="OS" generate + dr:entity work.SDELAY + generic map(SIZE=>2*(SSR-K-1)+BOOLEAN'pos(((J_IDX+K+2) mod SSR)>J_IDX)+(SSR-K-1)*BOOLEAN'pos(EXTRA_C_PIPELINING), + DDR=>DDR) + port map(CLK=>CLK, + CLKH=>CLKH, + I=>I((J_IDX+K+2) mod SSR+I'low), + O=>RD(SSR-1-K+I'low)); + end generate; + + -- Accumulator chain for this (J_IDX, K) tap group. + jk:entity work.TRANSPOSE_SSR_FIR_CHAIN + generic map(OX=>OX+K, + OY=>OY, + FAMILY=>FAMILY, + DDR=>DDR, + COEFFICIENT=>GET(COEFFICIENT,K), + C_HIGH=>C_HIGH, + C_LOW=>C_LOW, + ROUNDING=>ROUNDING and (K=0), + ANTI=>ANTI, + SYMMETRY=>SYMMETRY, + FIRST_CHAIN=>K=0) + port map(CLK=>CLK, + CLKH=>CLKH, + DI=>DD_K(K), + BI=>BB_K(K), + CI=>CP_K(K), + VI=>VI, + CSA=>CS(K), + DO=>DO_K(K), + BO=>BO_K(K), + O=>C(K+1), + VO=>open); + end generate lk; + + O_J<=RESIZE(C(SSR),O_J); + +end ROW; + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; +use work.FIXED_PKG.all; +use work.CFIXED_PKG.all; + +-- ============================================================================= +-- TRANSPOSE_SSR_FIR +-- Top-level SSR polyphase transpose-form FIR filter. +-- Instantiates SSR TRANSPOSE_SSR_FIR_ROW entities via a for-generate. +-- Only entity instantiations appear inside the for-generate (no concurrent +-- signal assignments or processes) so xsim's for-generate evaluation bug does +-- not affect correctness. J is passed as a generic constant J_IDX to each row. +-- ============================================================================= +entity TRANSPOSE_SSR_FIR is + generic(OX,OY:INTEGER:=-2147483648; -- Coordinates of the lower left corner DSPx8, use -2147483648 if you do not want floorplanning + FAMILY:INTEGER:=3; -- use 1 for 7-series, 2 for US/US+ and 3 for Versal + DDR:BOOLEAN:=FALSE; -- DDR implementation to be used only for Versal -3 and clock rates over 872MHz + COEFFICIENT:REAL_MATRIX; -- Number of Coefficient Sets=COEFFICIENT'length(1), Number of Taps=COEFFICIENT'length(2) + C_HIGH:INTEGER:=0; -- For odd anti-symmetric filters, the center tap coefficient, COEFFICIENT(:,COEFFICIENT'high(2)) must be zero, but the redundant DSPx8 is removed + C_LOW:INTEGER:=-17; + EXTRA_C_PIPELINING:BOOLEAN:=TRUE; + EXTRA_D_PIPELINING:BOOLEAN:=TRUE; + ROUNDING:BOOLEAN:=FALSE; + ANTI:BOOLEAN:=FALSE; -- If even or odd symmetric, is it anti-symmetric? + SYMMETRY:STRING:="ES"); -- Filter Symmetry, use "ES" for Even-Symmetric, "OS" for Odd-Symmetric and "NS" for Non-Symmetric + port(CLK:in STD_LOGIC; + CLKH:in STD_LOGIC:='0'; -- if DDR=FALSE can be left unconnected + I:in SFIXED_VECTOR; -- for non-symmetric filters use DI as input, tie BI to zero, for symmetric filters tie DI and BI together + VI:in BOOLEAN:=TRUE; -- WARNING: VI must not be deasserted mid-stream. + -- SDELAY chains are not gated by VI; deasserting VI + -- after data has entered the pipeline causes permanent + -- misalignment between the data path and VO delay line. + -- There is no reset port — power-cycle to recover. + --CEBI,CECI,CEDI:in BOOLEAN:=TRUE; + CSA:in UNSIGNED:="0"; -- Coefficient Set Address, CSA'length must be equal to LOG2(COEFFICIENT'length(1)) + O:out SFIXED_VECTOR; + VO:out BOOLEAN); +end TRANSPOSE_SSR_FIR; + +architecture TEST of TRANSPOSE_SSR_FIR is + constant COEFFICIENT_SETS:INTEGER:=COEFFICIENT'length; + constant TAPS:INTEGER:=COEFFICIENT(COEFFICIENT'low)'length; + constant SSR:INTEGER:=I'length; + -- DSP port widths (integer division intentional; matches DSPx8_WRAPPER slv* signals) + constant I_WIDTH :INTEGER:=I(I'low)'high-I(I'low)'low+1; -- data bit width + constant C_WIDTH :INTEGER:=C_HIGH-C_LOW+1; -- coefficient bit width + constant A_PORT_W :INTEGER:=FAMILY/3*4+30; -- A port: 34b Versal/DSP58, 30b US+/DSP48E2 + constant D_PORT_W :INTEGER:=27; -- D port: 27b on all families (FAMILY/2*2+25) + constant B_PORT_W :INTEGER:=FAMILY/3*6+18; -- B port: 24b Versal/DSP58, 18b US+/DSP48E2 +begin + assert I'length=O'length report "Inconsistent I and O port lengths!" severity warning; + assert CSA'length=MAX(LOG2(COEFFICIENT'length(1)),1) report "Inconsistent CSA length!" severity warning; + -- DSP port truncation guards ------------------------------------------- + -- Coefficient maps to DSP A port (AMULTSEL="A", PREADDINSEL="B"). + -- Exceeding A_PORT_W silently truncates coefficient MSBs -> wrong MAC results. + assert C_WIDTH<=A_PORT_W + report "TRANSPOSE_SSR_FIR: coefficient width "&INTEGER'image(C_WIDTH) + &"b exceeds DSP A port ("&INTEGER'image(A_PORT_W) + &"b on FAMILY="&INTEGER'image(FAMILY) + &") - reduce C_HIGH-C_LOW or target FAMILY=3 (Versal, A=34b)" + severity FAILURE; + -- Forward data maps to DSP D port (always, all filter modes; BMULTSEL="AD", B=0 for NS). + -- D port is 27b on all supported families. Exceeding it truncates data MSBs. + assert I_WIDTH<=D_PORT_W + report "TRANSPOSE_SSR_FIR: data width "&INTEGER'image(I_WIDTH) + &"b exceeds DSP D port (27b, all families) - reduce I_HIGH-I_LOW" + severity FAILURE; + -- Reverse data maps to DSP B port (ES/OS only; B is forced to 0 for NS so no risk). + -- B port is narrower than D: 24b Versal, 18b US+. Exceeding it truncates the + -- reverse pre-adder operand -> wrong ES/OS symmetric filter output. + assert SYMMETRY="NS" or I_WIDTH<=B_PORT_W + report "TRANSPOSE_SSR_FIR: data width "&INTEGER'image(I_WIDTH) + &"b exceeds DSP B port ("&INTEGER'image(B_PORT_W) + &"b on FAMILY="&INTEGER'image(FAMILY)&") for "&SYMMETRY + &" reverse path - reduce I_HIGH-I_LOW" + &" or switch to FAMILY=3 (Versal, B=24b vs US+ B=18b)" + severity FAILURE; + -- ----------------------------------------------------------------------- + + -- Instantiate one row sub-filter per SSR lane. Only entity instantiations + -- appear inside this for-generate so xsim evaluates J correctly for all + -- J=0..SSR-1 (xsim correctly handles for-generate for entity port maps). + lj:for J in SSR-1 downto 0 generate + jrow:entity work.TRANSPOSE_SSR_FIR_ROW + generic map(J_IDX => J, + OX => OX, + OY => OY+TAPS/SSR*J, + FAMILY => FAMILY, + DDR => DDR, + COEFFICIENT => COEFFICIENT, + TAPS_G => TAPS, + C_HIGH => C_HIGH, + C_LOW => C_LOW, + EXTRA_C_PIPELINING => EXTRA_C_PIPELINING, + EXTRA_D_PIPELINING => EXTRA_D_PIPELINING, + ROUNDING => ROUNDING, + ANTI => ANTI, + SYMMETRY => SYMMETRY) + port map(CLK => CLK, + CLKH => CLKH, + I => I, + VI => VI, + CSA => CSA, + O_J => O(J+O'low)); + end generate lj; + +-- Data Valid Delay Line +-- Latency formula (EXTRA_C=TRUE, EXTRA_D=TRUE): 2*SSR + 2 + (SSR-1) + 1 = 3*SSR + 2 +-- SSR LATENCY +-- 1 5 +-- 2 8 +-- 3 11 +-- 4 14 +-- 5 17 +-- 6 20 +-- 8 26 +-- 10 32 + bd:entity work.BDELAY generic map(SIZE=>2*SSR+2+(SSR-1)*BOOLEAN'pos(EXTRA_C_PIPELINING)+BOOLEAN'pos(EXTRA_D_PIPELINING), + DDR=>DDR) + port map(CLK=>CLK, + CLKH=>CLKH, + I=>VI, + O=>VO); +end TEST; diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/TRANSPOSE_SSR_FIR_CHAIN.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/TRANSPOSE_SSR_FIR_CHAIN.vhd new file mode 100644 index 000000000..dea715736 --- /dev/null +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/TRANSPOSE_SSR_FIR_CHAIN.vhd @@ -0,0 +1,324 @@ +-- Copyright © Advanced Micro Devices, Inc., or its affiliates. All rights reserved. +-- Portions of this content consists of AI generated content. +-- You may not use this software and documentation (if any) (collectively, the "Materials") +-- except in compliance with the terms and conditions of the Software License Agreement +-- included with the Materials or otherwise as set forth in writing and signed by you and +-- an authorized signatory of AMD. If you do not have a copy of the Software License +-- Agreement, contact your AMD representative for a copy. You agree that you will not +-- reverse engineer or decompile the Materials, in whole or in part, except as allowed by +-- applicable law. +-- THE MATERIALS ARE DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR +-- REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; + +use work.FIXED_PKG.all; +use work.CFIXED_PKG.all; + +-- ============================================================================= +-- TRANSPOSE_SSR_FIR_CHAIN +-- One K-column accumulator chain for the SSR polyphase transpose-form FIR. +-- Instantiated SSR times from TRANSPOSE_SSR_FIR_ROW. +-- +-- xsim workaround: concurrent signal assignments and processes inside +-- for-generate use only the first iteration value of the loop parameter. +-- Additionally, signal instances inside for-generate are SHARED across all +-- iterations, causing multiple-driver conflicts (X propagation) when per-stage +-- drivers disagree. The fix (matching what was done in TRANSPOSE_SSR_FIR_ROW) +-- is to declare ALL signals at architecture level and drive them with a single +-- architecture-level process or concurrent assignment. Only entity +-- instantiations appear inside the lj:for J generate; port maps are evaluated +-- correctly per iteration in xsim. +-- ============================================================================= +entity TRANSPOSE_SSR_FIR_CHAIN is + generic(OX,OY:INTEGER:=-2147483648; -- Coordinates of the lower left corner DSPx8, use -2147483648 if you do not want floorplanning + FAMILY:INTEGER:=3; -- use 1 for 7-series, 2 for US/US+ and 3 for Versal + DDR:BOOLEAN:=FALSE; -- DDR implementation to be used only for Versal -3 and clock rates over 872MHz + COEFFICIENT:REAL_MATRIX; -- Number of Coefficient Sets=COEFFICIENT'length(1), Number of Taps=COEFFICIENT'length(2) + C_HIGH:INTEGER:=0; -- For odd anti-symmetric filters, the center tap coefficient, COEFFICIENT(:,COEFFICIENT'high(2)) must be zero, but the redundant DSPx8 is removed + C_LOW:INTEGER:=-17; + ROUNDING:BOOLEAN:=FALSE; + ANTI:BOOLEAN:=FALSE; -- If even or odd symmetric, is it anti-symmetric? + SYMMETRY:STRING:="ES"; -- Filter Symmetry, use "ES" for Even-Symmetric, "OS" for Odd-Symmetric and "NS" for Non-Symmetric + FIRST_CHAIN: BOOLEAN := TRUE); + port(CLK:in STD_LOGIC; + CLKH:in STD_LOGIC:='0'; -- if DDR=FALSE can be left unconnected + DI,BI:in SFIXED; -- for non-symmetric filters use DI as input, tie BI to zero, for symmetric filters tie DI is forward data and BI is reverse data + CI:in SFIXED; -- C input into the last DSPx8 in the chain, used for cascading transpose sections + VI:in BOOLEAN:=TRUE; + CEBI,CECI,CEDI:in BOOLEAN:=TRUE; + CSA:in UNSIGNED:="0"; -- Coefficient Set Address, CSA'length must be equal to LOG2(COEFFICIENT'length(1)) + DO,BO:out SFIXED; -- these are not used unless you build a systolic transposed filter structure + O:out SFIXED; + VO:out BOOLEAN); +end TRANSPOSE_SSR_FIR_CHAIN; + +architecture TEST of TRANSPOSE_SSR_FIR_CHAIN is + constant COEFFICIENT_SETS:INTEGER:=COEFFICIENT'length; + constant TAPS:INTEGER:=COEFFICIENT(COEFFICIENT'low)'length; + constant JLOW:INTEGER:=0; + + -- P/C signal width (must not exceed DSP P register width of 48/58 bits) + constant P_HIGH : INTEGER := MAX(LOG2(TAPS)+BI'high+C_HIGH+1, O'high); + constant P_LOW : INTEGER := BI'low+C_LOW; + + -- ------------------------------------------------------------------------- + -- Helper functions + -- ------------------------------------------------------------------------- + function BREG(SYMMETRY:STRING;ANTI:BOOLEAN;J:INTEGER) return INTEGER is + begin + if (SYMMETRY="ES") or (SYMMETRY="OS") then + if (SYMMETRY="OS") and FIRST_CHAIN and J=JLOW then + return 1; + elsif (SYMMETRY/="OS") and J=JLOW then + return 1; + else + return 2; + end if; + elsif SYMMETRY="NS" then + return 1; + else + assert FALSE report "SYMMETRY must be either ""ES"", ""OS"" or ""NS""!" severity warning; + return 0; + end if; + end; + + function LATENCY(SYMMETRY:STRING;TAPS:INTEGER) return INTEGER is + begin + if SYMMETRY="ES" then + return 4; + elsif SYMMETRY="OS" then + return 4; + elsif SYMMETRY="NS" then + return 3; + else + assert FALSE report "SYMMETRY must be either ""ES"", ""OS"" or ""NS""!" severity warning; + return 0; + end if; + end; + + function B_INPUT(J:INTEGER) return STRING is + begin + if J=JLOW then + return "DIRECT"; + else + return "CASCADE"; + end if; + end; + + -- ------------------------------------------------------------------------- + -- Cascade signal arrays (one entry per DSP stage, plus boundary values) + -- ------------------------------------------------------------------------- + type BC_VECTOR is array(INTEGER range <>) of STD_LOGIC_VECTOR(FAMILY/3*6+17 downto 0); + type CS_VECTOR is array(INTEGER range <>) of UNSIGNED(LOG2(COEFFICIENT_SETS)-1 downto 0); + type PC_VECTOR is array(INTEGER range <>) of STD_LOGIC_VECTOR(FAMILY/3*10+47 downto 0); + subtype A_VECTOR is SFIXED_VECTOR(0 to COEFFICIENT'length-1)(C_HIGH downto C_LOW); + + signal BC : BC_VECTOR(JLOW to TAPS); + signal PC : PC_VECTOR(JLOW to TAPS); + + -- ------------------------------------------------------------------------- + -- Per-stage coefficient ROM: AV_ALL(J)(coeff_set) = coefficient at tap J + -- ALL_AV_INIT uses a local for-loop variable (not a generate variable) so J + -- evaluates correctly for every iteration -> no xsim bug here. + -- ------------------------------------------------------------------------- + function A_VALUE(COEFFICIENT:REAL_MATRIX;J:INTEGER) return A_VECTOR is + variable AV:A_VECTOR; + begin + for K in AV'range loop + AV(K):=TO_SFIXED(COEFFICIENT(COEFFICIENT'low+K)(COEFFICIENT(COEFFICIENT'low)'low+J),C_HIGH,C_LOW); + end loop; + return AV; + end; + + type AV_MATRIX_T is array(INTEGER range <>) of A_VECTOR; + + function ALL_AV_INIT(COEFFICIENT:REAL_MATRIX) return AV_MATRIX_T is + variable result : AV_MATRIX_T(JLOW to TAPS-1); + begin + for J in JLOW to TAPS-1 loop + result(J) := A_VALUE(COEFFICIENT, TAPS-1-J); -- transposed FIR: tap 0 at last DSP + end loop; + return result; + end; + -- Elaboration-time constant: correct coefficient per stage, all coeff sets + constant AV_ALL : AV_MATRIX_T(JLOW to TAPS-1) := ALL_AV_INIT(COEFFICIENT); + + -- ------------------------------------------------------------------------- + -- Static per-stage control arrays (constants, correct at elaboration time) + -- ------------------------------------------------------------------------- + type OPMODE_ARR_T is array(INTEGER range <>) of STD_LOGIC_VECTOR(8 downto 0); + type INMODE_ARR_T is array(INTEGER range <>) of STD_LOGIC_VECTOR(4 downto 0); + + function ALL_OPMODE_INIT return OPMODE_ARR_T is + variable result : OPMODE_ARR_T(JLOW to TAPS-1); + begin + for J in JLOW to TAPS-1 loop + if J = JLOW then + result(J) := 9x"035"; -- first: P = C + A*D (no PCIN cascade in) + elsif J = TAPS-1 then + result(J) := 9x"195"; -- last: P = C + PCIN + A*D (CI passes via C) + else + result(J) := 9x"015"; -- middle: P = PCIN + A*D + end if; + end loop; + return result; + end; + constant OPMODE_CONST : OPMODE_ARR_T(JLOW to TAPS-1) := ALL_OPMODE_INIT; + + function ALL_INMODE_INIT return INMODE_ARR_T is + variable result : INMODE_ARR_T(JLOW to TAPS-1); + begin + for J in JLOW to TAPS-1 loop + if SYMMETRY = "NS" then + result(J) := 5x"07"; -- A1*D (NS: no pre-adder subtraction) + elsif ANTI and not ((SYMMETRY="OS") and FIRST_CHAIN and (J=JLOW)) then + result(J) := 5x"0D"; -- A1*(D-B2) (anti-symmetric) + else + result(J) := 5x"05"; -- A1*(D+B2) (symmetric) + end if; + end loop; + return result; + end; + constant INMODE_CONST : INMODE_ARR_T(JLOW to TAPS-1) := ALL_INMODE_INIT; + + -- ------------------------------------------------------------------------- + -- Architecture-level per-stage signal arrays + -- Declared here (NOT inside for-generate) so each array element has exactly + -- ONE driver -> no xsim signal-sharing / multiple-driver X propagation. + -- ------------------------------------------------------------------------- + signal A_ARR : SFIXED_VECTOR(JLOW to TAPS-1)(C_HIGH downto C_LOW); + signal B_ARR : SFIXED_VECTOR(JLOW to TAPS-1)(BI'high downto BI'low); + signal C_ARR : SFIXED_VECTOR(JLOW to TAPS-1)(P_HIGH downto P_LOW); + signal P_ARR : SFIXED_VECTOR(JLOW to TAPS-1)(P_HIGH downto P_LOW); + signal CE_SIG, CEB1_SIG, CEC_SIG, CED_SIG : STD_LOGIC; + +begin + assert CSA'length=MAX(LOG2(COEFFICIENT'length(1)),1) report "Inconsistent CSA length!" severity warning; + + -- Cascade boundary initial values (tie chain input to zero) + BC(JLOW) <= STD_LOGIC_VECTOR(TO_SIGNED(0,BC(JLOW)'length)); + PC(JLOW) <= STD_LOGIC_VECTOR(TO_SIGNED(0,PC(JLOW)'length)); + + -- Clock enable signals (same for all DSP stages) + CE_SIG <= '1' when VI else '0'; + CEB1_SIG <= '1' when CEBI else '0'; + CEC_SIG <= '1' when CECI else '0'; + CED_SIG <= '1' when CEDI else '0'; + + -- A_ARR: select per-stage coefficient from the elaboration-time constant AV_ALL. + -- Single process owns all elements; no for-generate concurrent-assignment bug. + ia: if CSA'length=1 generate + -- Combinatorial select (single coeff set or runtime-selected with 1-bit CSA). + -- Explicit sensitivity list instead of process(all): xsim 2025.2 may not + -- auto-detect SFIXED/UNSIGNED ports read through composite array indexing. + process(CSA) begin + for J in JLOW to TAPS-1 loop + A_ARR(J) <= AV_ALL(J)(TO_INTEGER(CSA)); + end loop; + end process; + else generate + -- Registered select: pipeline CSA through one CLK stage + process(CLK) begin + if rising_edge(CLK) then + for J in JLOW to TAPS-1 loop + A_ARR(J) <= AV_ALL(J)(TO_INTEGER(CSA)); + end loop; + end if; + end process; + end generate; + + -- B_ARR: first stage and all NS stages get BI; remainder get 0. + -- Explicit sensitivity list: xsim may not auto-detect BI (SFIXED port) via process(all). + gen_b: process(BI) begin + for J in JLOW to TAPS-1 loop + if (J = JLOW) or (SYMMETRY = "NS") then + B_ARR(J) <= BI; + else + B_ARR(J) <= (others => '0'); + end if; + end loop; + end process; + + -- C_ARR: rounding constant at first stage, RESIZE(CI) at last, 0 elsewhere. + -- Explicit sensitivity list: xsim may not auto-detect CI (SFIXED port) via process(all), + -- which would cause C_ARR(TAPS-1) to be stuck at 0, breaking the inter-chain cascade. + gen_c: process(CI) begin + for J in JLOW to TAPS-1 loop + if ROUNDING and (J = JLOW) then + C_ARR(J) <= TO_SFIXED(2.0**(P_LOW+O'low-1), P_HIGH, P_LOW); + elsif J = TAPS-1 then + C_ARR(J) <= RESIZE(CI, P_HIGH, P_LOW); + else + C_ARR(J) <= TO_SFIXED(0.0, P_HIGH, P_LOW); + end if; + end loop; + end process; + + -- Output: last DSP stage P register + O <= RESIZE(P_ARR(TAPS-1), O); + + -- ------------------------------------------------------------------------- + -- DSP cascade for-generate. + -- ONLY entity instantiations appear here; xsim evaluates entity port maps + -- correctly for every for-generate iteration so J-indexed signal accesses + -- (A_ARR(J), B_ARR(J), BC(J), PC(J), etc.) connect to the right elements. + -- Generic map expressions using J (BREG, B_INPUT, Y offset) also evaluate + -- correctly since generics are set at elaboration time. + -- ------------------------------------------------------------------------- + lj: for J in JLOW to TAPS-1 generate + jk: entity work.DSPx8_WRAPPER + generic map(X => OX, + Y => OY+J-JLOW, + FAMILY => FAMILY, + BREG => BREG(SYMMETRY,ANTI,J), + BCASCREG => BREG(SYMMETRY,ANTI,J), + B_INPUT => B_INPUT(J), + PREADDINSEL => "B", + AMULTSEL => "A", + BMULTSEL => "AD") + port map(CLK => CLK, + CEB1 => CEB1_SIG, + CEB2 => CE_SIG, + CEC => CEC_SIG, + CED => CED_SIG, + A => A_ARR(J), + B => B_ARR(J), + C => C_ARR(J), + D => DI, + BCIN => BC(J), + INMODE => INMODE_CONST(J), + OPMODE => OPMODE_CONST(J), + PCIN => PC(J), + BCOUT => BC(J+1), + PCOUT => PC(J+1), + P => P_ARR(J)); + end generate lj; + + -- DO: forward-data pipeline register (used when cascading chain sections) + process(CLK) + begin + if rising_edge(CLK) then + DO <= DI; + end if; + end process; + + -- BO: reverse-data shift register for cascading symmetric-filter sections + db: entity work.SDELAY generic map(SIZE => 2*TAPS+BREG(SYMMETRY,ANTI,0)-1, + DDR => DDR) + port map(CLK => CLK, + CLKH => CLKH, + I => BI, + O => BO); + + -- Data Valid Delay Line + bd: entity work.BDELAY generic map(SIZE => LATENCY(SYMMETRY,TAPS), + DDR => DDR) + port map(CLK => CLK, + CLKH => CLKH, + I => VI, + O => VO); + +end TEST; diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/TYPES_PKG.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/TYPES_PKG.vhd deleted file mode 100755 index c8712fe76..000000000 --- a/Examples/HDL/Digital_Filtering/SSR_FIR/TYPES_PKG.vhd +++ /dev/null @@ -1,776 +0,0 @@ --- Copyright (C) 2024, Advanced Micro Devices, Inc. - -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; -use ieee.math_real.all; -use ieee.math_complex.all; - -package TYPES_PKG is --- constant I_SIZE:INTEGER:=16; --- constant C_SIZE:INTEGER:=16; --- constant O_SIZE:INTEGER:=36; --- type BOOLEAN_VECTOR is array(NATURAL range <>) of BOOLEAN; --- type INTEGER_VECTOR is array(INTEGER range <>) of INTEGER; --- type REAL_VECTOR is array(INTEGER range <>) of REAL; --- type COMPLEX_VECTOR is array(INTEGER range <>) of COMPLEX; --- type I_VECTOR is array(INTEGER range <>) of STD_LOGIC_VECTOR(I_SIZE-1 downto 0); --- type O_VECTOR is array(INTEGER range <>) of STD_LOGIC_VECTOR(O_SIZE-1 downto 0); --- type SI_VECTOR is array(INTEGER range <>) of SIGNED(I_SIZE-1 downto 0); --- type SO_VECTOR is array(INTEGER range <>) of SIGNED(O_SIZE-1 downto 0); --- type SI_MATRIX is array(INTEGER range <>,INTEGER range <>) of SIGNED(I_SIZE-1 downto 0); - - function LOG2(N:INTEGER) return INTEGER; - --- type REAL_VECTOR is array(INTEGER range <>) of REAL; - type COMPLEX_VECTOR is array(INTEGER range <>) of COMPLEX; - - type SFIXED is array(INTEGER range <>) of STD_LOGIC; - type SFIXED_VECTOR is array(INTEGER range <>,INTEGER range <>) of STD_LOGIC; - type SFIXED_MATRIX is array(INTEGER range <>,INTEGER range <>,INTEGER range <>) of STD_LOGIC; - - type CFIXED is array(INTEGER range <>) of STD_LOGIC; -- CFIXED'high must be odd and CFIXED'low must be even - type CFIXED_VECTOR is array(INTEGER range <>,INTEGER range <>) of STD_LOGIC; -- CFIXED'high(2) must be odd and CFIXED'low(2) must be even - type CFIXED_MATRIX is array(INTEGER range <>,INTEGER range <>,INTEGER range <>) of STD_LOGIC; -- CFIXED'high(3) must be odd and CFIXED'low(3) must be even - - function MIN(A,B:INTEGER) return INTEGER; - function MIN(A,B,C:INTEGER) return INTEGER; - function MIN(A,B,C,D:INTEGER) return INTEGER; - function MAX(A,B:INTEGER) return INTEGER; - function MAX(A,B,C:INTEGER) return INTEGER; - function MAX(A,B,C,D:INTEGER) return INTEGER; - function MED(A,B,C:INTEGER) return INTEGER; - function "+"(X,Y:SFIXED) return SFIXED; -- full precision add with SFIXED(MAX(X'high,Y'high)+1 downto MIN(X'low,Y'low)) result - function "-"(X,Y:SFIXED) return SFIXED; -- full precision subtract with SFIXED(MAX(X'high,Y'high)+1 downto MIN(X'low,Y'low)) result - function "-"(X:SFIXED) return SFIXED; -- full precision negate with SFIXED(X'high+1 downto X'low) result - function "*"(X,Y:SFIXED) return SFIXED; -- full precision multiply with SFIXED(X'high+Y'high+1 downto X'low+Y'low) result - function "*"(X:SFIXED;Y:STD_LOGIC) return SFIXED; -- multiply by 0 or 1 with SFIXED(X'high downto X'low) result - function RESIZE(X:SFIXED;H,L:INTEGER) return SFIXED; -- resizes X and returns SFIXED(H downto L) - function RESIZE(X:SFIXED;HL:SFIXED) return SFIXED; -- resizes X to match HL and returns SFIXED(HL'high downto HL'low) - function SHIFT_RIGHT(X:SFIXED;N:INTEGER) return SFIXED; -- returns SFIXED(X'high-N downto X'low-N) result - function SHIFT_LEFT(X:SFIXED;N:INTEGER) return SFIXED; -- returns SFIXED(X'high+N downto X'low+N) result - function TO_SFIXED(R:REAL;H,L:INTEGER) return SFIXED; -- returns SFIXED(H downto L) result - function TO_SFIXED(R:REAL;HL:SFIXED) return SFIXED; -- returns SFIXED(HL'high downto HL'low) result - function TO_SFIXED(I:SIGNED;H,L:INTEGER;SHIFT:INTEGER:=0) return SFIXED; -- convert SIGNED to SFIXED(H downto L) and resize - function TO_SFIXED(I:SIGNED;X:SFIXED;SHIFT:INTEGER:=0) return SFIXED; -- convert SIGNED to SFIXED(X'high downto X'low) and resize - function TO_SIGNED(I:SFIXED;X:SFIXED) return SIGNED; -- resize I to X and convert to SIGNED(I'length-1 downto 0), returns SIGNED(SHIFT_RIGHT(RESIZE(I,X),X'low)) - function TO_REAL(S:SFIXED) return REAL; -- returns REAL result - function TO_01(X:SFIXED) return SFIXED; -- get rid of Xes --- all SET calls targetting the same signal must be located in a single process! - function GET(A:SFIXED_VECTOR;I:INTEGER) return SFIXED; -- A(I) - function GET(A:SFIXED_MATRIX;I,J:INTEGER) return SFIXED; -- A(I,J) - function GET(A:SFIXED_MATRIX;I:INTEGER) return SFIXED_VECTOR; -- A(I) - procedure SET(signal A:inout SFIXED_VECTOR;constant I:INTEGER;signal V:SFIXED); -- A(I)<=V; - procedure SET(signal A:inout SFIXED_MATRIX;constant I,J:INTEGER;signal V:SFIXED); -- A(I,J)<=V; - procedure SET(signal A:inout SFIXED_MATRIX;constant I:INTEGER;signal V:SFIXED_VECTOR); -- A(I)<=V; - - function RE(A:CFIXED) return SFIXED; -- A.RE - function IM(A:CFIXED) return SFIXED; -- A.IM - procedure RE(signal A:inout CFIXED;constant V:SFIXED); -- A.RE<=RESIZE(V,A.RE); - procedure IM(signal A:inout CFIXED;constant V:SFIXED); -- A.IM<=RESIZE(V,A.IM); - function "+"(X,Y:CFIXED) return CFIXED; -- full precision add with CFIXED(MAX(X'high,Y'high)+2 downto MIN(X'low,Y'low)) result - function "-"(X,Y:CFIXED) return CFIXED; -- full precision subtract with CFIXED(MAX(X'high,Y'high)+2 downto MIN(X'low,Y'low)) result - function "*"(X,Y:CFIXED) return CFIXED; -- full precision multiply with CFIXED(X'high+Y'high+2 downto X'low+Y'low) result - function "*"(X:CFIXED;Y:SFIXED) return CFIXED; -- full precision multiply with CFIXED(X'high+Y'high downto X'low+Y'low) result - function "*"(X:SFIXED;Y:CFIXED) return CFIXED; - function RESIZE(X:CFIXED;H,L:INTEGER) return CFIXED; -- resizes X and returns CFIXED(RE(H downto L),IM(H downto L)) - function RESIZE(X:CFIXED;HL:CFIXED) return CFIXED; -- resizes X to match HL and returns CFIXED(RE(HL.RE'high downto HL.RE'low),IM(RE(HL.IM'high downto HL.IM'low)) - function PLUS_i_TIMES(X:CFIXED) return CFIXED; -- returns CFIXED(X'high+2 downto X'low) result - function "-"(X:CFIXED) return CFIXED; -- full precision negate with CFIXED(X'high+2 downto X'low) result - function MINUS_i_TIMES(X:CFIXED) return CFIXED; -- returns CFIXED(X'high+2 downto X'low) result - function X_PLUS_i_TIMES_Y(X,Y:CFIXED;RND:CFIXED) return CFIXED; -- returns CFIXED(MAX(X'high,Y'high)+2 downto MIN(X'low,Y'low)) result - function X_MINUS_i_TIMES_Y(X,Y:CFIXED;RND:CFIXED) return CFIXED; -- returns CFIXED(MAX(X'high,Y'high)+2 downto MIN(X'low,Y'low)) result - function SWAP(X:CFIXED) return CFIXED; -- returns CFIXED(X'high downto X'low) result - function CONJ(X:CFIXED) return CFIXED; -- returns CFIXED(X'high+2 downto X'low) result - function SHIFT_RIGHT(X:CFIXED;N:INTEGER) return CFIXED; -- returns CFIXED(X'high-N downto X'low-N) result - function SHIFT_LEFT(X:CFIXED;N:INTEGER) return CFIXED; -- returns CFIXED(X'high+N downto X'low+N) result - function TO_CFIXED(R,I:REAL;H,L:INTEGER) return CFIXED; -- returns CFIXED(RE(H downto L),IM(H downto L)) result - function TO_CFIXED(R,I:REAL;HL:CFIXED) return CFIXED; -- returns CFIXED(RE(HL.RE'high downto HL.RE'low),IM(RE(HL.IM'high downto HL.IM'low)) result - function TO_CFIXED(C:COMPLEX;HL:CFIXED) return CFIXED; -- returns CFIXED(RE(HL.RE'high downto HL.RE'low),IM(RE(HL.IM'high downto HL.IM'low)) result - function TO_CFIXED(R,I:SFIXED) return CFIXED; -- returns CFIXED(2*MAX(R'high,I'high)+1 downto 2*MIN(R'low,I'low)) result - function TO_COMPLEX(C:CFIXED) return COMPLEX; -- returns COMPLEX result -/* - function TO_CFIXED_VECTOR(C:COMPLEX_VECTOR;HL:CFIXED) return CFIXED_VECTOR; -- returns CFIXED_VECTOR(RE(HL.RE'high downto HL.RE'low),IM(RE(HL.IM'high downto HL.IM'low)) result - function TO_COMPLEX_VECTOR(C:CFIXED_VECTOR) return COMPLEX_VECTOR; -- returns COMPLEX_VECTOR result -*/ - function "*"(R:REAL;C:COMPLEX_VECTOR) return COMPLEX_VECTOR; -- returns R*C - function ZERO(U:UNSIGNED) return UNSIGNED; -- returns 0 with the same range as U - function ZERO(S:SFIXED) return SFIXED; -- returns 0 with the same range as S - function ZERO(C:CFIXED) return CFIXED; -- returns 0 with the same range as C - function ZERO(SV:SFIXED_VECTOR) return SFIXED_VECTOR; -- returns 0 with the same range as SV - function ZERO(CV:CFIXED_VECTOR) return CFIXED_VECTOR; -- returns 0 with the same range as CV - - function GET(A:CFIXED_VECTOR;I:INTEGER) return CFIXED; -- A(I) - function GET(A:CFIXED_MATRIX;I,J:INTEGER) return CFIXED; -- A(I,J) - function GET(A:CFIXED_MATRIX;I:INTEGER) return CFIXED_VECTOR; -- A(I) - procedure SET(signal A:inout CFIXED_VECTOR;constant I:INTEGER;signal V:CFIXED); -- A(I)<=V; - procedure SET(signal A:inout CFIXED_MATRIX;constant I,J:INTEGER;signal V:CFIXED); -- A(I,J)<=V; - procedure SET(signal A:inout CFIXED_MATRIX;constant I:INTEGER;signal V:CFIXED_VECTOR); -- A(I)<=V; -end TYPES_PKG; - -package body TYPES_PKG is - function LOG2(N:INTEGER) return INTEGER is - variable TEMP:INTEGER; - variable RESULT:INTEGER; - begin - TEMP:=N; - RESULT:=0; - while TEMP>1 loop - RESULT:=RESULT+1; - TEMP:=(TEMP+1)/2; - end loop; - return RESULT; - end; - - function MIN(A,B:INTEGER) return INTEGER is - begin - if AB then - return A; - else - return B; - end if; - end; - - function MAX(A,B,C:INTEGER) return INTEGER is - begin - return MAX(MAX(A,B),C); - end; - - function MAX(A,B,C,D:INTEGER) return INTEGER is - begin - return MAX(MAX(A,B),MAX(C,D)); - end; - - function MED(A,B,C:INTEGER) return INTEGER is - begin - return MAX(MIN(MAX(A,B),C),MIN(A,B)); - end; - - function "+"(X,Y:SFIXED) return SFIXED is - variable SX,SY,SR:SIGNED(MAX(X'high,Y'high)+1-MIN(X'low,Y'low) downto 0); - variable R:SFIXED(MAX(X'high,Y'high)+1 downto MIN(X'low,Y'low)); - begin - for K in SX'range loop - if KX'high-R'low then - SX(K):=X(X'high); -- sign extend X MSBs - else - SX(K):=X(R'low+K); - end if; - end loop; - for K in SY'range loop - if KY'high-R'low then - SY(K):=Y(Y'high); -- sign extend Y MSBs - else - SY(K):=Y(R'low+K); - end if; - end loop; - SR:=SX+SY; -- SIGNED addition - for K in SR'range loop - R(R'low+K):=SR(K); - end loop; - return R; - end; - - function "-"(X,Y:SFIXED) return SFIXED is - variable SX,SY,SR:SIGNED(MAX(X'high,Y'high)+1-MIN(X'low,Y'low) downto 0); - variable R:SFIXED(MAX(X'high,Y'high)+1 downto MIN(X'low,Y'low)); - begin - for K in SX'range loop - if KX'high-R'low then - SX(K):=X(X'high); -- sign extend X MSBs - else - SX(K):=X(R'low+K); - end if; - end loop; - for K in SY'range loop - if KY'high-R'low then - SY(K):=Y(Y'high); -- sign extend Y MSBs - else - SY(K):=Y(R'low+K); - end if; - end loop; - SR:=SX-SY; -- SIGNED subtraction - for K in SR'range loop - R(R'low+K):=SR(K); - end loop; - return R; - end; - - function "-"(X:SFIXED) return SFIXED is - variable SX:SIGNED(X'high-X'low downto 0); - variable SR:SIGNED(X'high-X'low+1 downto 0); - variable R:SFIXED(X'high+1 downto X'low); - begin - for K in SX'range loop - SX(K):=X(X'low+K); - end loop; - SR:=-RESIZE(SX,SR'length); -- SIGNED negation - for K in SR'range loop - R(R'low+K):=SR(K); - end loop; - return R; - end; - - function "*"(X,Y:SFIXED) return SFIXED is - variable SX:SIGNED(X'high-X'low downto 0); - variable SY:SIGNED(Y'high-Y'low downto 0); - variable SR:SIGNED(SX'high+SY'high+1 downto 0); - variable R:SFIXED(X'high+Y'high+1 downto X'low+Y'low); - begin - for K in SX'range loop - SX(K):=X(X'low+K); - end loop; - for K in SY'range loop - SY(K):=Y(Y'low+K); - end loop; - SR:=SX*SY; -- SIGNED multiplication - for K in SR'range loop - R(R'low+K):=SR(K); - end loop; - return R; - end; - - function "*"(X:SFIXED;Y:STD_LOGIC) return SFIXED is - begin - if Y='1' then - return X; - else - return TO_SFIXED(0.0,X); - end if; - end; - - function RESIZE(X:SFIXED;H,L:INTEGER) return SFIXED is - variable R:SFIXED(H downto L); - begin - for K in R'range loop - if KX'high then - R(K):=X(X'high); -- sign extend X MSBs - else - R(K):=X(K); - end if; - end loop; - return R; - end; - - function RESIZE(X:SFIXED;HL:SFIXED) return SFIXED is - begin - return RESIZE(X,HL'high,HL'low); - end; - - function SHIFT_RIGHT(X:SFIXED;N:INTEGER) return SFIXED is - variable R:SFIXED(X'high-N downto X'low-N); - begin - for K in R'range loop - R(K):=X(K+N); - end loop; - return R; - end; - - function SHIFT_LEFT(X:SFIXED;N:INTEGER) return SFIXED is - variable R:SFIXED(X'high+N downto X'low+N); - begin - for K in R'range loop - R(K):=X(K-N); - end loop; - return R; - end; - - function TO_SFIXED(R:REAL;H,L:INTEGER) return SFIXED is - variable RR:REAL; - variable V:SFIXED(H downto L); - begin - assert (R<2.0**H) and (R>=-2.0**H) report "TO_SFIXED vector truncation!" severity warning; - if R<0.0 then - V(V'high):='1'; - RR:=R+2.0**V'high; - else - V(V'high):='0'; - RR:=R; - end if; - for K in V'high-1 downto V'low loop - if RR>=2.0**K then - V(K):='1'; - RR:=RR-2.0**K; - else - V(K):='0'; - end if; - end loop; - return V; - end; - - function TO_SFIXED(R:REAL;HL:SFIXED) return SFIXED is - begin - return TO_SFIXED(R,HL'high,HL'low); - end; - - function TO_SFIXED(I:SIGNED;H,L:INTEGER;SHIFT:INTEGER:=0) return SFIXED is - variable O:SFIXED(H downto L); - begin - for K in O'range loop - if KV'high then - A(I,K)<=V(V'high); -- sign extend V MSBs - else - A(I,K)<=V(K); - end if; - end loop; - end; - - procedure SET(signal A:inout SFIXED_MATRIX;constant I,J:INTEGER;signal V:SFIXED) is - begin - for K in A'range(3) loop - if KV'high then - A(I,J,K)<=V(V'high); -- sign extend V MSBs - else - A(I,J,K)<=V(K); - end if; - end loop; - end; - - procedure SET(signal A:inout SFIXED_MATRIX;constant I:INTEGER;signal V:SFIXED_VECTOR) is - begin - for J in V'range(1) loop - for K in A'range(3) loop - if KV'high(2) then - A(I,J,K)<=V(J,V'high(2)); -- sign extend V(J) MSBs - else - A(I,J,K)<=V(J,K); - end if; - end loop; - end loop; - end; - - function RE(A:CFIXED) return SFIXED is - variable R:SFIXED(A'high/2 downto A'low/2); - begin - for K in R'range loop - R(K):=A(2*K); - end loop; - return R; - end; - - function IM(A:CFIXED) return SFIXED is - variable R:SFIXED(A'high/2 downto A'low/2); - begin - for K in R'range loop - R(K):=A(2*K+1); - end loop; - return R; - end; - - procedure RE(signal A:inout CFIXED;constant V:SFIXED) is - begin - for K in A'low/2 to A'high/2 loop - if KV'high then - A(2*K)<=V(V'high); -- sign extend V MSBs - else - A(2*K)<=V(K); - end if; - end loop; - end; - - procedure IM(signal A:inout CFIXED;constant V:SFIXED) is - begin - for K in A'low/2 to A'high/2 loop - if KV'high then - A(2*K+1)<=V(V'high); -- sign extend V MSBs - else - A(2*K+1)<=V(K); - end if; - end loop; - end; - - function "+"(X,Y:CFIXED) return CFIXED is - begin - return TO_CFIXED(RE(X)+RE(Y),IM(X)+IM(Y)); - end; - - function "-"(X,Y:CFIXED) return CFIXED is - begin - return TO_CFIXED(RE(X)-RE(Y),IM(X)-IM(Y)); - end; - - function "*"(X,Y:CFIXED) return CFIXED is - begin - return TO_CFIXED(RE(X)*RE(Y)-IM(X)*IM(Y),RE(X)*IM(Y)+IM(X)*RE(Y)); - end; - - function "*"(X:CFIXED;Y:SFIXED) return CFIXED is - begin - return TO_CFIXED(RE(X)*Y,IM(X)*Y); - end; - - function "*"(X:SFIXED;Y:CFIXED) return CFIXED is - begin - return TO_CFIXED(X*RE(Y),X*IM(Y)); - end; - - function RESIZE(X:CFIXED;H,L:INTEGER) return CFIXED is - begin - return TO_CFIXED(RESIZE(RE(X),H,L),RESIZE(IM(X),H,L)); - end; - - function RESIZE(X:CFIXED;HL:CFIXED) return CFIXED is - begin - return TO_CFIXED(RESIZE(RE(X),RE(HL)),RESIZE(IM(X),IM(HL))); - end; - - function PLUS_i_TIMES(X:CFIXED) return CFIXED is - begin - return TO_CFIXED(-IM(X),RE(X)); - end; - - function "-"(X:CFIXED) return CFIXED is - begin - return TO_CFIXED(-RE(X),-IM(X)); - end; - - function MINUS_i_TIMES(X:CFIXED) return CFIXED is - begin - return TO_CFIXED(IM(X),-RE(X)); - end; - - function X_PLUS_i_TIMES_Y(X,Y:CFIXED;RND:CFIXED) return CFIXED is - begin - return TO_CFIXED(RE(X)-IM(Y)+RE(RND),IM(X)+RE(Y)+IM(RND)); - end; - - function X_MINUS_i_TIMES_Y(X,Y:CFIXED;RND:CFIXED) return CFIXED is - begin - return TO_CFIXED(RE(X)+IM(Y)+RE(RND),IM(X)-RE(Y)+IM(RND)); - end; - - function SWAP(X:CFIXED) return CFIXED is - begin - return TO_CFIXED(IM(X),RE(X)); - end; - - function CONJ(X:CFIXED) return CFIXED is - begin - return TO_CFIXED(RE(X),-IM(X)); - end; - - function SHIFT_RIGHT(X:CFIXED;N:INTEGER) return CFIXED is - begin - return TO_CFIXED(SHIFT_RIGHT(RE(X),N),SHIFT_RIGHT(IM(X),N)); - end; - - function SHIFT_LEFT(X:CFIXED;N:INTEGER) return CFIXED is - begin - return TO_CFIXED(SHIFT_LEFT(RE(X),N),SHIFT_LEFT(IM(X),N)); - end; - - function TO_CFIXED(R,I:REAL;H,L:INTEGER) return CFIXED is - begin - return TO_CFIXED(TO_SFIXED(R,H,L),TO_SFIXED(I,H,L)); - end; - - function TO_CFIXED(R,I:REAL;HL:CFIXED) return CFIXED is - begin - return TO_CFIXED(TO_SFIXED(R,HL'high/2,HL'low/2),TO_SFIXED(I,HL'high/2,HL'low/2)); - end; - - function TO_CFIXED(C:COMPLEX;HL:CFIXED) return CFIXED is - begin - return TO_CFIXED(C.RE,C.IM,HL); - end; - - function TO_CFIXED(R,I:SFIXED) return CFIXED is - constant H:INTEGER:=MAX(R'high,I'high); - constant L:INTEGER:=MIN(R'low,I'low); - variable C:CFIXED(2*H+1 downto 2*L); - begin - for K in C'low/2 to C'high/2 loop - if KR'high then - C(2*K):=R(R'high); -- sign extend R MSBs - else - C(2*K):=R(K); - end if; - end loop; - for K in C'low/2 to C'high/2 loop - if KI'high then - C(2*K+1):=I(I'high); -- sign extend I MSBs - else - C(2*K+1):=I(K); - end if; - end loop; - return C; - end; - - function TO_COMPLEX(C:CFIXED) return COMPLEX is - variable R:COMPLEX; - begin - R.RE:=TO_REAL(RE(C)); - R.IM:=TO_REAL(IM(C)); - return R; - end; -/* - function TO_CFIXED_VECTOR(C:COMPLEX_VECTOR;HL:CFIXED) return CFIXED_VECTOR is - variable R:CFIXED_VECTOR(C'range,HL'range); - begin - for K in C'range loop - R(K):=TO_CFIXED(C(K),HL); - end loop; - return R; - end; - - function TO_COMPLEX_VECTOR(C:CFIXED_VECTOR) return COMPLEX_VECTOR is - variable R:COMPLEX_VECTOR(C'range); - begin - for K in C'range loop - R(K):=TO_COMPLEX(C(K)); - end loop; - return R; - end; -*/ - function "*"(R:REAL;C:COMPLEX_VECTOR) return COMPLEX_VECTOR is - variable X:COMPLEX_VECTOR(C'range); - begin - for K in C'range loop - X(K):=R*C(K); - end loop; - return X; - end; - - function ZERO(U:UNSIGNED) return UNSIGNED is -- returns 0 with the same range as S - begin - return TO_UNSIGNED(0,U'length); - end; - - function ZERO(S:SFIXED) return SFIXED is -- returns 0 with the same range as S - begin - return TO_SFIXED(0.0,S); - end; - - function ZERO(C:CFIXED) return CFIXED is -- returns 0 with the same range as C - begin - return TO_CFIXED(0.0,0.0,C); - end; - - function ZERO(SV:SFIXED_VECTOR) return SFIXED_VECTOR is -- returns 0 with the same range as SV - variable RESULT:SFIXED_VECTOR(SV'range(1),SV'range(2)); - begin - RESULT:=(others=>(others=>'0')); - return RESULT; - end; - - function ZERO(CV:CFIXED_VECTOR) return CFIXED_VECTOR is -- returns 0 with the same range as CV - variable RESULT:CFIXED_VECTOR(CV'range(1),CV'range(2)); - begin - RESULT:=(others=>(others=>'0')); - return RESULT; - end; - - function GET(A:CFIXED_VECTOR;I:INTEGER) return CFIXED is - variable R:CFIXED(A'range(2)); - begin - for K in R'range loop - R(K):=A(I,K); - end loop; - return R; - end; - - function GET(A:CFIXED_MATRIX;I,J:INTEGER) return CFIXED is - variable R:CFIXED(A'range(3)); - begin - for K in R'range loop - R(K):=A(I,J,K); - end loop; - return R; - end; - - function GET(A:CFIXED_MATRIX;I:INTEGER) return CFIXED_VECTOR is - variable R:CFIXED_VECTOR(A'range(1),A'range(3)); - begin - for J in R'range(1) loop - for K in R'range(2) loop - R(J,K):=A(I,J,K); - end loop; - end loop; - return R; - end; - - procedure SET(signal A:inout CFIXED_VECTOR;constant I:INTEGER;signal V:CFIXED) is - begin - for K in A'range(2) loop - if KV'high then - A(I,K)<=V(V'high+K mod 2-1); -- sign extend V.RE and V.IM MSBs - else - A(I,K)<=V(K); - end if; - end loop; - end; - - procedure SET(signal A:inout CFIXED_MATRIX;constant I,J:INTEGER;signal V:CFIXED) is - begin - for K in A'range(3) loop - if KV'high then - A(I,J,K)<=V(V'high+K mod 2-1); -- sign extend V.RE and V.IM MSBs - else - A(I,J,K)<=V(K); - end if; - end loop; - end; - - procedure SET(signal A:inout CFIXED_MATRIX;constant I:INTEGER;signal V:CFIXED_VECTOR) is - begin - for J in V'range(1) loop - for K in A'range(3) loop - if KV'high(2) then - A(I,J,K)<=V(J,V'high(2)+K mod 2-1); -- sign extend V.RE and V.IM MSBs - else - A(I,J,K)<=V(J,K); - end if; - end loop; - end loop; - end; -end TYPES_PKG; \ No newline at end of file diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_SSR_FIR.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_SSR_FIR.vhd index 52d262162..23d2a2648 100755 --- a/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_SSR_FIR.vhd +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_SSR_FIR.vhd @@ -1,4 +1,11 @@ --- Copyright (C) 2024, Advanced Micro Devices, Inc. +-- Copyright (C) 2026, Advanced Micro Devices, Inc. +-- +-- Vitis Model Composer HDL Black Box wrapper for the Direct-Form SSR FIR +-- (SSR_FIR.vhd). This wrapper adapts the System Generator / Model Composer +-- STD_LOGIC_VECTOR black-box interface to the SFIXED_VECTOR interface of the +-- VHDL-2008 SSR_FIR core, builds the REAL_MATRIX coefficient set from the +-- string generic passed in by the config script, and ties the single +-- coefficient-set address CSA to 0. library IEEE; use IEEE.STD_LOGIC_1164.ALL; @@ -8,18 +15,18 @@ library STD; use STD.textio.all; use STD.env.all; -use work.TYPES_PKG.all; +use work.FIXED_PKG.all; -- VHDL-2008 IEEE standard SFIXED type and functions +use work.CFIXED_PKG.all; -- SFIXED_VECTOR, REAL_VECTOR, REAL_MATRIX and helpers library UNISIM; use UNISIM.VComponents.all; entity WRAPPER_SSR_FIR is - generic(OX,OY:INTEGER:=-1;---2147483648; -- Coordinates of the lower left corner DSPx8, use -2147483648 if you do not want floorplanning + generic(OX,OY:INTEGER:=-1; -- Coordinates of the lower left corner DSPx8, use -1 if you do not want floorplanning FAMILY:INTEGER:=3; -- use 1 for 7-series, 2 for US/US+ and 3 for Versal - DDR:BOOLEAN:=FALSE; -- use DDR=TRUE implementation only for Versal clock rates over 795MHz/824MHz/872MHz in speed grades -1/-2/-3 + DDR:BOOLEAN:=FALSE; -- use DDR=TRUE implementation only for Versal clock rates over 795MHz/824MHz/872MHz in speed grades -1/-2/-3 SSR:INTEGER:=4; TAPS:INTEGER:=36; --- COEFFICIENT:REAL_VECTOR(0 to TAPS-1):=(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0); C:STRING:="1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0"; I_HIGH:INTEGER:=7; I_LOW:INTEGER:=-8; @@ -27,7 +34,7 @@ entity WRAPPER_SSR_FIR is C_LOW:INTEGER:=-17; O_HIGH:INTEGER:=7; O_LOW:INTEGER:=-16; - ROUNDING:BOOLEAN:=FALSE; -- use TRUE for rounding the output result + ROUNDING:BOOLEAN:=FALSE; -- use TRUE for rounding the output result SYMMETRY:STRING:="ES"); -- Filter Symmetry, use "ES" for Even-Symmetric, "OS" for Odd-Symmetric and "NS" for Non-Symmetric port(CLK:in STD_LOGIC; CE:in STD_LOGIC:='1'; -- not used, for SysGen only @@ -38,9 +45,9 @@ entity WRAPPER_SSR_FIR is end WRAPPER_SSR_FIR; architecture WRAPPER of WRAPPER_SSR_FIR is - signal II:SFIXED_VECTOR(0 to SSR-1,I_HIGH downto I_LOW); + signal II:SFIXED_VECTOR(0 to SSR-1)(I_HIGH downto I_LOW); signal VII:BOOLEAN; - signal OO:SFIXED_VECTOR(0 to SSR-1,O_HIGH downto O_LOW); + signal OO:SFIXED_VECTOR(0 to SSR-1)(O_HIGH downto O_LOW); signal VOO:BOOLEAN; function REAL_value(S:STRING) return REAL is variable R,F:REAL; @@ -116,32 +123,32 @@ architecture WRAPPER of WRAPPER_SSR_FIR is return R*10.0**E; end if; end; - function STRING2REAL(S:STRING;N:INTEGER) return REAL_VECTOR is - variable R:REAL_VECTOR(1 to N); - variable P,C:INTEGER; + -- Parse a whitespace/comma separated coefficient string into the first N + -- coefficients, returned as a single-row REAL_MATRIX (one coefficient set). + function STRING2MATRIX(S:STRING;N:INTEGER) return REAL_MATRIX is + variable R:REAL_MATRIX(0 to 0)(0 to N-1); + variable P,CNT:INTEGER; begin P:=S'low; if (S(P)='(') or (S(P)='[') then P:=P+1; end if; - for K in R'range loop + for K in R(0)'range loop while (P0 --- REAL'value() not supported in Vivado Synthesis --- then R(K):=REAL'value(S(P to P+C-1)); - then R(K):=REAL_value(S(P to P+C-1)); - else R(K):=0.0; + if CNT>0 +-- REAL'value() not supported in Vivado Synthesis, use REAL_value instead + then R(0)(K):=REAL_value(S(P to P+CNT-1)); + else R(0)(K):=0.0; end if; - P:=P+C; + P:=P+CNT; end loop; return R; end; --- constant COEFFICIENT:REAL_VECTOR(0 to TAPS-1):=(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0); - constant COEFFICIENT:REAL_VECTOR(0 to TAPS-1):=STRING2REAL(C,TAPS); + constant COEFFICIENT:REAL_MATRIX(0 to 0)(0 to TAPS-1):=STRING2MATRIX(C,TAPS); signal CLK1,CLKH:STD_LOGIC; begin i1:if DDR generate @@ -156,9 +163,9 @@ begin CLK1<=CLK; CLKH<='0'; end generate; - ij:for J in II'range(1) generate - ik:for K in II'range(2) generate - II(J,K)<=I(J*II'length(2)+K-II'low(2)); + ij:for J in 0 to SSR-1 generate + ik:for K in I_HIGH downto I_LOW generate + II(J)(K)<=I(J*(I_HIGH-I_LOW+1)+K-I_LOW); end generate; end generate; VII<=VI='1'; @@ -170,17 +177,19 @@ begin C_HIGH=>C_HIGH, C_LOW=>C_LOW, ROUNDING=>ROUNDING, + ANTI=>FALSE, SYMMETRY=>SYMMETRY) port map (CLK=>CLK1, CLKH=>CLKH, I=>II, VI=>VII, + CSA=>"0", O=>OO, VO=>VOO); - oj:for J in OO'range(1) generate - ok:for K in OO'range(2) generate - O(J*OO'length(2)+K-OO'low(2))<=OO(J,K); + oj:for J in 0 to SSR-1 generate + ok:for K in O_HIGH downto O_LOW generate + O(J*(O_HIGH-O_LOW+1)+K-O_LOW)<=OO(J)(K); end generate; end generate; VO<='1' when VOO else '0'; -end WRAPPER; \ No newline at end of file +end WRAPPER; diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_SSR_FIR_config.m b/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_SSR_FIR_config.m index 0e09885ca..a92eddd71 100755 --- a/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_SSR_FIR_config.m +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_SSR_FIR_config.m @@ -157,7 +157,8 @@ function WRAPPER_SSR_FIR_config(this_block) % | this_block.addFile('a.vhd'); % |------------- - this_block.addFile('TYPES_PKG.vhd'); + this_block.addFile('fixed_pkg.vhd'); + this_block.addFile('cfixed_pkg.vhd'); this_block.addFile('BDELAY.vhd'); this_block.addFile('SDELAY.vhd'); this_block.addFile('DSPx8_WRAPPER.vhd'); diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_TRANSPOSE_SSR_FIR.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_TRANSPOSE_SSR_FIR.vhd new file mode 100644 index 000000000..8e2417cd5 --- /dev/null +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_TRANSPOSE_SSR_FIR.vhd @@ -0,0 +1,202 @@ +-- Copyright (C) 2026, Advanced Micro Devices, Inc. +-- +-- Vitis Model Composer HDL Black Box wrapper for the Transpose-Form SSR FIR +-- (TRANSPOSE_SSR_FIR.vhd). This wrapper adapts the System Generator / Model +-- Composer STD_LOGIC_VECTOR black-box interface to the SFIXED_VECTOR interface +-- of the VHDL-2008 TRANSPOSE_SSR_FIR core, builds the REAL_MATRIX coefficient +-- set from the string generic passed in by the config script, and ties the +-- single coefficient-set address CSA to 0. +-- +-- The transpose form has the same external behaviour and latency as the direct +-- form for a given filter, but its DSP PREG/PCOUT accumulation chain depth is +-- TAPS/SSR per lane (vs TAPS in the direct form), so it closes timing at high +-- SSR and large TAPS where the direct form's cascade does not. + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; + +library STD; +use STD.textio.all; +use STD.env.all; + +use work.FIXED_PKG.all; -- VHDL-2008 IEEE standard SFIXED type and functions +use work.CFIXED_PKG.all; -- SFIXED_VECTOR, REAL_VECTOR, REAL_MATRIX and helpers + +library UNISIM; +use UNISIM.VComponents.all; + +entity WRAPPER_TRANSPOSE_SSR_FIR is + generic(OX,OY:INTEGER:=-1; -- Coordinates of the lower left corner DSPx8, use -1 if you do not want floorplanning + FAMILY:INTEGER:=3; -- use 1 for 7-series, 2 for US/US+ and 3 for Versal + DDR:BOOLEAN:=FALSE; -- use DDR=TRUE implementation only for Versal clock rates over 795MHz/824MHz/872MHz in speed grades -1/-2/-3 + SSR:INTEGER:=4; + TAPS:INTEGER:=36; + C:STRING:="1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0"; + I_HIGH:INTEGER:=7; + I_LOW:INTEGER:=-8; + C_HIGH:INTEGER:=0; + C_LOW:INTEGER:=-17; + O_HIGH:INTEGER:=7; + O_LOW:INTEGER:=-16; + ROUNDING:BOOLEAN:=FALSE; -- use TRUE for rounding the output result + SYMMETRY:STRING:="ES"); -- Filter Symmetry, use "ES" for Even-Symmetric, "OS" for Odd-Symmetric and "NS" for Non-Symmetric + port(CLK:in STD_LOGIC; + CE:in STD_LOGIC:='1'; -- not used, for SysGen only + I:in STD_LOGIC_VECTOR(SSR*(I_HIGH-I_LOW+1)-1 downto 0); + VI:in STD_LOGIC; + O:out STD_LOGIC_VECTOR(SSR*(O_HIGH-O_LOW+1)-1 downto 0); + VO:out STD_LOGIC); +end WRAPPER_TRANSPOSE_SSR_FIR; + +architecture WRAPPER of WRAPPER_TRANSPOSE_SSR_FIR is + signal II:SFIXED_VECTOR(0 to SSR-1)(I_HIGH downto I_LOW); + signal VII:BOOLEAN; + signal OO:SFIXED_VECTOR(0 to SSR-1)(O_HIGH downto O_LOW); + signal VOO:BOOLEAN; + function REAL_value(S:STRING) return REAL is + variable R,F:REAL; + variable E:INTEGER; + variable DECIMAL,NEGATIVE,EXP,NEGEXP:BOOLEAN; + begin + R:=0.0;F:=1.0;E:=0; + DECIMAL:=FALSE; + NEGATIVE:=FALSE; + EXP:=FALSE; + NEGEXP:=FALSE; + for K in 0 to S'length-1 loop + if (S(K+S'low)='E') or (S(K+S'low)='e') then + EXP:=TRUE; + elsif K=0 and S(K+S'low)='-' then + NEGATIVE:=TRUE; + elsif EXP then + if S(K+S'low)='-' then + NEGEXP:=TRUE; + else + case S(K+S'low) is + when '0'=>E:=E*10; + when '1'=>E:=E*10+1; + when '2'=>E:=E*10+2; + when '3'=>E:=E*10+3; + when '4'=>E:=E*10+4; + when '5'=>E:=E*10+5; + when '6'=>E:=E*10+6; + when '7'=>E:=E*10+7; + when '8'=>E:=E*10+8; + when '9'=>E:=E*10+9; + when others=>assert FALSE report "REAL number format error!" severity warning; + end case; + end if; + elsif DECIMAL then + F:=F/10.0; + case S(K+S'low) is + when '0'=>null; + when '1'=>R:=R+1.0*F; + when '2'=>R:=R+2.0*F; + when '3'=>R:=R+3.0*F; + when '4'=>R:=R+4.0*F; + when '5'=>R:=R+5.0*F; + when '6'=>R:=R+6.0*F; + when '7'=>R:=R+7.0*F; + when '8'=>R:=R+8.0*F; + when '9'=>R:=R+9.0*F; + when others=>assert FALSE report "REAL number format error!" severity warning; + end case; + else + case S(K+S'low) is + when '0'=>R:=R*10.0; + when '1'=>R:=R*10.0+1.0; + when '2'=>R:=R*10.0+2.0; + when '3'=>R:=R*10.0+3.0; + when '4'=>R:=R*10.0+4.0; + when '5'=>R:=R*10.0+5.0; + when '6'=>R:=R*10.0+6.0; + when '7'=>R:=R*10.0+7.0; + when '8'=>R:=R*10.0+8.0; + when '9'=>R:=R*10.0+9.0; + when '.'=>DECIMAL:=TRUE; + when others=>assert FALSE report "REAL number format error!" severity warning; + end case; + end if; + end loop; + if NEGEXP then + E:=-E; + end if; + if NEGATIVE then + return -R*10.00**E; + else + return R*10.0**E; + end if; + end; + -- Parse a whitespace/comma separated coefficient string into the first N + -- coefficients, returned as a single-row REAL_MATRIX (one coefficient set). + function STRING2MATRIX(S:STRING;N:INTEGER) return REAL_MATRIX is + variable R:REAL_MATRIX(0 to 0)(0 to N-1); + variable P,CNT:INTEGER; + begin + P:=S'low; + if (S(P)='(') or (S(P)='[') then P:=P+1; end if; + for K in R(0)'range loop + while (P0 +-- REAL'value() not supported in Vivado Synthesis, use REAL_value instead + then R(0)(K):=REAL_value(S(P to P+CNT-1)); + else R(0)(K):=0.0; + end if; + P:=P+CNT; + end loop; + return R; + end; + constant COEFFICIENT:REAL_MATRIX(0 to 0)(0 to TAPS-1):=STRING2MATRIX(C,TAPS); + signal CLK1,CLKH:STD_LOGIC; +begin + i1:if DDR generate + b2:MBUFGCE_DIV port map(I=>CLK, + CE=>'1', + CLR=>'0', + CLRB_LEAF=>'1', + O1=>CLK1, + O2=>CLKH); + end; + else generate + CLK1<=CLK; + CLKH<='0'; + end generate; + ij:for J in 0 to SSR-1 generate + ik:for K in I_HIGH downto I_LOW generate + II(J)(K)<=I(J*(I_HIGH-I_LOW+1)+K-I_LOW); + end generate; + end generate; + VII<=VI='1'; + u1:entity work.TRANSPOSE_SSR_FIR generic map(OX=>OX, + OY=>OY, + FAMILY=>FAMILY, + DDR=>DDR, + COEFFICIENT=>COEFFICIENT, + C_HIGH=>C_HIGH, + C_LOW=>C_LOW, + EXTRA_C_PIPELINING=>TRUE, + EXTRA_D_PIPELINING=>TRUE, + ROUNDING=>ROUNDING, + ANTI=>FALSE, + SYMMETRY=>SYMMETRY) + port map (CLK=>CLK1, + CLKH=>CLKH, + I=>II, + VI=>VII, + CSA=>"0", + O=>OO, + VO=>VOO); + oj:for J in 0 to SSR-1 generate + ok:for K in O_HIGH downto O_LOW generate + O(J*(O_HIGH-O_LOW+1)+K-O_LOW)<=OO(J)(K); + end generate; + end generate; + VO<='1' when VOO else '0'; +end WRAPPER; diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_TRANSPOSE_SSR_FIR_config.m b/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_TRANSPOSE_SSR_FIR_config.m new file mode 100644 index 000000000..acb65b643 --- /dev/null +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/WRAPPER_TRANSPOSE_SSR_FIR_config.m @@ -0,0 +1,196 @@ + +function WRAPPER_TRANSPOSE_SSR_FIR_config(this_block) + + % Vitis Model Composer HDL Black Box configuration script for the + % Transpose-Form SSR FIR (WRAPPER_TRANSPOSE_SSR_FIR.vhd). + % + % This is the transpose-form counterpart of WRAPPER_SSR_FIR_config.m; it + % shares the same mask parameter set and the same fixed_pkg/cfixed_pkg base + % files, and only differs in the entity name and the design source files + % added at the bottom. + + this_block.setTopLevelLanguage('Verilog'); + + this_block.setEntityName('WRAPPER_TRANSPOSE_SSR_FIR'); + + parent = get_param(this_block.blockName,'Parent'); +maskParamNameValuePairs = get_param(parent, 'MaskWSVariables'); + +% now step through each MASK to get the name and the evaluated value +for i=1:length(maskParamNameValuePairs) + if (strcmpi(maskParamNameValuePairs(i).Name, 'OX')) + OX = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'OY')) + OY = maskParamNameValuePairs(i).Value; + end +% if (strcmpi(maskParamNameValuePairs(i).Name, 'FAMILY')) +% FAMILY = maskParamNameValuePairs(i).Value; +% end + if (strcmpi(maskParamNameValuePairs(i).Name, 'DDR')) + DDR = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'SSR')) + SSR = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'TAPS')) + TAPS = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'COEFFICIENT')) + COEFFICIENT = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'I_HIGH')) + I_HIGH = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'I_LOW')) + I_LOW = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'C_HIGH')) + C_HIGH = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'C_LOW')) + C_LOW = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'O_HIGH')) + O_HIGH = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'O_LOW')) + O_LOW = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'ROUNDING')) + ROUNDING = maskParamNameValuePairs(i).Value; + end + if (strcmpi(maskParamNameValuePairs(i).Name, 'SYMMETRY')) + SYMMETRY = maskParamNameValuePairs(i).Value; + end +end + +family = this_block.getDeviceFamilyName; +if(contains(family,"7") || strcmp(family,"zynq") || strcmp(family,"qzynq") || strcmp(family,"azynq")) + FAMILY = 1; % use 1 for selecting DSP48E1 +elseif(contains(family,"versal")) + FAMILY = 3; % use 1 for selecting DSP58 +else + FAMILY = 2; % use 2 for selecting DSP48E2 +end + +% System Generator has to assume that your entity has a combinational feed through; + % if not, then comment out the following line: + %this_block.tagAsCombinational; + + this_block.addSimulinkInport('I'); + this_block.addSimulinkInport('VI'); + + this_block.addSimulinkOutport('O'); + this_block.addSimulinkOutport('VO'); + + VO_port = this_block.port('VO'); + VO_port.setType('UFix_1_0'); + VO_port.useHDLVector(false); + + % ----------------------------- + if (this_block.inputTypesKnown) + % do input type checking, dynamic output type and generic setup in this code block. + + % (!) Port 'I' appeared to have dynamic type in the HDL -- please add type checking as appropriate; + % inp_width = this_block.port('I').width; % this should be SSR*(I_HIGH-I_LOW+1) + this_block.port('I').useHDLVector(true); + + if (this_block.port('VI').width ~= 1); + this_block.setError('Input data type for port "VI" must have width=1.'); + end + + this_block.port('VI').useHDLVector(false); + + % (!) Port 'O' appeared to have dynamic type in the HDL + % --- you must add an appropriate type setting for this port + this_block.port('O').setType(['UFix_' num2str(SSR*(O_HIGH-O_LOW+1)) '_' num2str(0)]); +end % if(inputTypesKnown) + % ----------------------------- + + % ----------------------------- + if (this_block.inputRatesKnown) + setup_as_single_rate(this_block,'CLK','CE') + end % if(inputRatesKnown) + % ----------------------------- + + uniqueInputRates = unique(this_block.getInputRates); + + % (!) Custimize the following generic settings as appropriate. If any settings depend + % on input types, make the settings in the "inputTypesKnown" code block. + % The addGeneric function takes 3 parameters, generic name, type and constant value. + % Supported types are boolean, real, integer and string. + + + this_block.addGeneric('OX','INTEGER',num2str(OX)); + this_block.addGeneric('OY','INTEGER',num2str(OY)); + this_block.addGeneric('FAMILY','INTEGER',num2str(FAMILY)); + if (DDR==1) + this_block.addGeneric('DDR','BOOLEAN','TRUE'); + else + this_block.addGeneric('DDR','BOOLEAN','FALSE'); + end + this_block.addGeneric('SSR','INTEGER',num2str(SSR)); + this_block.addGeneric('TAPS','INTEGER',num2str(TAPS)); + this_block.addGeneric('C','STRING',strcat('"',num2str(COEFFICIENT,' %.16f'),'"')); + this_block.addGeneric('I_HIGH','INTEGER',num2str(I_HIGH)); + this_block.addGeneric('I_LOW','INTEGER',num2str(I_LOW)); + this_block.addGeneric('C_HIGH','INTEGER',num2str(C_HIGH)); + this_block.addGeneric('C_LOW','INTEGER',num2str(C_LOW)); + this_block.addGeneric('O_HIGH','INTEGER',num2str(O_HIGH)); + this_block.addGeneric('O_LOW','INTEGER',num2str(O_LOW)); + if (ROUNDING==1) + this_block.addGeneric('ROUNDING','BOOLEAN','TRUE'); + else + this_block.addGeneric('ROUNDING','BOOLEAN','FALSE'); + end + this_block.addGeneric('SYMMETRY','STRING',convertStringsToChars(strcat('"',SYMMETRY,'"'))); + + % Add addtional source files as needed. + % |------------- + % | Add files in the order in which they should be compiled. + % | If two files "a.vhd" and "b.vhd" contain the entities + % | entity_a and entity_b, and entity_a contains a + % | component of type entity_b, the correct sequence of + % | addFile() calls would be: + % | this_block.addFile('b.vhd'); + % | this_block.addFile('a.vhd'); + % |------------- + + this_block.addFile('fixed_pkg.vhd'); + this_block.addFile('cfixed_pkg.vhd'); + this_block.addFile('BDELAY.vhd'); + this_block.addFile('SDELAY.vhd'); + this_block.addFile('DSPx8_WRAPPER.vhd'); + this_block.addFile('TRANSPOSE_SSR_FIR_CHAIN.vhd'); + this_block.addFile('TRANSPOSE_SSR_FIR.vhd'); + this_block.addFile('WRAPPER_TRANSPOSE_SSR_FIR.vhd'); + +return; + + +% ------------------------------------------------------------ + +function setup_as_single_rate(block,clkname,cename) + inputRates = block.inputRates; + uniqueInputRates = unique(inputRates); + if (length(uniqueInputRates)==1 & uniqueInputRates(1)==Inf) + block.addError('The inputs to this block cannot all be constant.'); + return; + end + if (uniqueInputRates(end) == Inf) + hasConstantInput = true; + uniqueInputRates = uniqueInputRates(1:end-1); + end + if (length(uniqueInputRates) ~= 1) + block.addError('The inputs to this block must run at a single rate.'); + return; + end + theInputRate = uniqueInputRates(1); + for i = 1:block.numSimulinkOutports + block.outport(i).setRate(theInputRate); + end + block.addClkCEPair(clkname,cename,theInputRate); + return; + +% ------------------------------------------------------------ diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/cfixed_pkg.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/cfixed_pkg.vhd new file mode 100644 index 000000000..ffa0bc71f --- /dev/null +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/cfixed_pkg.vhd @@ -0,0 +1,407 @@ +-- Copyright © Advanced Micro Devices, Inc., or its affiliates. All rights reserved. +-- Portions of this content consists of AI generated content. +-- You may not use this software and documentation (if any) (collectively, the "Materials") +-- except in compliance with the terms and conditions of the Software License Agreement +-- included with the Materials or otherwise as set forth in writing and signed by you and +-- an authorized signatory of AMD. If you do not have a copy of the Software License +-- Agreement, contact your AMD representative for a copy. You agree that you will not +-- reverse engineer or decompile the Materials, in whole or in part, except as allowed by +-- applicable law. +-- THE MATERIALS ARE DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR +-- REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +library IEEE; +use IEEE.STD_LOGIC_1164.all; +use IEEE.NUMERIC_STD.all; +use IEEE.MATH_REAL.all; +use IEEE.MATH_COMPLEX.all; + +package cfixed_pkg is + use work.fixed_pkg.all; -- VHDL-2008 fixed_pkg with no saturation, rounding or warning messages + -- this gives us UFIXED, SFIXED, operators and conversion functions + + constant PI:REAL:=3.1415926535897932; +-- type BOOLEAN_VECTOR is array(NATURAL range <>) of BOOLEAN; + type INTEGER_VECTOR is array(INTEGER range <>) of INTEGER; + type REAL_VECTOR is array(INTEGER range <>) of REAL; + type COMPLEX_VECTOR is array(INTEGER range <>) of COMPLEX; + type UNSIGNED_VECTOR is array(INTEGER range <>) of UNSIGNED; + +-- SFIXED is now the standard VHDL-2008 type defined in fixed_generic_pkg, we do not need a user defined type anymore but this is what SFIXED really is +-- type SFIXED is array(INTEGER range <>) of STD_LOGIC; -- arbitrary precision fixed point signed number, like SIGNED but lower bound can be negative + type SFIXED_VECTOR is array(INTEGER range <>) of SFIXED; -- unconstrained array of SFIXED + type SFIXED_MATRIX is array(INTEGER range <>) of SFIXED_VECTOR; -- unconstrained 2-D array of SFIXED + type CFIXED is record RE,IM:SFIXED; end record; -- arbitrary precision fixed point complex signed number + type CFIXED_VECTOR is array(INTEGER range <>) of CFIXED; -- unconstrained array of CFIXED + type CFIXED_MATRIX is array(INTEGER range <>) of CFIXED_VECTOR; -- unconstrained array of CFIXED_VECTOR + type REAL_MATRIX is array(INTEGER range <>) of REAL_VECTOR; + type COMPLEX_MATRIX is array(INTEGER range <>) of COMPLEX_VECTOR; + + function MIN(A,B:INTEGER) return INTEGER; + function MIN(A,B,C:INTEGER) return INTEGER; + function MIN(A,B,C,D:INTEGER) return INTEGER; + function MAX(A,B:INTEGER) return INTEGER; + function MAX(A,B,C:INTEGER) return INTEGER; + function MAX(A,B,C,D:INTEGER) return INTEGER; + function MED(A,B,C:INTEGER) return INTEGER; +-- function TO_INTEGER(B:BOOLEAN) return INTEGER; + + function "*"(X:SFIXED;Y:STD_LOGIC) return SFIXED; -- multiply by 0 or 1 with SFIXED(X'high downto X'low) result + function TO_SFIXED(I:SIGNED;H,L:INTEGER;SHIFT:INTEGER:=0) return SFIXED; -- convert SIGNED to SFIXED(H downto L) and resize + function TO_SFIXED(I:SIGNED;X:SFIXED;SHIFT:INTEGER:=0) return SFIXED; -- convert SIGNED to SFIXED(X'high downto X'low) and resize +--redefine standard VHDL-2008 SFIXED shift function to make them full precision + function SHIFT_RIGHT(X:SFIXED;N:INTEGER) return SFIXED; -- returns SFIXED(X'high-N downto X'low-N) result + function SHIFT_LEFT(X:SFIXED;N:INTEGER) return SFIXED; -- returns SFIXED(X'high+N downto X'low+N) result + function TO_SFIXED_VECTOR(C:REAL_VECTOR;HL:SFIXED) return SFIXED_VECTOR; -- returns SFIXED_VECTOR(HL'high downto HL'low) result + function TO_REAL_VECTOR(C:SFIXED_VECTOR) return REAL_VECTOR; -- returns REAL_VECTOR result + + function RE(X:CFIXED) return SFIXED; -- returns SFIXED(X'high/2 downto X'low/2) result + function IM(X:CFIXED) return SFIXED; -- returns SFIXED(X'high/2 downto X'low/2) result + function "+"(X,Y:CFIXED) return CFIXED; -- full precision add with CFIXED(MAX(X'high,Y'high)+2 downto MIN(X'low,Y'low)) result + function "-"(X,Y:CFIXED) return CFIXED; -- full precision subtract with CFIXED(MAX(X'high,Y'high)+2 downto MIN(X'low,Y'low)) result + function "*"(X,Y:CFIXED) return CFIXED; -- full precision multiply with CFIXED(X'high+Y'high+2 downto X'low+Y'low) result + function "*"(X:CFIXED;Y:SFIXED) return CFIXED; -- full precision multiply with CFIXED(X'high+Y'high downto X'low+Y'low) result + function "*"(X:SFIXED;Y:CFIXED) return CFIXED; + function RESIZE(X:CFIXED;H,L:INTEGER) return CFIXED; -- resizes X and returns CFIXED(RE(H downto L),IM(H downto L)) + function RESIZE(X:CFIXED;HL:CFIXED) return CFIXED; -- resizes X to match HL and returns CFIXED(RE(HL.RE'high downto HL.RE'low),IM(RE(HL.IM'high downto HL.IM'low)) + function PLUS_i_TIMES(X:CFIXED) return CFIXED; -- returns CFIXED(X'high+2 downto X'low) result + function "-"(X:CFIXED) return CFIXED; -- full precision negate with CFIXED(X'high+2 downto X'low) result + function MINUS_i_TIMES(X:CFIXED) return CFIXED; -- returns CFIXED(X'high+2 downto X'low) result + function X_PLUS_i_TIMES_Y(X,Y:CFIXED;RND:CFIXED) return CFIXED; -- returns CFIXED(MAX(X'high,Y'high)+2 downto MIN(X'low,Y'low)) result + function X_MINUS_i_TIMES_Y(X,Y:CFIXED;RND:CFIXED) return CFIXED; -- returns CFIXED(MAX(X'high,Y'high)+2 downto MIN(X'low,Y'low)) result + function SWAP(X:CFIXED) return CFIXED; -- returns CFIXED(X'high downto X'low) result + function CONJ(X:CFIXED) return CFIXED; -- returns CFIXED(X'high+2 downto X'low) result + function SHIFT_RIGHT(X:CFIXED;N:INTEGER) return CFIXED; -- returns CFIXED(X'high-N downto X'low-N) result + function SHIFT_LEFT(X:CFIXED;N:INTEGER) return CFIXED; -- returns CFIXED(X'high+N downto X'low+N) result + function TO_CFIXED(R,I:REAL;H,L:INTEGER) return CFIXED; -- returns CFIXED(RE(H downto L),IM(H downto L)) result + function TO_CFIXED(R,I:REAL;HL:CFIXED) return CFIXED; -- returns CFIXED(RE(HL.RE'high downto HL.RE'low),IM(RE(HL.IM'high downto HL.IM'low)) result + function TO_CFIXED(C:COMPLEX;HL:CFIXED) return CFIXED; -- returns CFIXED(RE(HL.RE'high downto HL.RE'low),IM(RE(HL.IM'high downto HL.IM'low)) result + function TO_CFIXED(R,I:SFIXED) return CFIXED; -- returns CFIXED(2*MAX(R'high,I'high)+1 downto 2*MIN(R'low,I'low)) result + function TO_COMPLEX(C:CFIXED) return COMPLEX; -- returns COMPLEX result + function TO_CFIXED_VECTOR(C:COMPLEX_VECTOR;HL:CFIXED) return CFIXED_VECTOR; -- returns CFIXED_VECTOR(RE(HL.RE'high downto HL.RE'low),IM(RE(HL.IM'high downto HL.IM'low)) result + function TO_COMPLEX_VECTOR(C:CFIXED_VECTOR) return COMPLEX_VECTOR; -- returns COMPLEX_VECTOR result + function "*"(R:REAL;C:COMPLEX_VECTOR) return COMPLEX_VECTOR; -- returns R*C + function LOG2(N:INTEGER) return INTEGER; -- returns ceil(log2(N)) + function ZERO(U:UNSIGNED) return UNSIGNED; -- returns 0 with the same range as U + function ZERO(S:SFIXED) return SFIXED; -- returns 0 with the same range as S + function ZERO(C:CFIXED) return CFIXED; -- returns 0 with the same range as C + function ZERO(SV:SFIXED_VECTOR) return SFIXED_VECTOR; -- returns 0 with the same range as SV + function ZERO(CV:CFIXED_VECTOR) return CFIXED_VECTOR; -- returns 0 with the same range as CV +end package cfixed_pkg; + +package body cfixed_pkg is + function MIN(A,B:INTEGER) return INTEGER is + begin + if AB then + return A; + else + return B; + end if; + end; + + function MAX(A,B,C:INTEGER) return INTEGER is + begin + return MAX(MAX(A,B),C); + end; + + function MAX(A,B,C,D:INTEGER) return INTEGER is + begin + return MAX(MAX(A,B),MAX(C,D)); + end; + + function MED(A,B,C:INTEGER) return INTEGER is + begin + return MAX(MIN(MAX(A,B),C),MIN(A,B)); + end; + +-- function TO_INTEGER(B:BOOLEAN) return INTEGER is +-- begin +-- if B then +-- return 1; +-- else +-- return 0; +-- end if; +-- end; + + function "*"(X:SFIXED;Y:STD_LOGIC) return SFIXED is + begin + if Y='1' then + return X; + else + return TO_SFIXED(0.0,X); + end if; + end; + + function TO_SFIXED(I:SIGNED;H,L:INTEGER;SHIFT:INTEGER:=0) return SFIXED is + variable O:SFIXED(H downto L); + begin + for K in O'range loop + if K1 loop + RESULT:=RESULT+1; + TEMP:=(TEMP+1)/2; + end loop; + return RESULT; + end; + + function ZERO(U:UNSIGNED) return UNSIGNED is -- returns 0 with the same range as S + begin + return TO_UNSIGNED(0,U'length); + end; + + function ZERO(S:SFIXED) return SFIXED is -- returns 0 with the same range as S + begin + return TO_SFIXED(0.0,S); + end; + + function ZERO(C:CFIXED) return CFIXED is -- returns 0 with the same range as C + begin + return TO_CFIXED(0.0,0.0,C); + end; + + function ZERO(SV:SFIXED_VECTOR) return SFIXED_VECTOR is -- returns 0 with the same range as SV + variable RESULT:SFIXED_VECTOR(SV'range)(SV(SV'low)'range); + begin + for K in SV'range loop + RESULT(K):=TO_SFIXED(0.0,SV(K)); + end loop; + return RESULT; + end; + + function ZERO(CV:CFIXED_VECTOR) return CFIXED_VECTOR is -- returns 0 with the same range as CV + variable RESULT:CFIXED_VECTOR(CV'range)(RE(CV(CV'low).RE'range),IM(CV(CV'low).IM'range)); + begin + for K in CV'range loop + RESULT(K):=TO_CFIXED(0.0,0.0,CV(K)); + end loop; + return RESULT; + end; +end package body cfixed_pkg; \ No newline at end of file diff --git a/Examples/HDL/Digital_Filtering/SSR_FIR/fixed_pkg.vhd b/Examples/HDL/Digital_Filtering/SSR_FIR/fixed_pkg.vhd new file mode 100644 index 000000000..2cb1318d5 --- /dev/null +++ b/Examples/HDL/Digital_Filtering/SSR_FIR/fixed_pkg.vhd @@ -0,0 +1,20 @@ +-- Copyright © Advanced Micro Devices, Inc., or its affiliates. All rights reserved. +-- Portions of this content consists of AI generated content. +-- You may not use this software and documentation (if any) (collectively, the "Materials") +-- except in compliance with the terms and conditions of the Software License Agreement +-- included with the Materials or otherwise as set forth in writing and signed by you and +-- an authorized signatory of AMD. If you do not have a copy of the Software License +-- Agreement, contact your AMD representative for a copy. You agree that you will not +-- reverse engineer or decompile the Materials, in whole or in part, except as allowed by +-- applicable law. +-- THE MATERIALS ARE DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR +-- REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +library IEEE; +use IEEE.STD_LOGIC_1164.all; + +package fixed_pkg is new IEEE.fixed_generic_pkg + generic map(fixed_round_style=>IEEE.fixed_float_types.fixed_truncate, + fixed_overflow_style=>IEEE.fixed_float_types.fixed_wrap, + fixed_guard_bits=>2, + no_warning=>true);