From f7c0353d599af856b85f9cf764da226e7a9f4fdb Mon Sep 17 00:00:00 2001 From: KazushiKawamura Date: Tue, 28 Aug 2018 21:08:17 +0900 Subject: [PATCH] Upload files --- hls_2018/router_02_boardstr/Makefile | 20 + hls_2018/router_02_boardstr/Makefile.cygwin | 14 + hls_2018/router_02_boardstr/README.md | 16 + hls_2018/router_02_boardstr/ap_int.h | 521 ++ .../bitstream/04/router_design.bit | Bin 0 -> 4045681 bytes .../bitstream/04/router_design.tcl | 1113 ++++ .../bitstream/16/router_design.bit | Bin 0 -> 4045681 bytes .../bitstream/16/router_design.tcl | 1113 ++++ .../router_02_boardstr/etc/ap_fixed_sim.h | 2451 +++++++ hls_2018/router_02_boardstr/etc/ap_int_sim.h | 1629 +++++ hls_2018/router_02_boardstr/etc/ap_private.h | 5858 +++++++++++++++++ hls_2018/router_02_boardstr/main.cpp | 99 + hls_2018/router_02_boardstr/router.cpp | 609 ++ hls_2018/router_02_boardstr/router.hpp | 59 + .../bitstream/router_design.bit | Bin 0 -> 5568793 bytes .../bitstream/router_design.tcl | 844 +++ hls_2018/router_04_boardstr/router.cpp | 12 +- hls_2018/router_04_boardstr/router.hpp | 8 +- hls_2018/router_05/Makefile | 20 + hls_2018/router_05/Makefile.cygwin | 14 + hls_2018/router_05/ap_int.h | 521 ++ hls_2018/router_05/etc/ap_fixed_sim.h | 2451 +++++++ hls_2018/router_05/etc/ap_int_sim.h | 1629 +++++ hls_2018/router_05/etc/ap_private.h | 5858 +++++++++++++++++ hls_2018/router_05/main.cpp | 99 + hls_2018/router_05/router.cpp | 457 ++ hls_2018/router_05/router.hpp | 53 + hls_2018/router_05/solver.c | 317 - 28 files changed, 25459 insertions(+), 326 deletions(-) create mode 100755 hls_2018/router_02_boardstr/Makefile create mode 100755 hls_2018/router_02_boardstr/Makefile.cygwin create mode 100644 hls_2018/router_02_boardstr/README.md create mode 100755 hls_2018/router_02_boardstr/ap_int.h create mode 100755 hls_2018/router_02_boardstr/bitstream/04/router_design.bit create mode 100755 hls_2018/router_02_boardstr/bitstream/04/router_design.tcl create mode 100755 hls_2018/router_02_boardstr/bitstream/16/router_design.bit create mode 100755 hls_2018/router_02_boardstr/bitstream/16/router_design.tcl create mode 100755 hls_2018/router_02_boardstr/etc/ap_fixed_sim.h create mode 100755 hls_2018/router_02_boardstr/etc/ap_int_sim.h create mode 100755 hls_2018/router_02_boardstr/etc/ap_private.h create mode 100755 hls_2018/router_02_boardstr/main.cpp create mode 100755 hls_2018/router_02_boardstr/router.cpp create mode 100755 hls_2018/router_02_boardstr/router.hpp create mode 100755 hls_2018/router_04_boardstr/bitstream/router_design.bit create mode 100755 hls_2018/router_04_boardstr/bitstream/router_design.tcl create mode 100755 hls_2018/router_05/Makefile create mode 100755 hls_2018/router_05/Makefile.cygwin create mode 100755 hls_2018/router_05/ap_int.h create mode 100755 hls_2018/router_05/etc/ap_fixed_sim.h create mode 100755 hls_2018/router_05/etc/ap_int_sim.h create mode 100755 hls_2018/router_05/etc/ap_private.h create mode 100755 hls_2018/router_05/main.cpp create mode 100755 hls_2018/router_05/router.cpp create mode 100755 hls_2018/router_05/router.hpp delete mode 100644 hls_2018/router_05/solver.c diff --git a/hls_2018/router_02_boardstr/Makefile b/hls_2018/router_02_boardstr/Makefile new file mode 100755 index 0000000..8f79e7a --- /dev/null +++ b/hls_2018/router_02_boardstr/Makefile @@ -0,0 +1,20 @@ +TARGET = sim +OBJS = $(CPPS:.cpp=.o) +CPPS = $(wildcard *.cpp) +CXX = g++ +CXXFLAGS = -O3 -Wall -Wno-unknown-pragmas -Wno-unused-label -DSOFTWARE -DCALCTIME + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CXX) -O3 -o $@ $(OBJS) + +run: + python3 ../NLGenerator.py -x 20 -y 20 -z 6 -l 100;\ + python3 ./gen_boardstr.py Q-20x20x5_100_10.txt |\ + ./$(TARGET) - + + +clean: + rm *.o + rm $(TARGET) diff --git a/hls_2018/router_02_boardstr/Makefile.cygwin b/hls_2018/router_02_boardstr/Makefile.cygwin new file mode 100755 index 0000000..866fdcd --- /dev/null +++ b/hls_2018/router_02_boardstr/Makefile.cygwin @@ -0,0 +1,14 @@ +TARGET = sim +OBJS = $(CPPS:.cpp=.o) +CPPS = $(wildcard *.cpp) +CXX = g++ +CXXFLAGS = -O3 -Wall -Wno-unknown-pragmas -Wno-unused-label -DSOFTWARE -DCALCTIME + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CXX) -O3 -Wl,--stack,33554432 -o $@ $(OBJS) + +clean: + rm *.o + rm $(TARGET) diff --git a/hls_2018/router_02_boardstr/README.md b/hls_2018/router_02_boardstr/README.md new file mode 100644 index 0000000..2213393 --- /dev/null +++ b/hls_2018/router_02_boardstr/README.md @@ -0,0 +1,16 @@ +# 並列度の変更 (変更箇所) +優先度キューに要素を挿入する際,要素の移動を並列して実行できる + +コードにいくつかの変更を加えることで並列度を変更可能 + +## router.hpp +以下の2箇所を変更する +* #define PP **32** <-- 並列度 +* #define LOG_PP **5** <-- 並列度のlog2 + +## router.cpp +以下の5箇所を変更する +* (in search func.) #pragma HLS ARRAY_PARTITION variable=pq_nodes cyclic factor=**32** dim=1 <-- 並列度 +* (in pq_push func.) #pragma HLS LOOP_TRIPCOUNT min=0 max=**31** <-- 並列度-1 (計3箇所) +* (in pq_push func.) #pragma HLS LOOP_TRIPCOUNT min=0 max=**255** <-- キューの最大要素数/並列度-1 + diff --git a/hls_2018/router_02_boardstr/ap_int.h b/hls_2018/router_02_boardstr/ap_int.h new file mode 100755 index 0000000..b8d9fdc --- /dev/null +++ b/hls_2018/router_02_boardstr/ap_int.h @@ -0,0 +1,521 @@ +/* + * Copyright 2012 Xilinx, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __AESL_AP_SIM_H__ +#define __AESL_AP_SIM_H__ + +#ifndef __cplusplus +#error C++ is required to include this header file +#else + +#include "etc/ap_int_sim.h" +#include "etc/ap_fixed_sim.h" + +//Forward declaration +template class ap_fixed; +template class ap_ufixed; +template class ap_int; +template class ap_uint; + +//AP_INT +//-------------------------------------------------------- +template +class ap_int : public ap_private<_AP_W, true> { +#ifdef _MSC_VER +#pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ +public: + typedef ap_private<_AP_W, true> Base; + + //Constructor + INLINE ap_int(): Base() {} + template + INLINE ap_int(const volatile ap_int<_AP_W2> &op):Base((const ap_private<_AP_W2,true> &)(op)) {} + + template + INLINE ap_int(const ap_int<_AP_W2> &op):Base((const ap_private<_AP_W2,true> &)(op)) {} + + template + INLINE ap_int(const ap_uint<_AP_W2> &op):Base((const ap_private<_AP_W2,false> &)(op)) {} + + template + INLINE ap_int(const volatile ap_uint<_AP_W2> &op):Base((const ap_private<_AP_W2,false> &)(op)) {} + + template + INLINE ap_int(const ap_range_ref<_AP_W2, _AP_S2>& ref):Base(ref) {} + + template + INLINE ap_int(const ap_bit_ref<_AP_W2, _AP_S2>& ref):Base(ref) {} + + template + INLINE ap_int(const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& ref):Base(ref) {} + + template + INLINE ap_int(const ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_int(const ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_int(const volatile ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_int(const volatile ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_int(const ap_private<_AP_W2, _AP_S2>& op):Base(op) {} + + template + INLINE ap_int(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, + _AP_N2>& op):Base(op) {} + + template + INLINE ap_int(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, + _AP_N2>& op):Base(op) {} + + template + INLINE ap_int(const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op):Base(op.to_ap_private()) {} + +#define CTOR(TYPE) \ + INLINE ap_int(TYPE v):Base(v) {} + CTOR(bool) + CTOR(signed char) + CTOR(unsigned char) + CTOR(short) + CTOR(unsigned short) + CTOR(int) + CTOR(unsigned int) + CTOR(long) + CTOR(unsigned long) + CTOR(unsigned long long) + CTOR(long long) + CTOR(float) + CTOR(double) + CTOR(const char*) + CTOR(const std::string&) +#undef CTOR + INLINE ap_int(const char* str, signed char rd):Base(str, rd) {} + //Assignment + //Another form of "write" + INLINE void operator = (const ap_int<_AP_W>& op2) volatile { + const_cast(this)->operator = (op2); + } + + INLINE void operator = (const volatile ap_int<_AP_W>& op2) volatile { + const_cast(this)->operator = (op2); + } + + INLINE ap_int<_AP_W>& operator = (const volatile ap_int<_AP_W>& op2) { + Base::operator = (const_cast& >(op2)); + return *this; + } + + INLINE ap_int<_AP_W>& operator = (const ap_int<_AP_W>& op2) { + Base::operator = ((const ap_private<_AP_W, true>&)op2); + return *this; + } +}; + +//AP_UINT +//--------------------------------------------------------------- +template +class ap_uint: public ap_private<_AP_W, false> { +#ifdef _MSC_VER +#pragma warning( disable : 4521 4522 ) +#endif +public: + typedef ap_private<_AP_W, false> Base; + //Constructor + INLINE ap_uint(): Base() {} + INLINE ap_uint(const ap_uint<_AP_W>& op) :Base(dynamic_cast&>(op)) {} + INLINE ap_uint(const volatile ap_uint<_AP_W>& op):Base(dynamic_cast&>(op)){} + template + INLINE ap_uint(const volatile ap_uint<_AP_W2> &op):Base((const ap_private<_AP_W2, false>&)(op)) {} + + template + INLINE ap_uint(const ap_uint<_AP_W2> &op) : Base((const ap_private<_AP_W2, false>&)(op)){} + + template + INLINE ap_uint(const ap_int<_AP_W2> &op) : Base((const ap_private<_AP_W2, true>&)(op)) {} + + template + INLINE ap_uint(const volatile ap_int<_AP_W2> &op) : Base((const ap_private<_AP_W2, false>&)(op)) {} + + template + INLINE ap_uint(const ap_range_ref<_AP_W2, _AP_S2>& ref):Base(ref) {} + + template + INLINE ap_uint(const ap_bit_ref<_AP_W2, _AP_S2>& ref):Base(ref) {} + + template + INLINE ap_uint(const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& ref):Base(ref) {} + + template + INLINE ap_uint(const ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_uint(const ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_uint(const volatile ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_uint(const volatile ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op) {} + + template + INLINE ap_uint(const ap_private<_AP_W2, _AP_S2>& op):Base(op) {} + + template + INLINE ap_uint(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, + _AP_N2>& op):Base(op) {} + + template + INLINE ap_uint(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, + _AP_N2>& op):Base(op) {} + + template + INLINE ap_uint(const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op):Base(op.to_ap_private()) {} + +#define CTOR(TYPE) \ + INLINE ap_uint(TYPE v):Base(v) {} + CTOR(bool) + CTOR(signed char) + CTOR(unsigned char) + CTOR(short) + CTOR(unsigned short) + CTOR(int) + CTOR(unsigned int) + CTOR(long) + CTOR(unsigned long) + CTOR(unsigned long long) + CTOR(long long) + CTOR(float) + CTOR(double) + CTOR(const char*) + CTOR(const std::string&) +#undef CTOR + INLINE ap_uint(const char* str, signed char rd):Base(str, rd) {} + //Assignment + //Another form of "write" + INLINE void operator = (const ap_uint<_AP_W>& op2) volatile { + Base::operator = (op2); + } + + INLINE void operator = (const volatile ap_uint<_AP_W>& op2) volatile { + Base::operator = (op2); + } + + INLINE ap_uint<_AP_W>& operator = (const volatile ap_uint<_AP_W>& op2) { + Base::operator = (op2); + return *this; + } + + INLINE ap_uint<_AP_W>& operator = (const ap_uint<_AP_W>& op2) { + Base::operator = ((const ap_private<_AP_W, false>&)(op2)); + return *this; + } +}; + +#define ap_bigint ap_int +#define ap_biguint ap_uint + +//AP_FIXED +//--------------------------------------------------------------------- +template +class ap_fixed: public ap_fixed_base<_AP_W, _AP_I, true, _AP_Q, _AP_O, _AP_N> { +#ifdef _MSC_VER +#pragma warning( disable : 4521 4522 ) +#endif +public: + typedef ap_fixed_base<_AP_W, _AP_I, true, _AP_Q, _AP_O, _AP_N> Base; + //Constructor + INLINE ap_fixed():Base() {} + + template + INLINE ap_fixed(const ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, + _AP_N2>& op): Base(op) {} + + template + INLINE ap_fixed(const ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, + _AP_N2>& op): Base(ap_fixed_base<_AP_W2, _AP_I2, + false, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_fixed(const ap_int<_AP_W2>& op): + Base(ap_private<_AP_W2, true>(op)) {} + + template + INLINE ap_fixed(const ap_uint<_AP_W2>& op):Base(ap_private<_AP_W2, false>(op)) {} + + template + INLINE ap_fixed(const volatile ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, + _AP_N2>& op): Base(ap_fixed_base<_AP_W2, _AP_I2, + true, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_fixed(const volatile ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, + _AP_N2>& op): Base(ap_fixed_base<_AP_W2, _AP_I2, + false, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_fixed(const volatile ap_int<_AP_W2>& op): + Base(ap_private<_AP_W2, true>(op)) {} + + template + INLINE ap_fixed(const volatile ap_uint<_AP_W2>& op):Base(op) {} + + template + INLINE ap_fixed(const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op):Base(op) {} + + template + INLINE ap_fixed(const ap_bit_ref<_AP_W2, _AP_S2>& op): + Base(op) {} + + template + INLINE ap_fixed(const ap_range_ref<_AP_W2, _AP_S2>& op): + Base(op) {} + + template + INLINE ap_fixed(const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& op): + Base(op) {} + + template + INLINE ap_fixed(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op): Base(op) {} + + template + INLINE ap_fixed(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op): Base(op) {} + + template + INLINE ap_fixed(const ap_private<_AP_W2, _AP_S2>& op):Base(op) {} + + #define CTOR(TYPE) \ + INLINE ap_fixed(TYPE v):Base(v) {} + CTOR(bool) + CTOR(signed char) + CTOR(unsigned char) + CTOR(short) + CTOR(unsigned short) + CTOR(int) + CTOR(unsigned int) + CTOR(long) + CTOR(unsigned long) + CTOR(unsigned long long) + CTOR(long long) + CTOR(float) + CTOR(double) + CTOR(const char*) + CTOR(const std::string&) +#undef CTOR + INLINE ap_fixed(const char* str, signed char rd):Base(str, rd) {} + + //Assignment + INLINE ap_fixed& operator = (const ap_fixed<_AP_W, _AP_I, + _AP_Q, _AP_O, _AP_N>& op) { + Base::operator = (op); + return *this; + } + + INLINE ap_fixed& operator = (const volatile ap_fixed<_AP_W, _AP_I, + _AP_Q, _AP_O, _AP_N>& op) { + Base::operator = (op); + return *this; + } +}; + +//AP_ UFIXED +//--- ---------------------------------------------------------------- +template +class ap_ufixed : public ap_fixed_base<_AP_W, _AP_I, false, _AP_Q, _AP_O, _AP_N> { +#ifdef _MSC_VER +#pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ +public: + typedef ap_fixed_base<_AP_W, _AP_I, false, _AP_Q, _AP_O, _AP_N> Base; + + //Constructor + INLINE ap_ufixed():Base() {} + + template + INLINE ap_ufixed(const ap_fixed<_AP_W2, _AP_I2, _AP_Q2, + _AP_O2, _AP_N2>& op) : Base(ap_fixed_base<_AP_W2, + _AP_I2, true, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_ufixed(const ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, + _AP_O2, _AP_N2>& op): Base(ap_fixed_base<_AP_W2, _AP_I2, + false, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_ufixed(const ap_int<_AP_W2>& op): + Base((const ap_private<_AP_W2, true>&)(op)) {} + + template + INLINE ap_ufixed(const ap_uint<_AP_W2>& op): + Base((const ap_private<_AP_W2, false>&)(op)) {} + + template + INLINE ap_ufixed(const volatile ap_fixed<_AP_W2, _AP_I2, _AP_Q2, + _AP_O2, _AP_N2>& op) : Base(ap_fixed_base<_AP_W2, + _AP_I2, true, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_ufixed(const volatile ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, + _AP_O2, _AP_N2>& op): Base(ap_fixed_base<_AP_W2, _AP_I2, + false, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_ufixed(const volatile ap_int<_AP_W2>& op): + Base(ap_private<_AP_W2, true>(op)) {} + + template + INLINE ap_ufixed(const volatile ap_uint<_AP_W2>& op): + Base(ap_private<_AP_W2, false>(op)) {} + + template + INLINE ap_ufixed(const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2>& op):Base(op) {} + + template + INLINE ap_ufixed(const ap_bit_ref<_AP_W2, _AP_S2>& op): + Base(op) {} + + template + INLINE ap_ufixed(const ap_range_ref<_AP_W2, _AP_S2>& op): + Base(op) {} + + template + INLINE ap_ufixed(const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& op): + Base(op) {} + + template + INLINE ap_ufixed(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op): Base(op) {} + + template + INLINE ap_ufixed(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op): Base(op) {} + + template + INLINE ap_ufixed(const ap_private<_AP_W2, _AP_S2>& op):Base(op) {} + + #define CTOR(TYPE) \ + INLINE ap_ufixed(TYPE v):Base(v) {} + CTOR(bool) + CTOR(signed char) + CTOR(unsigned char) + CTOR(short) + CTOR(unsigned short) + CTOR(int) + CTOR(unsigned int) + CTOR(long) + CTOR(unsigned long) + CTOR(unsigned long long) + CTOR(long long) + CTOR(float) + CTOR(double) + CTOR(const char*) + CTOR(const std::string&) +#undef CTOR + INLINE ap_ufixed(const char* str, signed char rd):Base(str, rd) {} + + //Assignment + INLINE ap_ufixed& operator = (const ap_ufixed<_AP_W, _AP_I, + _AP_Q, _AP_O, _AP_N>& op) { + Base::operator = (op); + return *this; + } + + INLINE ap_ufixed& operator = (const volatile ap_ufixed<_AP_W, _AP_I, + _AP_Q, _AP_O, _AP_N>& op) { + Base::V = const_cast(op); + return *this; + } +}; + +#if defined(SYSTEMC_H) || defined(SYSTEMC_INCLUDED) +template +INLINE void sc_trace(sc_core::sc_trace_file *tf, const ap_int<_AP_W> &op, + const std::string &name) { + if (tf) + tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name); +} + +template +INLINE void sc_trace(sc_core::sc_trace_file *tf, const ap_uint<_AP_W> &op, + const std::string &name) { + if (tf) + tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name); +} + +template +INLINE void sc_trace(sc_core::sc_trace_file *tf, const ap_fixed<_AP_W, _AP_I, _AP_Q, _AP_O, _AP_N >&op, const std::string &name) { + tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name); +} + +template +INLINE void sc_trace(sc_core::sc_trace_file *tf, const ap_ufixed<_AP_W, _AP_I, _AP_Q, _AP_O, _AP_N >&op, const std::string &name) { + tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name); +} +#endif /* #if defined(SYSTEMC_H) || defined(SYSTEMC_INCLUDED) */ +#endif /* #ifndef __cplusplus */ +#endif /* #ifndef __AESL_AP_SIM_H__ */ \ No newline at end of file diff --git a/hls_2018/router_02_boardstr/bitstream/04/router_design.bit b/hls_2018/router_02_boardstr/bitstream/04/router_design.bit new file mode 100755 index 0000000000000000000000000000000000000000..fa71679ac7889dc311c5f113a0b5d508c7039afa GIT binary patch literal 4045681 zcmeFa4U{FvRVElOUsm<&r&4uxSM`rtKMoabx#%%+qn71H7IJh`=oF?gjp;Im5mt+l zg_zYCVGE@7_IRR8CArl2Fl~^rSy;BQVPrLDFtC^b14DakWEQmcvJ8hgyT=$9#_TeK z(O`R6I4rgI-iXMI{Ch9of4-+1-Ia0w;@%ryWJKo6m-$lc-t(gQCq(0Z@tU`P@Ap6Y z*0UJd`yPAy{f|8I*0;ZQ;~j5(`!}q8?XfrCW6Nvb^wzh(<9ojMZC`ua zv9CUH>uut@#KLRddF-}h|K#ECzWvxS@lV7xsCd<}6R*1Mgm^&g{_3x}^Z0Avzj&+o z+K>JHPM0Et__e(&V$GRd`LT@$B?ylNvH=y;!qh@jO*%vGLYnyCoUv)hMj&4IpN=)I zT3$DrZ-3-Rjv4#irY-8i#xZdj>N%*bZBtMi=d-LnCZzFgd^U_vCC==5_;JC75nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> 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 zxkf(EXzu`ysJTw*!1c)D0;P2>>LG>=`>i(|Eerr7;Xo?>4kI`}1KIb$*bw7kaQwU@ zaQVGO%!mH&A~9|9lJd5#rQry;6%2ScQmD&=d!Ov>xIW?UEWVu|8}ET)y**Uf4f;6( z-tY$e9wWas0#7yKDWRP=?0in_r}!-0GtIGiw_wT7`n(>>|MqcAyaDZ>ljG2>A3yTQ z>s~jRpg*(z*v9(d!|UrC8~5NhigDF-fX9?Hx@TEnzvG6|<+&(iIq z3kNhO>C~xvc0T^`omn%&vFu!V22aaAV?Ot;op(V8{`p5?ofvRj^L!4! z$c#}hAg9+IF^?bNI(aAl_DTmdCpYZG{T$cAn{_>zK$px+f{{ zUrBsiC!7<|=eSO|cj-F$Gn|wC&;ibgu9NC^TuFUy?m59adCSgQ(D!}ze?Ma`bxH21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> z21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7>21*7> 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 {@$`qRaTbN@xe9gmV2T1p;RL`3ri(< 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 zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^q%|LxMT4Z<)GK+!uzX^_%VX9TaoC@g^(g@!UKASR(<5p3Z|jF5;|SZ5b0^8OJZ zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1pZB+MC9ppJkRyV+bMC)Iu1Ygq1~PB81zQtx6z!#qjh`MZey0X^%?nIF88%t U|7Kd>=5~5&p@ki=1AEwk4?htslmGw# literal 0 HcmV?d00001 diff --git a/hls_2018/router_02_boardstr/bitstream/04/router_design.tcl b/hls_2018/router_02_boardstr/bitstream/04/router_design.tcl new file mode 100755 index 0000000..e5347df --- /dev/null +++ b/hls_2018/router_02_boardstr/bitstream/04/router_design.tcl @@ -0,0 +1,1113 @@ + +################################################################ +# This is a generated script based on design: router_design +# +# Though there are limitations about the generated script, +# the main purpose of this utility is to make learning +# IP Integrator Tcl commands easier. +################################################################ + +namespace eval _tcl { +proc get_script_folder {} { + set script_path [file normalize [info script]] + set script_folder [file dirname $script_path] + return $script_folder +} +} +variable script_folder +set script_folder [_tcl::get_script_folder] + +################################################################ +# Check if script is running in correct Vivado version. +################################################################ +set scripts_vivado_version 2018.2 +set current_vivado_version [version -short] + +if { [string first $scripts_vivado_version $current_vivado_version] == -1 } { + puts "" + catch {common::send_msg_id "BD_TCL-109" "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."} + + return 1 +} + +################################################################ +# START +################################################################ + +# To test this script, run the following commands from Vivado Tcl console: +# source router_design_script.tcl + +# If there is no project opened, this script will create a +# project, but make sure you do not have an existing project +# <./myproj/project_1.xpr> in the current working folder. + +set list_projs [get_projects -quiet] +if { $list_projs eq "" } { + create_project project_1 myproj -part xc7z020clg400-1 +} + + +# CHANGE DESIGN NAME HERE +variable design_name +set design_name router_design + +# If you do not already have an existing IP Integrator design open, +# you can create a design using the following command: +# create_bd_design $design_name + +# Creating design if needed +set errMsg "" +set nRet 0 + +set cur_design [current_bd_design -quiet] +set list_cells [get_bd_cells -quiet] + +if { ${design_name} eq "" } { + # USE CASES: + # 1) Design_name not set + + set errMsg "Please set the variable to a non-empty value." + set nRet 1 + +} elseif { ${cur_design} ne "" && ${list_cells} eq "" } { + # USE CASES: + # 2): Current design opened AND is empty AND names same. + # 3): Current design opened AND is empty AND names diff; design_name NOT in project. + # 4): Current design opened AND is empty AND names diff; design_name exists in project. + + if { $cur_design ne $design_name } { + common::send_msg_id "BD_TCL-001" "INFO" "Changing value of from <$design_name> to <$cur_design> since current design is empty." + set design_name [get_property NAME $cur_design] + } + common::send_msg_id "BD_TCL-002" "INFO" "Constructing design in IPI design <$cur_design>..." + +} elseif { ${cur_design} ne "" && $list_cells ne "" && $cur_design eq $design_name } { + # USE CASES: + # 5) Current design opened AND has components AND same names. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 1 +} elseif { [get_files -quiet ${design_name}.bd] ne "" } { + # USE CASES: + # 6) Current opened design, has components, but diff names, design_name exists in project. + # 7) No opened design, design_name exists in project. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 2 + +} else { + # USE CASES: + # 8) No opened design, design_name not in project. + # 9) Current opened design, has components, but diff names, design_name not in project. + + common::send_msg_id "BD_TCL-003" "INFO" "Currently there is no design <$design_name> in project, so creating one..." + + create_bd_design $design_name + + common::send_msg_id "BD_TCL-004" "INFO" "Making design <$design_name> as current_bd_design." + current_bd_design $design_name + +} + +common::send_msg_id "BD_TCL-005" "INFO" "Currently the variable is equal to \"$design_name\"." + +if { $nRet != 0 } { + catch {common::send_msg_id "BD_TCL-114" "ERROR" $errMsg} + return $nRet +} + +set bCheckIPsPassed 1 +################################################################## +# CHECK IPs +################################################################## +set bCheckIPs 1 +if { $bCheckIPs == 1 } { + set list_check_ips "\ +xilinx.com:ip:axi_gpio:2.0\ +xilinx.com:ip:processing_system7:5.5\ +xilinx.com:hls:pynqrouter:1.0\ +xilinx.com:ip:proc_sys_reset:5.0\ +" + + set list_ips_missing "" + common::send_msg_id "BD_TCL-006" "INFO" "Checking if the following IPs exist in the project's IP catalog: $list_check_ips ." + + foreach ip_vlnv $list_check_ips { + set ip_obj [get_ipdefs -all $ip_vlnv] + if { $ip_obj eq "" } { + lappend list_ips_missing $ip_vlnv + } + } + + if { $list_ips_missing ne "" } { + catch {common::send_msg_id "BD_TCL-115" "ERROR" "The following IPs are not found in the IP Catalog:\n $list_ips_missing\n\nResolution: Please add the repository containing the IP(s) to the project." } + set bCheckIPsPassed 0 + } + +} + +if { $bCheckIPsPassed != 1 } { + common::send_msg_id "BD_TCL-1003" "WARNING" "Will not continue with creation of design due to the error(s) above." + return 3 +} + +################################################################## +# DESIGN PROCs +################################################################## + + + +# Procedure to create entire design; Provide argument to make +# procedure reusable. If parentCell is "", will use root. +proc create_root_design { parentCell } { + + variable script_folder + variable design_name + + if { $parentCell eq "" } { + set parentCell [get_bd_cells /] + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + + # Create interface ports + set DDR [ create_bd_intf_port -mode Master -vlnv xilinx.com:interface:ddrx_rtl:1.0 DDR ] + set FIXED_IO [ create_bd_intf_port -mode Master -vlnv xilinx.com:display_processing_system7:fixedio_rtl:1.0 FIXED_IO ] + + # Create ports + set LD [ create_bd_port -dir O -from 3 -to 0 LD ] + + # Create instance: axi_gpio_0, and set properties + set axi_gpio_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_0 ] + set_property -dict [ list \ + CONFIG.C_GPIO_WIDTH {4} \ + ] $axi_gpio_0 + + # Create instance: processing_system7_0, and set properties + set processing_system7_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0 ] + set_property -dict [ list \ + CONFIG.PCW_ACT_APU_PERIPHERAL_FREQMHZ {650.000000} \ + CONFIG.PCW_ACT_CAN0_PERIPHERAL_FREQMHZ {23.8095} \ + CONFIG.PCW_ACT_CAN1_PERIPHERAL_FREQMHZ {23.8095} \ + CONFIG.PCW_ACT_CAN_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_DCI_PERIPHERAL_FREQMHZ {10.096154} \ + CONFIG.PCW_ACT_ENET0_PERIPHERAL_FREQMHZ {125.000000} \ + CONFIG.PCW_ACT_ENET1_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ {100.000000} \ + CONFIG.PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_I2C_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_ACT_PCAP_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_QSPI_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_SDIO_PERIPHERAL_FREQMHZ {50.000000} \ + CONFIG.PCW_ACT_SMC_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_SPI_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_TPIU_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_TTC0_CLK0_PERIPHERAL_FREQMHZ {108.333336} \ + CONFIG.PCW_ACT_TTC0_CLK1_PERIPHERAL_FREQMHZ {108.333336} \ + CONFIG.PCW_ACT_TTC0_CLK2_PERIPHERAL_FREQMHZ {108.333336} \ + CONFIG.PCW_ACT_TTC1_CLK0_PERIPHERAL_FREQMHZ {108.333336} \ + CONFIG.PCW_ACT_TTC1_CLK1_PERIPHERAL_FREQMHZ {108.333336} \ + CONFIG.PCW_ACT_TTC1_CLK2_PERIPHERAL_FREQMHZ {108.333336} \ + CONFIG.PCW_ACT_TTC_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_ACT_UART_PERIPHERAL_FREQMHZ {100.000000} \ + CONFIG.PCW_ACT_USB0_PERIPHERAL_FREQMHZ {60} \ + CONFIG.PCW_ACT_USB1_PERIPHERAL_FREQMHZ {60} \ + CONFIG.PCW_ACT_WDT_PERIPHERAL_FREQMHZ {108.333336} \ + CONFIG.PCW_APU_CLK_RATIO_ENABLE {6:2:1} \ + CONFIG.PCW_APU_PERIPHERAL_FREQMHZ {650} \ + CONFIG.PCW_ARMPLL_CTRL_FBDIV {26} \ + CONFIG.PCW_CAN0_BASEADDR {0xE0008000} \ + CONFIG.PCW_CAN0_CAN0_IO {} \ + CONFIG.PCW_CAN0_HIGHADDR {0xE0008FFF} \ + CONFIG.PCW_CAN0_PERIPHERAL_CLKSRC {External} \ + CONFIG.PCW_CAN0_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_CAN0_PERIPHERAL_FREQMHZ {-1} \ + CONFIG.PCW_CAN1_BASEADDR {0xE0009000} \ + CONFIG.PCW_CAN1_CAN1_IO {} \ + CONFIG.PCW_CAN1_HIGHADDR {0xE0009FFF} \ + CONFIG.PCW_CAN1_PERIPHERAL_CLKSRC {External} \ + CONFIG.PCW_CAN1_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_CAN1_PERIPHERAL_FREQMHZ {-1} \ + CONFIG.PCW_CAN_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_CAN_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_CAN_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_CAN_PERIPHERAL_FREQMHZ {100} \ + CONFIG.PCW_CAN_PERIPHERAL_VALID {0} \ + CONFIG.PCW_CLK0_FREQ {100000000} \ + CONFIG.PCW_CLK1_FREQ {10000000} \ + CONFIG.PCW_CLK2_FREQ {10000000} \ + CONFIG.PCW_CLK3_FREQ {10000000} \ + CONFIG.PCW_CORE0_FIQ_INTR {0} \ + CONFIG.PCW_CORE0_IRQ_INTR {0} \ + CONFIG.PCW_CORE1_FIQ_INTR {0} \ + CONFIG.PCW_CORE1_IRQ_INTR {0} \ + CONFIG.PCW_CPU_CPU_6X4X_MAX_RANGE {667} \ + CONFIG.PCW_CPU_CPU_PLL_FREQMHZ {1300.000} \ + CONFIG.PCW_CPU_PERIPHERAL_CLKSRC {ARM PLL} \ + CONFIG.PCW_CPU_PERIPHERAL_DIVISOR0 {2} \ + CONFIG.PCW_CRYSTAL_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_DCI_PERIPHERAL_CLKSRC {DDR PLL} \ + CONFIG.PCW_DCI_PERIPHERAL_DIVISOR0 {52} \ + CONFIG.PCW_DCI_PERIPHERAL_DIVISOR1 {2} \ + CONFIG.PCW_DCI_PERIPHERAL_FREQMHZ {10.159} \ + CONFIG.PCW_DDRPLL_CTRL_FBDIV {21} \ + CONFIG.PCW_DDR_DDR_PLL_FREQMHZ {1050.000} \ + CONFIG.PCW_DDR_HPRLPR_QUEUE_PARTITION {HPR(0)/LPR(32)} \ + CONFIG.PCW_DDR_HPR_TO_CRITICAL_PRIORITY_LEVEL {15} \ + CONFIG.PCW_DDR_LPR_TO_CRITICAL_PRIORITY_LEVEL {2} \ + CONFIG.PCW_DDR_PERIPHERAL_CLKSRC {DDR PLL} \ + CONFIG.PCW_DDR_PERIPHERAL_DIVISOR0 {2} \ + CONFIG.PCW_DDR_PORT0_HPR_ENABLE {0} \ + CONFIG.PCW_DDR_PORT1_HPR_ENABLE {0} \ + CONFIG.PCW_DDR_PORT2_HPR_ENABLE {0} \ + CONFIG.PCW_DDR_PORT3_HPR_ENABLE {0} \ + CONFIG.PCW_DDR_PRIORITY_READPORT_0 {} \ + CONFIG.PCW_DDR_PRIORITY_READPORT_2 {} \ + CONFIG.PCW_DDR_PRIORITY_WRITEPORT_0 {} \ + CONFIG.PCW_DDR_PRIORITY_WRITEPORT_2 {} \ + CONFIG.PCW_DDR_RAM_BASEADDR {0x00100000} \ + CONFIG.PCW_DDR_RAM_HIGHADDR {0x1FFFFFFF} \ + CONFIG.PCW_DDR_WRITE_TO_CRITICAL_PRIORITY_LEVEL {2} \ + CONFIG.PCW_DM_WIDTH {4} \ + CONFIG.PCW_DQS_WIDTH {4} \ + CONFIG.PCW_DQ_WIDTH {32} \ + CONFIG.PCW_ENET0_BASEADDR {0xE000B000} \ + CONFIG.PCW_ENET0_ENET0_IO {MIO 16 .. 27} \ + CONFIG.PCW_ENET0_GRP_MDIO_ENABLE {1} \ + CONFIG.PCW_ENET0_GRP_MDIO_IO {MIO 52 .. 53} \ + CONFIG.PCW_ENET0_HIGHADDR {0xE000BFFF} \ + CONFIG.PCW_ENET0_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR0 {8} \ + CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_ENET0_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_ENET0_PERIPHERAL_FREQMHZ {1000 Mbps} \ + CONFIG.PCW_ENET0_RESET_ENABLE {1} \ + CONFIG.PCW_ENET0_RESET_IO {MIO 9} \ + CONFIG.PCW_ENET1_BASEADDR {0xE000C000} \ + CONFIG.PCW_ENET1_ENET1_IO {} \ + CONFIG.PCW_ENET1_HIGHADDR {0xE000CFFF} \ + CONFIG.PCW_ENET1_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_ENET1_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_ENET1_PERIPHERAL_FREQMHZ {1000 Mbps} \ + CONFIG.PCW_ENET1_RESET_ENABLE {0} \ + CONFIG.PCW_ENET1_RESET_IO {} \ + CONFIG.PCW_FTM_CTI_IN1 {} \ + CONFIG.PCW_FTM_CTI_IN3 {} \ + CONFIG.PCW_FTM_CTI_OUT1 {} \ + CONFIG.PCW_FTM_CTI_OUT3 {} \ + CONFIG.PCW_GPIO_EMIO_GPIO_WIDTH {64} \ + CONFIG.PCW_GPIO_HIGHADDR {0xE000AFFF} \ + CONFIG.PCW_GPIO_MIO_GPIO_ENABLE {1} \ + CONFIG.PCW_GPIO_MIO_GPIO_IO {MIO} \ + CONFIG.PCW_GPIO_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_I2C0_BASEADDR {0xE0004000} \ + CONFIG.PCW_I2C0_GRP_INT_ENABLE {0} \ + CONFIG.PCW_I2C0_GRP_INT_IO {} \ + CONFIG.PCW_I2C0_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_I2C0_RESET_ENABLE {0} \ + CONFIG.PCW_I2C0_RESET_IO {} \ + CONFIG.PCW_I2C1_HIGHADDR {0xE0005FFF} \ + CONFIG.PCW_I2C1_I2C1_IO {} \ + CONFIG.PCW_I2C_PERIPHERAL_FREQMHZ {25} \ + CONFIG.PCW_I2C_RESET_ENABLE {1} \ + CONFIG.PCW_I2C_RESET_POLARITY {Active Low} \ + CONFIG.PCW_I2C_RESET_SELECT {} \ + CONFIG.PCW_NAND_NAND_IO {} \ + CONFIG.PCW_NOR_GRP_CS0_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_CS0_IO {} \ + CONFIG.PCW_NOR_GRP_SRAM_CS0_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_SRAM_CS0_IO {} \ + CONFIG.PCW_NOR_GRP_SRAM_INT_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_SRAM_INT_IO {} \ + CONFIG.PCW_NOR_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_NOR_SRAM_CS0_T_CEOE {1} \ + CONFIG.PCW_NOR_SRAM_CS0_T_PC {1} \ + CONFIG.PCW_NOR_SRAM_CS0_T_RC {11} \ + CONFIG.PCW_NOR_SRAM_CS0_T_TR {1} \ + CONFIG.PCW_NOR_SRAM_CS0_T_WC {11} \ + CONFIG.PCW_NOR_SRAM_CS0_T_WP {1} \ + CONFIG.PCW_NOR_SRAM_CS0_WE_TIME {0} \ + CONFIG.PCW_NOR_SRAM_CS1_T_CEOE {1} \ + CONFIG.PCW_NOR_SRAM_CS1_T_PC {1} \ + CONFIG.PCW_NOR_SRAM_CS1_T_RC {11} \ + CONFIG.PCW_NOR_SRAM_CS1_T_TR {1} \ + CONFIG.PCW_NOR_SRAM_CS1_T_WC {11} \ + CONFIG.PCW_NOR_SRAM_CS1_T_WP {1} \ + CONFIG.PCW_NOR_SRAM_CS1_WE_TIME {0} \ + CONFIG.PCW_OVERRIDE_BASIC_CLOCK {0} \ + CONFIG.PCW_P2F_CAN0_INTR {0} \ + CONFIG.PCW_P2F_CAN1_INTR {0} \ + CONFIG.PCW_P2F_CTI_INTR {0} \ + CONFIG.PCW_P2F_DMAC0_INTR {0} \ + CONFIG.PCW_P2F_DMAC1_INTR {0} \ + CONFIG.PCW_P2F_DMAC2_INTR {0} \ + CONFIG.PCW_P2F_DMAC3_INTR {0} \ + CONFIG.PCW_P2F_DMAC4_INTR {0} \ + CONFIG.PCW_P2F_DMAC5_INTR {0} \ + CONFIG.PCW_P2F_DMAC6_INTR {0} \ + CONFIG.PCW_P2F_DMAC7_INTR {0} \ + CONFIG.PCW_P2F_DMAC_ABORT_INTR {0} \ + CONFIG.PCW_P2F_ENET0_INTR {0} \ + CONFIG.PCW_P2F_ENET1_INTR {0} \ + CONFIG.PCW_P2F_GPIO_INTR {0} \ + CONFIG.PCW_P2F_I2C0_INTR {0} \ + CONFIG.PCW_P2F_I2C1_INTR {0} \ + CONFIG.PCW_P2F_QSPI_INTR {0} \ + CONFIG.PCW_P2F_SDIO0_INTR {0} \ + CONFIG.PCW_P2F_SDIO1_INTR {0} \ + CONFIG.PCW_P2F_SMC_INTR {0} \ + CONFIG.PCW_P2F_SPI0_INTR {0} \ + CONFIG.PCW_P2F_SPI1_INTR {0} \ + CONFIG.PCW_P2F_UART0_INTR {0} \ + CONFIG.PCW_P2F_UART1_INTR {0} \ + CONFIG.PCW_P2F_USB0_INTR {0} \ + CONFIG.PCW_P2F_USB1_INTR {0} \ + CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY0 {0.223} \ + CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY1 {0.212} \ + CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY2 {0.085} \ + CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY3 {0.092} \ + CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_0 {0.040} \ + CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_1 {0.058} \ + CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_2 {-0.009} \ + CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_3 {-0.033} \ + CONFIG.PCW_PACKAGE_NAME {clg400} \ + CONFIG.PCW_PCAP_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_PCAP_PERIPHERAL_DIVISOR0 {5} \ + CONFIG.PCW_PCAP_PERIPHERAL_FREQMHZ {200} \ + CONFIG.PCW_PERIPHERAL_BOARD_PRESET {None} \ + CONFIG.PCW_PJTAG_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_PJTAG_PJTAG_IO {} \ + CONFIG.PCW_QSPI_GRP_SINGLE_SS_ENABLE {1} \ + CONFIG.PCW_QSPI_GRP_SINGLE_SS_IO {MIO 1 .. 6} \ + CONFIG.PCW_QSPI_GRP_SS1_ENABLE {0} \ + CONFIG.PCW_QSPI_GRP_SS1_IO {} \ + CONFIG.PCW_SD0_GRP_WP_ENABLE {0} \ + CONFIG.PCW_SD0_GRP_WP_IO {} \ + CONFIG.PCW_SD1_GRP_POW_ENABLE {0} \ + CONFIG.PCW_SD1_GRP_POW_IO {} \ + CONFIG.PCW_SD1_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_SD1_SD1_IO {} \ + CONFIG.PCW_SPI0_GRP_SS1_ENABLE {0} \ + CONFIG.PCW_SPI0_GRP_SS1_IO {} \ + CONFIG.PCW_SPI0_HIGHADDR {0xE0006FFF} \ + CONFIG.PCW_SPI0_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_SPI0_SPI0_IO {} \ + CONFIG.PCW_SPI1_GRP_SS1_ENABLE {0} \ + CONFIG.PCW_SPI1_GRP_SS1_IO {} \ + CONFIG.PCW_SPI1_HIGHADDR {0xE0007FFF} \ + CONFIG.PCW_SPI1_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_SPI1_SPI1_IO {} \ + CONFIG.PCW_TRACE_GRP_2BIT_ENABLE {0} \ + CONFIG.PCW_TRACE_GRP_2BIT_IO {} \ + CONFIG.PCW_TRACE_GRP_4BIT_ENABLE {0} \ + CONFIG.PCW_TRACE_GRP_4BIT_IO {} \ + CONFIG.PCW_TRACE_INTERNAL_WIDTH {2} \ + CONFIG.PCW_TRACE_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_TRACE_PIPELINE_WIDTH {8} \ + CONFIG.PCW_TRACE_TRACE_IO {} \ + CONFIG.PCW_TTC1_BASEADDR {0xE0105000} \ + CONFIG.PCW_TTC1_CLK0_PERIPHERAL_CLKSRC {CPU_1X} \ + CONFIG.PCW_TTC1_CLK0_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_TTC1_CLK0_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC1_CLK1_PERIPHERAL_CLKSRC {CPU_1X} \ + CONFIG.PCW_TTC1_CLK1_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_TTC1_CLK1_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC1_CLK2_PERIPHERAL_CLKSRC {CPU_1X} \ + CONFIG.PCW_TTC1_CLK2_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_TTC1_CLK2_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC1_HIGHADDR {0xE0105fff} \ + CONFIG.PCW_TTC1_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_TTC1_TTC1_IO {} \ + CONFIG.PCW_UART0_HIGHADDR {0xE0000FFF} \ + CONFIG.PCW_UART0_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_UART0_UART0_IO {MIO 14 .. 15} \ + CONFIG.PCW_UART1_BASEADDR {0xE0001000} \ + CONFIG.PCW_UART1_BAUD_RATE {115200} \ + CONFIG.PCW_UART1_GRP_FULL_ENABLE {0} \ + CONFIG.PCW_UART1_GRP_FULL_IO {} \ + CONFIG.PCW_UART_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_UART_PERIPHERAL_DIVISOR0 {10} \ + CONFIG.PCW_UART_PERIPHERAL_FREQMHZ {100} \ + CONFIG.PCW_UART_PERIPHERAL_VALID {1} \ + CONFIG.PCW_UIPARAM_ACT_DDR_FREQ_MHZ {525.000000} \ + CONFIG.PCW_UIPARAM_DDR_ADV_ENABLE {0} \ + CONFIG.PCW_UIPARAM_DDR_AL {0} \ + CONFIG.PCW_UIPARAM_DDR_BANK_ADDR_COUNT {3} \ + CONFIG.PCW_UIPARAM_DDR_BL {8} \ + CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY0 {0.223} \ + CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY1 {0.212} \ + CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY2 {0.085} \ + CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY3 {0.092} \ + CONFIG.PCW_UIPARAM_DDR_BUS_WIDTH {16 Bit} \ + CONFIG.PCW_UIPARAM_DDR_CL {7} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_0_LENGTH_MM {25.8} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_0_PACKAGE_LENGTH {80.4535} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_0_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_1_LENGTH_MM {25.8} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_1_PACKAGE_LENGTH {80.4535} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_1_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_2_LENGTH_MM {0} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_2_PACKAGE_LENGTH {80.4535} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_2_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_3_LENGTH_MM {0} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_3_PACKAGE_LENGTH {80.4535} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_3_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_CLOCK_STOP_EN {0} \ + CONFIG.PCW_UIPARAM_DDR_COL_ADDR_COUNT {10} \ + CONFIG.PCW_UIPARAM_DDR_CWL {6} \ + CONFIG.PCW_UIPARAM_DDR_DEVICE_CAPACITY {4096 MBits} \ + CONFIG.PCW_UIPARAM_DDR_DQS_0_LENGTH_MM {15.6} \ + CONFIG.PCW_UIPARAM_DDR_DQS_0_PACKAGE_LENGTH {105.056} \ + CONFIG.PCW_UIPARAM_DDR_DQS_0_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_DQS_1_LENGTH_MM {18.8} \ + CONFIG.PCW_UIPARAM_DDR_DQS_1_PACKAGE_LENGTH {66.904} \ + CONFIG.PCW_UIPARAM_DDR_DQS_1_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_DQS_2_LENGTH_MM {0} \ + CONFIG.PCW_UIPARAM_DDR_DQS_2_PACKAGE_LENGTH {89.1715} \ + CONFIG.PCW_UIPARAM_DDR_DQS_2_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_DQS_3_LENGTH_MM {0} \ + CONFIG.PCW_UIPARAM_DDR_DQS_3_PACKAGE_LENGTH {113.63} \ + CONFIG.PCW_UIPARAM_DDR_DQS_3_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_0 {0.040} \ + CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_1 {0.058} \ + CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_2 {-0.009} \ + CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_3 {-0.033} \ + CONFIG.PCW_UIPARAM_DDR_DQ_0_LENGTH_MM {16.5} \ + CONFIG.PCW_UIPARAM_DDR_DQ_0_PACKAGE_LENGTH {98.503} \ + CONFIG.PCW_UIPARAM_DDR_DQ_0_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_DQ_1_LENGTH_MM {18} \ + CONFIG.PCW_UIPARAM_DDR_DQ_1_PACKAGE_LENGTH {68.5855} \ + CONFIG.PCW_UIPARAM_DDR_DQ_1_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_DQ_2_LENGTH_MM {0} \ + CONFIG.PCW_UIPARAM_DDR_DQ_2_PACKAGE_LENGTH {90.295} \ + CONFIG.PCW_UIPARAM_DDR_DQ_2_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_DQ_3_LENGTH_MM {0} \ + CONFIG.PCW_UIPARAM_DDR_DQ_3_PACKAGE_LENGTH {103.977} \ + CONFIG.PCW_UIPARAM_DDR_DQ_3_PROPOGATION_DELAY {160} \ + CONFIG.PCW_UIPARAM_DDR_DRAM_WIDTH {16 Bits} \ + CONFIG.PCW_UIPARAM_DDR_ECC {Disabled} \ + CONFIG.PCW_UIPARAM_DDR_ENABLE {1} \ + CONFIG.PCW_UIPARAM_DDR_FREQ_MHZ {525} \ + CONFIG.PCW_UIPARAM_DDR_HIGH_TEMP {Normal (0-85)} \ + CONFIG.PCW_UIPARAM_DDR_MEMORY_TYPE {DDR 3} \ + CONFIG.PCW_UIPARAM_DDR_PARTNO {MT41J256M16 RE-125} \ + CONFIG.PCW_UIPARAM_DDR_ROW_ADDR_COUNT {15} \ + CONFIG.PCW_UIPARAM_DDR_SPEED_BIN {DDR3_1066F} \ + CONFIG.PCW_UIPARAM_DDR_TRAIN_DATA_EYE {1} \ + CONFIG.PCW_UIPARAM_DDR_TRAIN_READ_GATE {1} \ + CONFIG.PCW_UIPARAM_DDR_TRAIN_WRITE_LEVEL {1} \ + CONFIG.PCW_UIPARAM_DDR_T_FAW {40.0} \ + CONFIG.PCW_UIPARAM_DDR_T_RAS_MIN {35.0} \ + CONFIG.PCW_UIPARAM_DDR_T_RC {48.91} \ + CONFIG.PCW_UIPARAM_DDR_T_RCD {7} \ + CONFIG.PCW_UIPARAM_DDR_T_RP {7} \ + CONFIG.PCW_UIPARAM_DDR_USE_INTERNAL_VREF {0} \ + CONFIG.PCW_UIPARAM_GENERATE_SUMMARY {NA} \ + CONFIG.PCW_USB0_BASEADDR {0xE0102000} \ + CONFIG.PCW_USB0_HIGHADDR {0xE0102fff} \ + CONFIG.PCW_USB0_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_USB0_PERIPHERAL_FREQMHZ {60} \ + CONFIG.PCW_USB0_RESET_ENABLE {1} \ + CONFIG.PCW_USB0_RESET_IO {MIO 46} \ + CONFIG.PCW_USB0_USB0_IO {MIO 28 .. 39} \ + CONFIG.PCW_USB1_BASEADDR {0xE0103000} \ + CONFIG.PCW_USB1_HIGHADDR {0xE0103fff} \ + CONFIG.PCW_USB1_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_USB1_PERIPHERAL_FREQMHZ {60} \ + CONFIG.PCW_USB1_RESET_ENABLE {0} \ + CONFIG.PCW_USB1_RESET_IO {} \ + CONFIG.PCW_USB_RESET_ENABLE {1} \ + CONFIG.PCW_USB_RESET_POLARITY {Active Low} \ + CONFIG.PCW_USB_RESET_SELECT {Share reset pin} \ + CONFIG.PCW_USE_AXI_FABRIC_IDLE {0} \ + CONFIG.PCW_USE_AXI_NONSECURE {0} \ + CONFIG.PCW_USE_CORESIGHT {0} \ + CONFIG.PCW_USE_CROSS_TRIGGER {0} \ + CONFIG.PCW_USE_CR_FABRIC {1} \ + CONFIG.PCW_USE_DDR_BYPASS {0} \ + CONFIG.PCW_USE_DEBUG {0} \ + CONFIG.PCW_USE_DEFAULT_ACP_USER_VAL {0} \ + CONFIG.PCW_USE_DMA0 {0} \ + CONFIG.PCW_USE_DMA1 {0} \ + CONFIG.PCW_USE_DMA2 {0} \ + CONFIG.PCW_USE_DMA3 {0} \ + CONFIG.PCW_USE_EXPANDED_IOP {0} \ + CONFIG.PCW_USE_EXPANDED_PS_SLCR_REGISTERS {0} \ + CONFIG.PCW_USE_FABRIC_INTERRUPT {0} \ + CONFIG.PCW_USE_HIGH_OCM {0} \ + CONFIG.PCW_USE_M_AXI_GP0 {1} \ + CONFIG.PCW_USE_M_AXI_GP1 {0} \ + CONFIG.PCW_USE_PROC_EVENT_BUS {0} \ + CONFIG.PCW_USE_PS_SLCR_REGISTERS {0} \ + CONFIG.PCW_USE_S_AXI_ACP {0} \ + CONFIG.PCW_USE_S_AXI_GP0 {0} \ + CONFIG.PCW_USE_S_AXI_GP1 {0} \ + CONFIG.PCW_USE_S_AXI_HP0 {0} \ + CONFIG.PCW_USE_S_AXI_HP1 {0} \ + CONFIG.PCW_USE_S_AXI_HP2 {0} \ + CONFIG.PCW_USE_S_AXI_HP3 {0} \ + CONFIG.PCW_USE_TRACE {0} \ + CONFIG.PCW_USE_TRACE_DATA_EDGE_DETECTOR {0} \ + CONFIG.PCW_VALUE_SILVERSION {3} \ + CONFIG.PCW_WDT_PERIPHERAL_CLKSRC {CPU_1X} \ + CONFIG.PCW_WDT_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_WDT_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_WDT_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_WDT_WDT_IO {} \ + CONFIG.PCW_CAN0_GRP_CLK_ENABLE {0} \ + CONFIG.PCW_CAN0_GRP_CLK_IO {} \ + CONFIG.PCW_CAN1_GRP_CLK_ENABLE {0} \ + CONFIG.PCW_CAN1_GRP_CLK_IO {} \ + CONFIG.PCW_DDR_PRIORITY_READPORT_1 {} \ + CONFIG.PCW_DDR_PRIORITY_READPORT_3 {} \ + CONFIG.PCW_DDR_PRIORITY_WRITEPORT_1 {} \ + CONFIG.PCW_DDR_PRIORITY_WRITEPORT_3 {} \ + CONFIG.PCW_ENET1_GRP_MDIO_ENABLE {0} \ + CONFIG.PCW_ENET1_GRP_MDIO_IO {} \ + CONFIG.PCW_ENET_RESET_ENABLE {1} \ + CONFIG.PCW_ENET_RESET_POLARITY {Active Low} \ + CONFIG.PCW_ENET_RESET_SELECT {Share reset pin} \ + CONFIG.PCW_EN_4K_TIMER {0} \ + CONFIG.PCW_EN_CAN0 {0} \ + CONFIG.PCW_EN_CAN1 {0} \ + CONFIG.PCW_EN_CLK0_PORT {1} \ + CONFIG.PCW_EN_CLK1_PORT {0} \ + CONFIG.PCW_EN_CLK2_PORT {0} \ + CONFIG.PCW_EN_CLK3_PORT {0} \ + CONFIG.PCW_EN_CLKTRIG0_PORT {0} \ + CONFIG.PCW_EN_CLKTRIG1_PORT {0} \ + CONFIG.PCW_EN_CLKTRIG2_PORT {0} \ + CONFIG.PCW_EN_CLKTRIG3_PORT {0} \ + CONFIG.PCW_EN_DDR {1} \ + CONFIG.PCW_EN_EMIO_CAN0 {0} \ + CONFIG.PCW_EN_EMIO_CAN1 {0} \ + CONFIG.PCW_EN_EMIO_CD_SDIO0 {0} \ + CONFIG.PCW_EN_EMIO_CD_SDIO1 {0} \ + CONFIG.PCW_EN_EMIO_ENET0 {0} \ + CONFIG.PCW_EN_EMIO_ENET1 {0} \ + CONFIG.PCW_EN_EMIO_GPIO {0} \ + CONFIG.PCW_EN_EMIO_I2C0 {0} \ + CONFIG.PCW_EN_EMIO_I2C1 {0} \ + CONFIG.PCW_EN_EMIO_MODEM_UART0 {0} \ + CONFIG.PCW_EN_EMIO_MODEM_UART1 {0} \ + CONFIG.PCW_EN_EMIO_PJTAG {0} \ + CONFIG.PCW_EN_EMIO_SDIO0 {0} \ + CONFIG.PCW_EN_EMIO_SDIO1 {0} \ + CONFIG.PCW_EN_EMIO_SPI0 {0} \ + CONFIG.PCW_EN_EMIO_SPI1 {0} \ + CONFIG.PCW_EN_EMIO_SRAM_INT {0} \ + CONFIG.PCW_EN_EMIO_TRACE {0} \ + CONFIG.PCW_EN_EMIO_TTC0 {0} \ + CONFIG.PCW_EN_EMIO_TTC1 {0} \ + CONFIG.PCW_EN_EMIO_UART0 {0} \ + CONFIG.PCW_EN_EMIO_UART1 {0} \ + CONFIG.PCW_EN_EMIO_WDT {0} \ + CONFIG.PCW_EN_EMIO_WP_SDIO0 {0} \ + CONFIG.PCW_EN_EMIO_WP_SDIO1 {0} \ + CONFIG.PCW_EN_ENET0 {1} \ + CONFIG.PCW_EN_ENET1 {0} \ + CONFIG.PCW_EN_GPIO {1} \ + CONFIG.PCW_EN_I2C0 {0} \ + CONFIG.PCW_EN_I2C1 {0} \ + CONFIG.PCW_EN_MODEM_UART0 {0} \ + CONFIG.PCW_EN_MODEM_UART1 {0} \ + CONFIG.PCW_EN_PJTAG {0} \ + CONFIG.PCW_EN_PTP_ENET0 {0} \ + CONFIG.PCW_EN_PTP_ENET1 {0} \ + CONFIG.PCW_EN_QSPI {1} \ + CONFIG.PCW_EN_RST0_PORT {1} \ + CONFIG.PCW_EN_RST1_PORT {0} \ + CONFIG.PCW_EN_RST2_PORT {0} \ + CONFIG.PCW_EN_RST3_PORT {0} \ + CONFIG.PCW_EN_SDIO0 {1} \ + CONFIG.PCW_EN_SDIO1 {0} \ + CONFIG.PCW_EN_SMC {0} \ + CONFIG.PCW_EN_SPI0 {0} \ + CONFIG.PCW_EN_SPI1 {0} \ + CONFIG.PCW_EN_TRACE {0} \ + CONFIG.PCW_EN_TTC0 {0} \ + CONFIG.PCW_EN_TTC1 {0} \ + CONFIG.PCW_EN_UART0 {1} \ + CONFIG.PCW_EN_UART1 {0} \ + CONFIG.PCW_EN_USB0 {1} \ + CONFIG.PCW_EN_USB1 {0} \ + CONFIG.PCW_EN_WDT {0} \ + CONFIG.PCW_FCLK0_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR0 {5} \ + CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR1 {2} \ + CONFIG.PCW_FCLK1_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK2_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK3_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK_CLK0_BUF {TRUE} \ + CONFIG.PCW_FCLK_CLK1_BUF {FALSE} \ + CONFIG.PCW_FCLK_CLK2_BUF {FALSE} \ + CONFIG.PCW_FCLK_CLK3_BUF {FALSE} \ + CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ {100} \ + CONFIG.PCW_FPGA1_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_FPGA2_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_FPGA3_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_FPGA_FCLK0_ENABLE {1} \ + CONFIG.PCW_FPGA_FCLK1_ENABLE {0} \ + CONFIG.PCW_FPGA_FCLK2_ENABLE {0} \ + CONFIG.PCW_FPGA_FCLK3_ENABLE {0} \ + CONFIG.PCW_FTM_CTI_IN0 {} \ + CONFIG.PCW_FTM_CTI_IN2 {} \ + CONFIG.PCW_FTM_CTI_OUT0 {} \ + CONFIG.PCW_FTM_CTI_OUT2 {} \ + CONFIG.PCW_GPIO_BASEADDR {0xE000A000} \ + CONFIG.PCW_GPIO_EMIO_GPIO_ENABLE {0} \ + CONFIG.PCW_GPIO_EMIO_GPIO_IO {} \ + CONFIG.PCW_I2C0_HIGHADDR {0xE0004FFF} \ + CONFIG.PCW_I2C0_I2C0_IO {} \ + CONFIG.PCW_I2C1_BASEADDR {0xE0005000} \ + CONFIG.PCW_I2C1_GRP_INT_ENABLE {0} \ + CONFIG.PCW_I2C1_GRP_INT_IO {} \ + CONFIG.PCW_I2C1_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_I2C1_RESET_ENABLE {0} \ + CONFIG.PCW_I2C1_RESET_IO {} \ + CONFIG.PCW_IMPORT_BOARD_PRESET {None} \ + CONFIG.PCW_INCLUDE_ACP_TRANS_CHECK {0} \ + CONFIG.PCW_INCLUDE_TRACE_BUFFER {0} \ + CONFIG.PCW_IOPLL_CTRL_FBDIV {20} \ + CONFIG.PCW_IO_IO_PLL_FREQMHZ {1000.000} \ + CONFIG.PCW_IRQ_F2P_INTR {0} \ + CONFIG.PCW_IRQ_F2P_MODE {DIRECT} \ + CONFIG.PCW_MIO_0_DIRECTION {inout} \ + CONFIG.PCW_MIO_0_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_0_PULLUP {enabled} \ + CONFIG.PCW_MIO_0_SLEW {slow} \ + CONFIG.PCW_MIO_10_DIRECTION {inout} \ + CONFIG.PCW_MIO_10_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_10_PULLUP {enabled} \ + CONFIG.PCW_MIO_10_SLEW {slow} \ + CONFIG.PCW_MIO_11_DIRECTION {inout} \ + CONFIG.PCW_MIO_11_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_11_PULLUP {enabled} \ + CONFIG.PCW_MIO_11_SLEW {slow} \ + CONFIG.PCW_MIO_12_DIRECTION {inout} \ + CONFIG.PCW_MIO_12_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_12_PULLUP {enabled} \ + CONFIG.PCW_MIO_12_SLEW {slow} \ + CONFIG.PCW_MIO_13_DIRECTION {inout} \ + CONFIG.PCW_MIO_13_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_13_PULLUP {enabled} \ + CONFIG.PCW_MIO_13_SLEW {slow} \ + CONFIG.PCW_MIO_14_DIRECTION {in} \ + CONFIG.PCW_MIO_14_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_14_PULLUP {enabled} \ + CONFIG.PCW_MIO_14_SLEW {slow} \ + CONFIG.PCW_MIO_15_DIRECTION {out} \ + CONFIG.PCW_MIO_15_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_15_PULLUP {enabled} \ + CONFIG.PCW_MIO_15_SLEW {slow} \ + CONFIG.PCW_MIO_16_DIRECTION {out} \ + CONFIG.PCW_MIO_16_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_16_PULLUP {enabled} \ + CONFIG.PCW_MIO_16_SLEW {slow} \ + CONFIG.PCW_MIO_17_DIRECTION {out} \ + CONFIG.PCW_MIO_17_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_17_PULLUP {enabled} \ + CONFIG.PCW_MIO_17_SLEW {slow} \ + CONFIG.PCW_MIO_18_DIRECTION {out} \ + CONFIG.PCW_MIO_18_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_18_PULLUP {enabled} \ + CONFIG.PCW_MIO_18_SLEW {slow} \ + CONFIG.PCW_MIO_19_DIRECTION {out} \ + CONFIG.PCW_MIO_19_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_19_PULLUP {enabled} \ + CONFIG.PCW_MIO_19_SLEW {slow} \ + CONFIG.PCW_MIO_1_DIRECTION {out} \ + CONFIG.PCW_MIO_1_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_1_PULLUP {enabled} \ + CONFIG.PCW_MIO_1_SLEW {slow} \ + CONFIG.PCW_MIO_20_DIRECTION {out} \ + CONFIG.PCW_MIO_20_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_20_PULLUP {enabled} \ + CONFIG.PCW_MIO_20_SLEW {slow} \ + CONFIG.PCW_MIO_21_DIRECTION {out} \ + CONFIG.PCW_MIO_21_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_21_PULLUP {enabled} \ + CONFIG.PCW_MIO_21_SLEW {slow} \ + CONFIG.PCW_MIO_22_DIRECTION {in} \ + CONFIG.PCW_MIO_22_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_22_PULLUP {enabled} \ + CONFIG.PCW_MIO_22_SLEW {slow} \ + CONFIG.PCW_MIO_23_DIRECTION {in} \ + CONFIG.PCW_MIO_23_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_23_PULLUP {enabled} \ + CONFIG.PCW_MIO_23_SLEW {slow} \ + CONFIG.PCW_MIO_24_DIRECTION {in} \ + CONFIG.PCW_MIO_24_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_24_PULLUP {enabled} \ + CONFIG.PCW_MIO_24_SLEW {slow} \ + CONFIG.PCW_MIO_25_DIRECTION {in} \ + CONFIG.PCW_MIO_25_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_25_PULLUP {enabled} \ + CONFIG.PCW_MIO_25_SLEW {slow} \ + CONFIG.PCW_MIO_26_DIRECTION {in} \ + CONFIG.PCW_MIO_26_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_26_PULLUP {enabled} \ + CONFIG.PCW_MIO_26_SLEW {slow} \ + CONFIG.PCW_MIO_27_DIRECTION {in} \ + CONFIG.PCW_MIO_27_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_27_PULLUP {enabled} \ + CONFIG.PCW_MIO_27_SLEW {slow} \ + CONFIG.PCW_MIO_28_DIRECTION {inout} \ + CONFIG.PCW_MIO_28_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_28_PULLUP {enabled} \ + CONFIG.PCW_MIO_28_SLEW {slow} \ + CONFIG.PCW_MIO_29_DIRECTION {in} \ + CONFIG.PCW_MIO_29_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_29_PULLUP {enabled} \ + CONFIG.PCW_MIO_29_SLEW {slow} \ + CONFIG.PCW_MIO_2_DIRECTION {inout} \ + CONFIG.PCW_MIO_2_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_2_PULLUP {disabled} \ + CONFIG.PCW_MIO_2_SLEW {slow} \ + CONFIG.PCW_MIO_30_DIRECTION {out} \ + CONFIG.PCW_MIO_30_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_30_PULLUP {enabled} \ + CONFIG.PCW_MIO_30_SLEW {slow} \ + CONFIG.PCW_MIO_31_DIRECTION {in} \ + CONFIG.PCW_MIO_31_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_31_PULLUP {enabled} \ + CONFIG.PCW_MIO_31_SLEW {slow} \ + CONFIG.PCW_MIO_32_DIRECTION {inout} \ + CONFIG.PCW_MIO_32_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_32_PULLUP {enabled} \ + CONFIG.PCW_MIO_32_SLEW {slow} \ + CONFIG.PCW_MIO_33_DIRECTION {inout} \ + CONFIG.PCW_MIO_33_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_33_PULLUP {enabled} \ + CONFIG.PCW_MIO_33_SLEW {slow} \ + CONFIG.PCW_MIO_34_DIRECTION {inout} \ + CONFIG.PCW_MIO_34_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_34_PULLUP {enabled} \ + CONFIG.PCW_MIO_34_SLEW {slow} \ + CONFIG.PCW_MIO_35_DIRECTION {inout} \ + CONFIG.PCW_MIO_35_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_35_PULLUP {enabled} \ + CONFIG.PCW_MIO_35_SLEW {slow} \ + CONFIG.PCW_MIO_36_DIRECTION {in} \ + CONFIG.PCW_MIO_36_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_36_PULLUP {enabled} \ + CONFIG.PCW_MIO_36_SLEW {slow} \ + CONFIG.PCW_MIO_37_DIRECTION {inout} \ + CONFIG.PCW_MIO_37_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_37_PULLUP {enabled} \ + CONFIG.PCW_MIO_37_SLEW {slow} \ + CONFIG.PCW_MIO_38_DIRECTION {inout} \ + CONFIG.PCW_MIO_38_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_38_PULLUP {enabled} \ + CONFIG.PCW_MIO_38_SLEW {slow} \ + CONFIG.PCW_MIO_39_DIRECTION {inout} \ + CONFIG.PCW_MIO_39_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_39_PULLUP {enabled} \ + CONFIG.PCW_MIO_39_SLEW {slow} \ + CONFIG.PCW_MIO_3_DIRECTION {inout} \ + CONFIG.PCW_MIO_3_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_3_PULLUP {disabled} \ + CONFIG.PCW_MIO_3_SLEW {slow} \ + CONFIG.PCW_MIO_40_DIRECTION {inout} \ + CONFIG.PCW_MIO_40_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_40_PULLUP {enabled} \ + CONFIG.PCW_MIO_40_SLEW {slow} \ + CONFIG.PCW_MIO_41_DIRECTION {inout} \ + CONFIG.PCW_MIO_41_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_41_PULLUP {enabled} \ + CONFIG.PCW_MIO_41_SLEW {slow} \ + CONFIG.PCW_MIO_42_DIRECTION {inout} \ + CONFIG.PCW_MIO_42_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_42_PULLUP {enabled} \ + CONFIG.PCW_MIO_42_SLEW {slow} \ + CONFIG.PCW_MIO_43_DIRECTION {inout} \ + CONFIG.PCW_MIO_43_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_43_PULLUP {enabled} \ + CONFIG.PCW_MIO_43_SLEW {slow} \ + CONFIG.PCW_MIO_44_DIRECTION {inout} \ + CONFIG.PCW_MIO_44_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_44_PULLUP {enabled} \ + CONFIG.PCW_MIO_44_SLEW {slow} \ + CONFIG.PCW_MIO_45_DIRECTION {inout} \ + CONFIG.PCW_MIO_45_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_45_PULLUP {enabled} \ + CONFIG.PCW_MIO_45_SLEW {slow} \ + CONFIG.PCW_MIO_46_DIRECTION {out} \ + CONFIG.PCW_MIO_46_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_46_PULLUP {enabled} \ + CONFIG.PCW_MIO_46_SLEW {slow} \ + CONFIG.PCW_MIO_47_DIRECTION {in} \ + CONFIG.PCW_MIO_47_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_47_PULLUP {enabled} \ + CONFIG.PCW_MIO_47_SLEW {slow} \ + CONFIG.PCW_MIO_48_DIRECTION {inout} \ + CONFIG.PCW_MIO_48_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_48_PULLUP {enabled} \ + CONFIG.PCW_MIO_48_SLEW {slow} \ + CONFIG.PCW_MIO_49_DIRECTION {inout} \ + CONFIG.PCW_MIO_49_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_49_PULLUP {enabled} \ + CONFIG.PCW_MIO_49_SLEW {slow} \ + CONFIG.PCW_MIO_4_DIRECTION {inout} \ + CONFIG.PCW_MIO_4_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_4_PULLUP {disabled} \ + CONFIG.PCW_MIO_4_SLEW {slow} \ + CONFIG.PCW_MIO_50_DIRECTION {inout} \ + CONFIG.PCW_MIO_50_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_50_PULLUP {enabled} \ + CONFIG.PCW_MIO_50_SLEW {slow} \ + CONFIG.PCW_MIO_51_DIRECTION {inout} \ + CONFIG.PCW_MIO_51_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_51_PULLUP {enabled} \ + CONFIG.PCW_MIO_51_SLEW {slow} \ + CONFIG.PCW_MIO_52_DIRECTION {out} \ + CONFIG.PCW_MIO_52_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_52_PULLUP {enabled} \ + CONFIG.PCW_MIO_52_SLEW {slow} \ + CONFIG.PCW_MIO_53_DIRECTION {inout} \ + CONFIG.PCW_MIO_53_IOTYPE {LVCMOS 1.8V} \ + CONFIG.PCW_MIO_53_PULLUP {enabled} \ + CONFIG.PCW_MIO_53_SLEW {slow} \ + CONFIG.PCW_MIO_5_DIRECTION {inout} \ + CONFIG.PCW_MIO_5_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_5_PULLUP {disabled} \ + CONFIG.PCW_MIO_5_SLEW {slow} \ + CONFIG.PCW_MIO_6_DIRECTION {out} \ + CONFIG.PCW_MIO_6_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_6_PULLUP {disabled} \ + CONFIG.PCW_MIO_6_SLEW {slow} \ + CONFIG.PCW_MIO_7_DIRECTION {out} \ + CONFIG.PCW_MIO_7_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_7_PULLUP {disabled} \ + CONFIG.PCW_MIO_7_SLEW {slow} \ + CONFIG.PCW_MIO_8_DIRECTION {out} \ + CONFIG.PCW_MIO_8_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_8_PULLUP {disabled} \ + CONFIG.PCW_MIO_8_SLEW {slow} \ + CONFIG.PCW_MIO_9_DIRECTION {out} \ + CONFIG.PCW_MIO_9_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_9_PULLUP {enabled} \ + CONFIG.PCW_MIO_9_SLEW {slow} \ + CONFIG.PCW_MIO_PRIMITIVE {54} \ + CONFIG.PCW_MIO_TREE_PERIPHERALS {GPIO#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#GPIO#Quad SPI Flash#ENET Reset#GPIO#GPIO#GPIO#GPIO#UART 0#UART 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#SD 0#SD 0#SD 0#SD 0#SD 0#SD 0#USB Reset#SD 0#GPIO#GPIO#GPIO#GPIO#Enet 0#Enet 0} \ + CONFIG.PCW_MIO_TREE_SIGNALS {gpio[0]#qspi0_ss_b#qspi0_io[0]#qspi0_io[1]#qspi0_io[2]#qspi0_io[3]/HOLD_B#qspi0_sclk#gpio[7]#qspi_fbclk#reset#gpio[10]#gpio[11]#gpio[12]#gpio[13]#rx#tx#tx_clk#txd[0]#txd[1]#txd[2]#txd[3]#tx_ctl#rx_clk#rxd[0]#rxd[1]#rxd[2]#rxd[3]#rx_ctl#data[4]#dir#stp#nxt#data[0]#data[1]#data[2]#data[3]#clk#data[5]#data[6]#data[7]#clk#cmd#data[0]#data[1]#data[2]#data[3]#reset#cd#gpio[48]#gpio[49]#gpio[50]#gpio[51]#mdc#mdio} \ + CONFIG.PCW_M_AXI_GP0_ENABLE_STATIC_REMAP {0} \ + CONFIG.PCW_M_AXI_GP0_ID_WIDTH {12} \ + CONFIG.PCW_M_AXI_GP0_SUPPORT_NARROW_BURST {0} \ + CONFIG.PCW_M_AXI_GP0_THREAD_ID_WIDTH {12} \ + CONFIG.PCW_M_AXI_GP1_ENABLE_STATIC_REMAP {0} \ + CONFIG.PCW_M_AXI_GP1_ID_WIDTH {12} \ + CONFIG.PCW_M_AXI_GP1_SUPPORT_NARROW_BURST {0} \ + CONFIG.PCW_M_AXI_GP1_THREAD_ID_WIDTH {12} \ + CONFIG.PCW_NAND_CYCLES_T_AR {1} \ + CONFIG.PCW_NAND_CYCLES_T_CLR {1} \ + CONFIG.PCW_NAND_CYCLES_T_RC {11} \ + CONFIG.PCW_NAND_CYCLES_T_REA {1} \ + CONFIG.PCW_NAND_CYCLES_T_RR {1} \ + CONFIG.PCW_NAND_CYCLES_T_WC {11} \ + CONFIG.PCW_NAND_CYCLES_T_WP {1} \ + CONFIG.PCW_NAND_GRP_D8_ENABLE {0} \ + CONFIG.PCW_NAND_GRP_D8_IO {} \ + CONFIG.PCW_NAND_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_NOR_CS0_T_CEOE {1} \ + CONFIG.PCW_NOR_CS0_T_PC {1} \ + CONFIG.PCW_NOR_CS0_T_RC {11} \ + CONFIG.PCW_NOR_CS0_T_TR {1} \ + CONFIG.PCW_NOR_CS0_T_WC {11} \ + CONFIG.PCW_NOR_CS0_T_WP {1} \ + CONFIG.PCW_NOR_CS0_WE_TIME {0} \ + CONFIG.PCW_NOR_CS1_T_CEOE {1} \ + CONFIG.PCW_NOR_CS1_T_PC {1} \ + CONFIG.PCW_NOR_CS1_T_RC {11} \ + CONFIG.PCW_NOR_CS1_T_TR {1} \ + CONFIG.PCW_NOR_CS1_T_WC {11} \ + CONFIG.PCW_NOR_CS1_T_WP {1} \ + CONFIG.PCW_NOR_CS1_WE_TIME {0} \ + CONFIG.PCW_NOR_GRP_A25_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_A25_IO {} \ + CONFIG.PCW_NOR_GRP_CS1_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_CS1_IO {} \ + CONFIG.PCW_NOR_GRP_SRAM_CS1_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_SRAM_CS1_IO {} \ + CONFIG.PCW_NOR_NOR_IO {} \ + CONFIG.PCW_PLL_BYPASSMODE_ENABLE {0} \ + CONFIG.PCW_PRESET_BANK0_VOLTAGE {LVCMOS 3.3V} \ + CONFIG.PCW_PRESET_BANK1_VOLTAGE {LVCMOS 1.8V} \ + CONFIG.PCW_PS7_SI_REV {PRODUCTION} \ + CONFIG.PCW_QSPI_GRP_FBCLK_ENABLE {1} \ + CONFIG.PCW_QSPI_GRP_FBCLK_IO {MIO 8} \ + CONFIG.PCW_QSPI_GRP_IO1_ENABLE {0} \ + CONFIG.PCW_QSPI_GRP_IO1_IO {} \ + CONFIG.PCW_QSPI_INTERNAL_HIGHADDRESS {0xFCFFFFFF} \ + CONFIG.PCW_QSPI_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_QSPI_PERIPHERAL_DIVISOR0 {5} \ + CONFIG.PCW_QSPI_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_QSPI_PERIPHERAL_FREQMHZ {200} \ + CONFIG.PCW_QSPI_QSPI_IO {MIO 1 .. 6} \ + CONFIG.PCW_SD0_GRP_CD_ENABLE {1} \ + CONFIG.PCW_SD0_GRP_CD_IO {MIO 47} \ + CONFIG.PCW_SD0_GRP_POW_ENABLE {0} \ + CONFIG.PCW_SD0_GRP_POW_IO {} \ + CONFIG.PCW_SD0_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_SD0_SD0_IO {MIO 40 .. 45} \ + CONFIG.PCW_SD1_GRP_CD_ENABLE {0} \ + CONFIG.PCW_SD1_GRP_CD_IO {} \ + CONFIG.PCW_SD1_GRP_WP_ENABLE {0} \ + CONFIG.PCW_SD1_GRP_WP_IO {} \ + CONFIG.PCW_SDIO0_BASEADDR {0xE0100000} \ + CONFIG.PCW_SDIO0_HIGHADDR {0xE0100FFF} \ + CONFIG.PCW_SDIO1_BASEADDR {0xE0101000} \ + CONFIG.PCW_SDIO1_HIGHADDR {0xE0101FFF} \ + CONFIG.PCW_SDIO_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_SDIO_PERIPHERAL_DIVISOR0 {20} \ + CONFIG.PCW_SDIO_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_SDIO_PERIPHERAL_VALID {1} \ + CONFIG.PCW_SINGLE_QSPI_DATA_MODE {x4} \ + CONFIG.PCW_SMC_CYCLE_T0 {NA} \ + CONFIG.PCW_SMC_CYCLE_T1 {NA} \ + CONFIG.PCW_SMC_CYCLE_T2 {NA} \ + CONFIG.PCW_SMC_CYCLE_T3 {NA} \ + CONFIG.PCW_SMC_CYCLE_T4 {NA} \ + CONFIG.PCW_SMC_CYCLE_T5 {NA} \ + CONFIG.PCW_SMC_CYCLE_T6 {NA} \ + CONFIG.PCW_SMC_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_SMC_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_SMC_PERIPHERAL_FREQMHZ {100} \ + CONFIG.PCW_SMC_PERIPHERAL_VALID {0} \ + CONFIG.PCW_SPI0_BASEADDR {0xE0006000} \ + CONFIG.PCW_SPI0_GRP_SS0_ENABLE {0} \ + CONFIG.PCW_SPI0_GRP_SS0_IO {} \ + CONFIG.PCW_SPI0_GRP_SS2_ENABLE {0} \ + CONFIG.PCW_SPI0_GRP_SS2_IO {} \ + CONFIG.PCW_SPI1_BASEADDR {0xE0007000} \ + CONFIG.PCW_SPI1_GRP_SS0_ENABLE {0} \ + CONFIG.PCW_SPI1_GRP_SS0_IO {} \ + CONFIG.PCW_SPI1_GRP_SS2_ENABLE {0} \ + CONFIG.PCW_SPI1_GRP_SS2_IO {} \ + CONFIG.PCW_SPI_PERIPHERAL_CLKSRC {IO PLL} \ + CONFIG.PCW_SPI_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_SPI_PERIPHERAL_FREQMHZ {166.666666} \ + CONFIG.PCW_SPI_PERIPHERAL_VALID {0} \ + CONFIG.PCW_S_AXI_ACP_ARUSER_VAL {31} \ + CONFIG.PCW_S_AXI_ACP_AWUSER_VAL {31} \ + CONFIG.PCW_S_AXI_ACP_ID_WIDTH {3} \ + CONFIG.PCW_S_AXI_GP0_ID_WIDTH {6} \ + CONFIG.PCW_S_AXI_GP1_ID_WIDTH {6} \ + CONFIG.PCW_S_AXI_HP0_DATA_WIDTH {64} \ + CONFIG.PCW_S_AXI_HP0_ID_WIDTH {6} \ + CONFIG.PCW_S_AXI_HP1_DATA_WIDTH {64} \ + CONFIG.PCW_S_AXI_HP1_ID_WIDTH {6} \ + CONFIG.PCW_S_AXI_HP2_DATA_WIDTH {64} \ + CONFIG.PCW_S_AXI_HP2_ID_WIDTH {6} \ + CONFIG.PCW_S_AXI_HP3_DATA_WIDTH {64} \ + CONFIG.PCW_S_AXI_HP3_ID_WIDTH {6} \ + CONFIG.PCW_TPIU_PERIPHERAL_CLKSRC {External} \ + CONFIG.PCW_TPIU_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_TPIU_PERIPHERAL_FREQMHZ {200} \ + CONFIG.PCW_TRACE_BUFFER_CLOCK_DELAY {12} \ + CONFIG.PCW_TRACE_BUFFER_FIFO_SIZE {128} \ + CONFIG.PCW_TRACE_GRP_16BIT_ENABLE {0} \ + CONFIG.PCW_TRACE_GRP_16BIT_IO {} \ + CONFIG.PCW_TRACE_GRP_32BIT_ENABLE {0} \ + CONFIG.PCW_TRACE_GRP_32BIT_IO {} \ + CONFIG.PCW_TRACE_GRP_8BIT_ENABLE {0} \ + CONFIG.PCW_TRACE_GRP_8BIT_IO {} \ + CONFIG.PCW_TTC0_BASEADDR {0xE0104000} \ + CONFIG.PCW_TTC0_CLK0_PERIPHERAL_CLKSRC {CPU_1X} \ + CONFIG.PCW_TTC0_CLK0_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_TTC0_CLK0_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC0_CLK1_PERIPHERAL_CLKSRC {CPU_1X} \ + CONFIG.PCW_TTC0_CLK1_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_TTC0_CLK1_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC0_CLK2_PERIPHERAL_CLKSRC {CPU_1X} \ + CONFIG.PCW_TTC0_CLK2_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_TTC0_CLK2_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC0_HIGHADDR {0xE0104fff} \ + CONFIG.PCW_TTC0_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_TTC0_TTC0_IO {} \ + CONFIG.PCW_TTC_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_UART0_BASEADDR {0xE0000000} \ + CONFIG.PCW_UART0_BAUD_RATE {115200} \ + CONFIG.PCW_UART0_GRP_FULL_ENABLE {0} \ + CONFIG.PCW_UART0_GRP_FULL_IO {} \ + CONFIG.PCW_UART1_HIGHADDR {0xE0001FFF} \ + CONFIG.PCW_UART1_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_UART1_UART1_IO {} \ + CONFIG.PCW_USB1_USB1_IO {} \ + ] $processing_system7_0 + + # Create instance: ps7_0_axi_periph, and set properties + set ps7_0_axi_periph [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 ps7_0_axi_periph ] + set_property -dict [ list \ + CONFIG.NUM_MI {2} \ + ] $ps7_0_axi_periph + + # Create instance: pynqrouter_0, and set properties + set pynqrouter_0 [ create_bd_cell -type ip -vlnv xilinx.com:hls:pynqrouter:1.0 pynqrouter_0 ] + + # Create instance: rst_ps7_0_100M, and set properties + set rst_ps7_0_100M [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 rst_ps7_0_100M ] + + # Create interface connections + connect_bd_intf_net -intf_net processing_system7_0_DDR [get_bd_intf_ports DDR] [get_bd_intf_pins processing_system7_0/DDR] + connect_bd_intf_net -intf_net processing_system7_0_FIXED_IO [get_bd_intf_ports FIXED_IO] [get_bd_intf_pins processing_system7_0/FIXED_IO] + connect_bd_intf_net -intf_net processing_system7_0_M_AXI_GP0 [get_bd_intf_pins processing_system7_0/M_AXI_GP0] [get_bd_intf_pins ps7_0_axi_periph/S00_AXI] + connect_bd_intf_net -intf_net ps7_0_axi_periph_M00_AXI [get_bd_intf_pins ps7_0_axi_periph/M00_AXI] [get_bd_intf_pins pynqrouter_0/s_axi_AXI4LS] + connect_bd_intf_net -intf_net ps7_0_axi_periph_M01_AXI [get_bd_intf_pins axi_gpio_0/S_AXI] [get_bd_intf_pins ps7_0_axi_periph/M01_AXI] + + # Create port connections + connect_bd_net -net axi_gpio_0_gpio_io_o [get_bd_ports LD] [get_bd_pins axi_gpio_0/gpio_io_o] + connect_bd_net -net processing_system7_0_FCLK_CLK0 [get_bd_pins axi_gpio_0/s_axi_aclk] [get_bd_pins processing_system7_0/FCLK_CLK0] [get_bd_pins processing_system7_0/M_AXI_GP0_ACLK] [get_bd_pins ps7_0_axi_periph/ACLK] [get_bd_pins ps7_0_axi_periph/M00_ACLK] [get_bd_pins ps7_0_axi_periph/M01_ACLK] [get_bd_pins ps7_0_axi_periph/S00_ACLK] [get_bd_pins pynqrouter_0/ap_clk] [get_bd_pins rst_ps7_0_100M/slowest_sync_clk] + connect_bd_net -net processing_system7_0_FCLK_RESET0_N [get_bd_pins processing_system7_0/FCLK_RESET0_N] [get_bd_pins rst_ps7_0_100M/ext_reset_in] + connect_bd_net -net rst_ps7_0_100M_interconnect_aresetn [get_bd_pins ps7_0_axi_periph/ARESETN] [get_bd_pins rst_ps7_0_100M/interconnect_aresetn] + connect_bd_net -net rst_ps7_0_100M_peripheral_aresetn [get_bd_pins axi_gpio_0/s_axi_aresetn] [get_bd_pins ps7_0_axi_periph/M00_ARESETN] [get_bd_pins ps7_0_axi_periph/M01_ARESETN] [get_bd_pins ps7_0_axi_periph/S00_ARESETN] [get_bd_pins pynqrouter_0/ap_rst_n] [get_bd_pins rst_ps7_0_100M/peripheral_aresetn] + + # Create address segments + create_bd_addr_seg -range 0x00010000 -offset 0x41200000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs axi_gpio_0/S_AXI/Reg] SEG_axi_gpio_0_Reg + create_bd_addr_seg -range 0x00040000 -offset 0x43C00000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs pynqrouter_0/s_axi_AXI4LS/Reg] SEG_pynqrouter_0_Reg + + + # Restore current instance + current_bd_instance $oldCurInst + + save_bd_design +} +# End of create_root_design() + + +################################################################## +# MAIN FLOW +################################################################## + +create_root_design "" + + diff --git a/hls_2018/router_02_boardstr/etc/ap_fixed_sim.h b/hls_2018/router_02_boardstr/etc/ap_fixed_sim.h new file mode 100755 index 0000000..5be571d --- /dev/null +++ b/hls_2018/router_02_boardstr/etc/ap_fixed_sim.h @@ -0,0 +1,2451 @@ +/* + * Copyright 2012 Xilinx, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __AESL_GCC_AP_FIXED_H__ +#define __AESL_GCC_AP_FIXED_H__ + +#ifndef __cplusplus + #error C++ is required to include this header file +#endif /* #ifndef __cplusplus */ + + +#include +#ifndef __AESL_APDT_IN_SCFLOW__ + #include "etc/ap_int_sim.h" +#else + #include "../etc/ap_private.h" +#endif /* #ifndef __AESL_APDT_IN_SCFLOW__ */ + +#define FLOAT_MAN 23 +#define FLOAT_EXP 8 +#define DOUBLE_MAN 52 +#define DOUBLE_EXP 11 +// #define DOUBLE_MAN_MASK (~0ULL >> (64-DOUBLE_MAN-2)) +#define DOUBLE_MAN_MASK 0x3fffffffffffffULL +#define BIAS(e) ((1ULL<<(e-1))-1) +#define FLOAT_BIAS BIAS(FLOAT_EXP) +#define DOUBLE_BIAS BIAS(DOUBLE_EXP) + +/// Forward declaration. +template struct ap_fixed_base; + +///Proxy class, which allows bit selection to be used as both rvalue(for reading) and +//lvalue(for writing) +template +struct af_bit_ref { +#ifdef _MSC_VER + #pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ + ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& d_bv; + int d_index; +public: + INLINE af_bit_ref(const af_bit_ref<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& ref): + d_bv(ref.d_bv), d_index(ref.d_index) {} + + INLINE af_bit_ref(ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>* bv, int index=0): + d_bv(*bv),d_index(index) {} + + INLINE operator bool() const { + return d_bv.V[d_index]; + } + + INLINE af_bit_ref& operator=(unsigned long long val) { + if (val) + d_bv.V.set(d_index); + else + d_bv.V.clear(d_index); + return *this; + } + + template + INLINE af_bit_ref& operator =(const ap_private<_AP_W2,_AP_S2>& val) { + return operator=(val!=0); + } + + INLINE af_bit_ref& operator =(const af_bit_ref<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& val) { + return operator=((unsigned long long)(bool)val); + } + + template + INLINE af_bit_ref operator=(const af_bit_ref<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& val) { + return operator=((unsigned long long)(bool)val); + } + + template + INLINE af_bit_ref& operator = ( const ap_bit_ref<_AP_W2, _AP_S2> &val) { + return operator =((unsigned long long) (bool) val); + } + + template + INLINE af_bit_ref& operator = ( const ap_range_ref<_AP_W2,_AP_S2>& val) { + return operator =((const ap_private<_AP_W2, false>) val); + } + + template + INLINE af_bit_ref& operator= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=((const ap_private<_AP_W2, false>)(val)); + } + + template + INLINE af_bit_ref& operator= (const ap_concat_ref<_AP_W2, _AP_T3, _AP_W3, _AP_T3>& val) { + return operator=((const ap_private<_AP_W2 + _AP_W3, false>)(val)); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& op) { + return ap_concat_ref<1, af_bit_ref, _AP_W2, + ap_private<_AP_W2, _AP_S2> >(*this, op); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (const ap_bit_ref<_AP_W2, _AP_S2> &op) { + return ap_concat_ref<1, af_bit_ref, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (const ap_range_ref<_AP_W2, _AP_S2> &op) { + return ap_concat_ref<1, af_bit_ref, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, _AP_W2 + _AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &op) { + return ap_concat_ref<1, af_bit_ref, _AP_W2 + _AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, _AP_W2, + af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &op) { + return ap_concat_ref<1, af_bit_ref, _AP_W2, + af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, + _AP_N2> >(*this, const_cast& >(op)); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, 1, + af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &op) { + return ap_concat_ref<1, af_bit_ref, 1, + af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(op)); + } + + template + INLINE bool operator == (const af_bit_ref<_AP_W2, _AP_I2, + _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op) { + return get() == op.get(); + } + + template + INLINE bool operator != (const af_bit_ref<_AP_W2, _AP_I2, + _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op) { + return get() != op.get(); + } + + INLINE bool operator ~ () const { + bool bit = (d_bv.V)[d_index]; + return bit ? false : true; + } + + INLINE int length() const { + return 1; + } + + INLINE bool get() { + return d_bv.V[d_index]; + } + + INLINE bool get() const { + return d_bv.V[d_index]; + } + + INLINE std::string to_string() const { + return d_bv.V[d_index] ? "1" : "0"; + } +}; + +///Range(slice) reference +//------------------------------------------------------------ +template +struct af_range_ref { +#ifdef _MSC_VER + #pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ + ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &d_bv; + int l_index; + int h_index; + +public: + INLINE af_range_ref(const af_range_ref<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& ref): + d_bv(ref.d_bv), l_index(ref.l_index), h_index(ref.h_index) {} + + INLINE af_range_ref(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>* bv, int h, int l): + d_bv(*bv),l_index(l),h_index(h) { + //if (h < l) + // fprintf(stderr, + //"Warning! The bits selected will be returned in reverse order\n"); + } + + INLINE operator ap_private<_AP_W, false> () const { + if (h_index >= l_index) { + ap_private<_AP_W, false> val(d_bv.V); + ap_private<_AP_W,false> mask(-1); + mask>>=_AP_W-(h_index-l_index+1); + val>>=l_index; + return val&=mask; + } else { + ap_private<_AP_W, false> val = 0; + for (int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + if ((d_bv.V)[j]) val.set(i); + return val; + } + } + + INLINE operator unsigned long long() const { + return get().to_uint64(); + } + + template + INLINE af_range_ref& operator =(const ap_private<_AP_W2,_AP_S2>& val) { + ap_private<_AP_W, false> vval= ap_private<_AP_W, false>(val); + if (l_index > h_index) { + for (int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + vval[i]? d_bv.V.set(j):d_bv.V.clear(j); + } else { + ap_private<_AP_W,false> mask(-1); + if (l_index>0) { + mask<<=l_index; + vval<<=l_index; + } + if (h_index<_AP_W-1) { + ap_private<_AP_W,false> mask2(-1); + mask2>>=_AP_W-h_index-1; + mask&=mask2; + vval&=mask2; + } + mask.flip(); + d_bv.V &= mask; + d_bv.V |= vval; + } + return *this; + } + + INLINE af_range_ref& operator = (unsigned long long val) { + const ap_private<_AP_W, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE af_range_ref& operator = + (const ap_concat_ref <_AP_W3, _AP_T3, _AP_W4, _AP_T4>& val) { + const ap_private<_AP_W, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE af_range_ref& operator =(const ap_bit_ref<_AP_W3, _AP_S3>& val) { + const ap_private<_AP_W, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE af_range_ref& operator =(const ap_range_ref<_AP_W3,_AP_S3>& val) { + const ap_private<_AP_W, false> tmpVal(val); + return operator =(tmpVal); + } + + template + INLINE af_range_ref& operator= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& val) { + const ap_private<_AP_W2, false> tmp= val.get(); + return operator = (tmp); + } + + INLINE af_range_ref& operator= (const af_range_ref<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& val) { + const ap_private<_AP_W, false> tmp= val.get(); + return operator = (tmp); + } + + template + INLINE af_range_ref& operator= (const ap_fixed_base<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=(val.to_ap_private()); + } + + template + INLINE bool operator == (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs==rhs; + } + + template + INLINE bool operator != (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs!=rhs; + } + + template + INLINE bool operator > (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>rhs; + } + + template + INLINE bool operator >= (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>=rhs; + } + + template + INLINE bool operator < (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs + INLINE bool operator <= (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs<=rhs; + } + + template + INLINE bool operator == (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs==rhs; + } + + template + INLINE bool operator != (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs!=rhs; + } + + template + INLINE bool operator > (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>rhs; + } + + template + INLINE bool operator >= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>=rhs; + } + + template + INLINE bool operator < (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs + INLINE bool operator <= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs<=rhs; + } + + template + INLINE void set(const ap_private<_AP_W2,false>& val) { + ap_private<_AP_W,_AP_S> vval=val; + if (l_index>h_index) { + for (int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + vval[i]? d_bv.V.set(j):d_bv.V.clear(j); + } else { + ap_private<_AP_W,_AP_S> mask(-1); + if (l_index>0) { + ap_private<_AP_W,false> mask1(-1); + mask1>>=_AP_W-l_index; + mask1.flip(); + mask=mask1; + //vval&=mask1; + vval<<=l_index; + } + if (h_index<_AP_W-1) { + ap_private<_AP_W,false> mask2(-1); + mask2<<=h_index+1; + mask2.flip(); + mask&=mask2; + vval&=mask2; + } + mask.flip(); + d_bv&=mask; + d_bv|=vval; + } + + } + + INLINE ap_private<_AP_W,false> get() const { + if (h_index val(0); + for (int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + if ((d_bv.V)[j]) val.set(i); + return val; + } else { + ap_private<_AP_W, false> val = ap_private<_AP_W,false>(d_bv.V); + val>>= l_index; + if (h_index<_AP_W-1) + { + ap_private<_AP_W,false> mask(-1); + mask>>=_AP_W-(h_index-l_index+1); + val&=mask; + } + return val; + } + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& op) { + return ap_concat_ref<_AP_W, af_range_ref, _AP_W2, + ap_private<_AP_W2, _AP_S2> >(*this, op); + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (const ap_bit_ref<_AP_W2, _AP_S2> &op) { + return ap_concat_ref<_AP_W, af_range_ref, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (const ap_range_ref<_AP_W2, _AP_S2> &op) { + return ap_concat_ref<_AP_W, af_range_ref, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, _AP_W2 + _AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &op) { + return ap_concat_ref<_AP_W, af_range_ref, _AP_W2 + _AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, _AP_W2, + af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &op) { + return ap_concat_ref<_AP_W, af_range_ref, _AP_W2, + af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& > (op)); + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, 1, + af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &op) { + return ap_concat_ref<_AP_W, af_range_ref, 1, + af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(op)); + } + + INLINE int length() const { + return h_index>=l_index?h_index-l_index+1:l_index-h_index+1; + } + + INLINE int to_int() const { + ap_private<_AP_W,false> val=get(); + return val.to_int(); + } + + INLINE unsigned int to_uint() const { + ap_private<_AP_W,false> val=get(); + return val.to_uint(); + } + + INLINE long to_long() const { + ap_private<_AP_W,false> val=get(); + return val.to_long(); + } + + INLINE unsigned long to_ulong() const { + ap_private<_AP_W,false> val=get(); + return val.to_ulong(); + } + + INLINE ap_slong to_int64() const { + ap_private<_AP_W,false> val=get(); + return val.to_int64(); + } + + INLINE ap_ulong to_uint64() const { + ap_private<_AP_W,false> val=get(); + return val.to_uint64(); + } + + INLINE std::string to_string(uint8_t radix) const { + return get().to_string(radix); + } + +}; + +//----------------------------------------------------------------------------- +///ap_fixed_base: AutoPilot fixed point +//----------------------------------------------------------------------------- +template +struct ap_fixed_base { +#ifdef _MSC_VER + #pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ +public: + template friend struct +ap_fixed_base; + template friend struct +af_bit_ref; + + INLINE void overflow_adjust(bool underflow, bool overflow, + bool lD, bool sign) { + if (!overflow && !underflow) return; + switch (_AP_O) { + case AP_WRAP: + if (_AP_N == 0) + return; + if (_AP_S) { + //signed SC_WRAP + //n_bits == 1; + if (_AP_N > 1) { + ap_private<_AP_W, _AP_S> mask(-1); + if (_AP_N >= _AP_W) mask = 0; + else mask.lshr(_AP_N); + if (sign) + V &= mask; + else + V |= ~mask; + } + sign ? V.set(_AP_W - 1) : V.clear(_AP_W - 1); + } else { + //unsigned SC_WRAP + ap_private<_AP_W, _AP_S> mask(-1); + if (_AP_N >= _AP_W) mask = 0; + else mask.lshr(_AP_N); + mask.flip(); + V |= mask; + } + break; + case AP_SAT_ZERO: + V.clear(); + break; + case AP_WRAP_SM: + { + bool Ro = ap_private_ops::get<_AP_W, _AP_S, _AP_W -1>(V); // V[_AP_W -1]; + if (_AP_N == 0) { + if (lD != Ro) { + V.flip(); + lD ? ap_private_ops::set<_AP_W, _AP_S, _AP_W - 1>(V) : + ap_private_ops::clear<_AP_W, _AP_S, _AP_W - 1>(V); + } + } else { + if (_AP_N == 1 && sign != Ro) { + V.flip(); + } else if (_AP_N > 1) { + bool lNo = ap_private_ops::get<_AP_W, _AP_S, _AP_W - _AP_N> (V); // V[_AP_W - _AP_N]; + if (lNo == sign) + V.flip(); + ap_private<_AP_W, false> mask(-1); + if (_AP_N >= _AP_W) mask = 0; + else mask.lshr(_AP_N); + if (sign) + V &= mask; + else + V |= mask.flip(); + sign ? ap_private_ops::set<_AP_W, _AP_S, _AP_W - 1>(V) : ap_private_ops::clear<_AP_W, _AP_S, _AP_W - 1>(V); + } + } + } + break; + default: + if (_AP_S) { + if (overflow) { + V.set(); ap_private_ops::clear<_AP_W, _AP_S, _AP_W-1>(V); + } else if (underflow) { + V.clear(); + ap_private_ops::set<_AP_W, _AP_S, _AP_W-1>(V); + if (_AP_O == AP_SAT_SYM) + ap_private_ops::set<_AP_W, _AP_S, 0>(V); + } + } else { + if (overflow) + V.set(); + else if (underflow) + V.clear(); + } + } + } + + INLINE bool quantization_adjust(bool qb, bool r, bool s) { + bool carry=ap_private_ops::get<_AP_W, _AP_S, _AP_W-1>(V); + switch (_AP_Q) { + case AP_TRN: + return false; + case AP_RND_ZERO: + qb &= s || r; + break; + case AP_RND_MIN_INF: + qb &= r; + break; + case AP_RND_INF: + qb &= !s || r; + break; + case AP_RND_CONV: + qb &= ap_private_ops::get<_AP_W, _AP_S, 0>(V) || r; + break; + case AP_TRN_ZERO: + qb = s && ( qb || r ); + break; + default:; + + } + if (qb) ++V; + //only when old V[_AP_W-1]==1 && new V[_AP_W-1]==0 + return carry && !(ap_private_ops::get<_AP_W, _AP_S, _AP_W-1>(V)); //(!V[_AP_W-1]); + } + + template + struct RType { + enum { + _AP_F=_AP_W-_AP_I, + F2=_AP_W2-_AP_I2, + mult_w = _AP_W+_AP_W2, + mult_i = _AP_I+_AP_I2, + mult_s = _AP_S||_AP_S2, + plus_w = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2))+1+AP_MAX(_AP_F,F2), + plus_i = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2))+1, + plus_s = _AP_S||_AP_S2, + minus_w = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2))+1+AP_MAX(_AP_F,F2), + minus_i = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2))+1, + minus_s = true, +#ifndef __SC_COMPATIBLE__ + div_w = _AP_W + AP_MAX(_AP_W2 - _AP_I2, 0) + _AP_S2, +#else + div_w = _AP_W + AP_MAX(_AP_W2 - _AP_I2, 0) + _AP_S2 + AP_MAX(_AP_I2, 0), +#endif /* #ifndef __SC_COMPATIBLE__ */ + div_i = _AP_I + (_AP_W2-_AP_I2) + _AP_S2, + div_s = _AP_S||_AP_S2, + logic_w = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2))+AP_MAX(_AP_F,F2), + logic_i = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2)), + logic_s = _AP_S||_AP_S2 + }; + + typedef ap_fixed_base mult; + typedef ap_fixed_base plus; + typedef ap_fixed_base minus; + typedef ap_fixed_base logic; + typedef ap_fixed_base div; + typedef ap_fixed_base<_AP_W, _AP_I, _AP_S> arg1; + }; + INLINE void report() { +#if 0 + if (_AP_W > 1024 && _AP_W <= 4096) { + fprintf(stderr, "[W] W=%d is out of bound (1<=W<=1024):" + " for synthesis, please define macro AP_INT_TYPE_EXT(N) to" + " extend the valid range.\n", _AP_W); + } else +#endif /* #if 0 */ + if (_AP_W > MAX_MODE(AP_INT_MAX_W) * 1024) { + fprintf(stderr, "[E] ap_%sfixed<%d, ...>: Bitwidth exceeds the " + "default max value %d. Please use macro " + "AP_INT_MAX_W to set a larger max value.\n", + _AP_S?"":"u", _AP_W, + MAX_MODE(AP_INT_MAX_W) * 1024); + exit(1); + } + } + + /// Constructors. + // ------------------------------------------------------------------------- +#if 0 + #ifdef __SC_COMPATIBLE__ + INLINE ap_fixed_base():V(uint32_t(_AP_W), uint64_t(0)) {} + #else + INLINE ap_fixed_base():V(uint32_t(_AP_W)) {} + #endif /* #ifdef __SC_COMPATIBLE__ */ +#else + INLINE ap_fixed_base():V(0) {} +#endif /* #if 0 */ + // INLINE ap_fixed_base():V() {} + // INLINE explicit ap_fixed_base(const ap_private<_AP_W+_AP_I, _AP_S>& _V):V(_V) {} + INLINE ap_fixed_base(const ap_fixed_base& op):V(op.V) {} + template + INLINE ap_fixed_base(const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op):V(0) { + enum {N2=_AP_W2,_AP_F=_AP_W-_AP_I,F2=_AP_W2-_AP_I2,QUAN_INC=F2>_AP_F && !(_AP_Q==AP_TRN || + (_AP_Q==AP_TRN_ZERO && !_AP_S2))}; + if (!op) return; + bool carry=false; + //handle quantization + enum { sh_amt =(F2>_AP_F)?F2-_AP_F:_AP_F-F2}; + const ap_private<_AP_W2, _AP_S2>& val = op.V; + bool neg_src=val.isNegative(); + if (F2==_AP_F) + V=val; + + else if (F2>_AP_F) { + if (sh_amt >= _AP_W2) + V = neg_src ? -1 : 0; + else + V = _AP_S2?val.ashr(sh_amt):val.lshr(sh_amt); + if (_AP_Q!=AP_TRN && !(_AP_Q==AP_TRN_ZERO && !_AP_S2)) { + bool qb = false; + if (F2-_AP_F>_AP_W2) + qb = neg_src; + else + qb = ap_private_ops::get<_AP_W2, _AP_S2, F2-_AP_F-1>(val); + + bool r=false; + enum { pos3 = F2-_AP_F-2}; + if (pos3>=_AP_W2-1) + r=val!=0; + else if (pos3>=0) + r = (val<<(_AP_W2-1-pos3))!=0; + carry = quantization_adjust(qb,r,neg_src); + } + } else { //no quantization + if (sh_amt < _AP_W) { + V=val; + V <<= sh_amt; + } + } + //hanle overflow/underflow + if ((_AP_O!=AP_WRAP || _AP_N != 0) && + ((!_AP_S && _AP_S2) || _AP_I-_AP_S < + _AP_I2 - _AP_S2 + (QUAN_INC|| (_AP_S2 && + _AP_O==AP_SAT_SYM)))) {//saturation + bool deleted_zeros = _AP_S2?true:!carry, + deleted_ones = true; + bool lD=(_AP_I2>_AP_I && _AP_W2-_AP_I2+_AP_I>=0) && + ap_private_ops::get<_AP_W2, _AP_S2, _AP_W2-_AP_I2+_AP_I>(val); + enum { pos1=F2-_AP_F+_AP_W, pos2=F2-_AP_F+_AP_W+1}; + if (pos1 < _AP_W2) { + bool Range1_all_ones= true; + bool Range1_all_zeros= true; + if (pos1 >= 0) { + enum { __W = (_AP_W2-pos1) > 0 ? (_AP_W2-pos1) : 1 }; + const ap_private<__W, _AP_S2> Range1=ap_private<__W, _AP_S2>(val.lshr(pos1)); + Range1_all_ones=Range1.isAllOnesValue(); + Range1_all_zeros=Range1.isMinValue(); + } else { + Range1_all_ones=false; + Range1_all_zeros=val.isMinValue(); + } + bool Range2_all_ones=true; + if (pos2<_AP_W2 && pos2>=0) { + enum { __W = (_AP_W2-pos2)>0 ? (_AP_W2-pos2) : 1}; + ap_private<__W, true> Range2=ap_private<__W, true>(val.lshr(pos2)); + Range2_all_ones=Range2.isAllOnesValue(); + } else if (pos2<0) + Range2_all_ones=false; + + deleted_zeros=deleted_zeros && (carry?Range1_all_ones:Range1_all_zeros); + deleted_ones=carry?Range2_all_ones&&(F2-_AP_F+_AP_W<0||!lD) + :Range1_all_ones; + neg_src= neg_src&&!(carry && Range1_all_ones); + } else + neg_src = neg_src && V[_AP_W-1]; + + bool neg_trg= V.isNegative(); + bool overflow=(neg_trg||!deleted_zeros) && !val.isNegative(); + bool underflow=(!neg_trg||!deleted_ones)&&neg_src; + //printf("neg_src = %d, neg_trg = %d, deleted_zeros = %d, + // deleted_ones = %d, overflow = %d, underflow = %d\n", + // neg_src, neg_trg, deleted_zeros, deleted_ones, + // overflow, underflow); + if (_AP_O==AP_SAT_SYM && _AP_S2 && _AP_S) + underflow |= neg_src && (_AP_W>1?V.isMinSignedValue():true); + overflow_adjust(underflow, overflow, lD, neg_src); + } + report(); + } + + template + INLINE ap_fixed_base(const volatile ap_fixed_base<_AP_W2,_AP_I2, + _AP_S2,_AP_Q2,_AP_O2, _AP_N2> &op) : V(op.V) { + *this = const_cast&>(op); + } + + template + INLINE ap_fixed_base(const ap_private<_AP_W2,_AP_S2>& op) { + ap_fixed_base<_AP_W2,_AP_W2,_AP_S2> f_op; + f_op.V=op; + *this = f_op; + } + + INLINE ap_fixed_base(bool b) { + *this=(ap_private<1,false>)b; + report(); + } + + INLINE ap_fixed_base(char b) { + *this=(ap_private<8,false>)b; + report(); + } + + INLINE ap_fixed_base(signed char b) { + *this=(ap_private<8,true>)b; + report(); + } + + INLINE ap_fixed_base(unsigned char b) { + *this=(ap_private<8,false>)b; + report(); + } + + INLINE ap_fixed_base(signed short b) { + *this=(ap_private<16,true>)b; + report(); + } + + INLINE ap_fixed_base(unsigned short b) { + *this=(ap_private<16,false>)b; + report(); + } + + INLINE ap_fixed_base(signed int b) { + *this=(ap_private<32,true>)b; + report(); + } + + INLINE ap_fixed_base(unsigned int b) { + *this=(ap_private<32,false>)b; + report(); + } +# if defined __x86_64__ + INLINE ap_fixed_base(signed long b) { + *this=(ap_private<64,true>)b; + report(); + } + + INLINE ap_fixed_base(unsigned long b) { + *this=(ap_private<64,false>)b; + report(); + } +# else + INLINE ap_fixed_base(signed long b) { + *this=(ap_private<32,true>)b; + report(); + } + + INLINE ap_fixed_base(unsigned long b) { + *this=(ap_private<32,false>)b; + report(); + } +# endif + + INLINE ap_fixed_base(ap_slong b) { + *this=(ap_private<64,true>)b; + report(); + } + + INLINE ap_fixed_base(ap_ulong b) { + *this=(ap_private<64,false>)b; + report(); + } + +#if 1 + INLINE ap_fixed_base(const char* val):V(0) { + ap_private<_AP_W, _AP_S> Tmp(val); + V = Tmp; + } + + INLINE ap_fixed_base(const char* val, signed char rd): V(0) { + ap_private<_AP_W, _AP_S> Tmp(val, rd); + V = Tmp; + } + +#endif + + INLINE ap_fixed_base(const std::string& val) { + ap_private<_AP_W, _AP_S> Tmp(val, 2); + V = Tmp; + report(); + } + + template + INLINE ap_fixed_base(const ap_bit_ref<_AP_W2, _AP_S2>& op) { + *this = ((bool)op); + report(); + } + + template + INLINE ap_fixed_base(const ap_range_ref<_AP_W2, _AP_S2>& op) { + *this = ap_private<_AP_W2, _AP_S2>(op); + report(); + } + + template + INLINE ap_fixed_base(const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& op) { + *this = ((const ap_private<_AP_W2 + _AP_W3, false>&)(op)); + report(); + } + + template + INLINE ap_fixed_base(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op) { + *this = (bool(op)); + report(); + } + + template + INLINE ap_fixed_base(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op) { + *this = (ap_private<_AP_W2, false>(op)); + report(); + } + + //helper function + INLINE unsigned long long doubleToRawBits(double pf)const { + union { + unsigned long long __L; + double __D; + }LD; + LD.__D=pf; + return LD.__L; + } + + + INLINE double rawBitsToDouble(unsigned long long pi) const { + union { + unsigned long long __L; + double __D; + }LD; + LD.__L=pi; + return LD.__D; + } + + INLINE float rawBitsToFloat(uint32_t pi) const { + union { + uint32_t __L; + float __D; + }LD; + LD.__L = pi; + return LD.__D; + } + + INLINE ap_fixed_base(double d):V(0) { + if (!d) return; + const bool isneg=d<0; + + const uint64_t ireg=doubleToRawBits(isneg?-d:d); + if ((ireg&0x7fffffffffffffffULL)!=0) { + const int32_t exp=(((ireg)>>DOUBLE_MAN)&0x07ff)-DOUBLE_BIAS; + ap_private man = ireg & DOUBLE_MAN_MASK; + man.clear(DOUBLE_MAN+1); + man.set(DOUBLE_MAN); + if (isneg) { + man.flip(); + man++; + } + + enum {_AP_S2=true, _AP_W2=DOUBLE_MAN+2,_AP_F=_AP_W -_AP_I }; + const int _AP_I2=exp+2; + const int F2=_AP_W2-_AP_I2; + const bool QUAN_INC=F2>_AP_F && !(_AP_Q==AP_TRN || (_AP_Q==AP_TRN_ZERO && + !_AP_S2)); + bool carry=false; + //handle quantization + const unsigned sh_amt=abs(F2-_AP_F); // sh_amt = F2>_AP_F ? F2 -_AP_F : _AP_F-F2; + if (F2==_AP_F ) + V=man; + else if (F2>_AP_F) { + if (sh_amt >= DOUBLE_MAN+2) + V=isneg?-1:0; + else + V=(man>>sh_amt) | ((man & 1ULL<<(DOUBLE_MAN+1)) ? (DOUBLE_MAN_MASK>>(DOUBLE_MAN+2-sh_amt) <<(DOUBLE_MAN+2-sh_amt)):0); + + if (_AP_Q!=AP_TRN && !(_AP_Q==AP_TRN_ZERO && !_AP_S2)) { + const bool qb=((F2-_AP_F > DOUBLE_MAN+2) ? isneg : (man & (1ULL<<(F2-_AP_F-1))) != 0); + const int pos3=F2-_AP_F-2; + const bool r = (pos3>= 0) ? (man << AP_MAX(0, _AP_W2-pos3-1)& DOUBLE_MAN_MASK)!=0 : false; + carry = quantization_adjust(qb,r,isneg); + } + } + else { //no quantization + // V=man; + if (sh_amt < _AP_W) { + V = man; + V <<= sh_amt; + } + } + //handle overflow/underflow + if ((_AP_O != AP_WRAP || _AP_N != 0) && + ((!_AP_S && _AP_S2) || _AP_I-_AP_S < + _AP_I2-_AP_S2+(QUAN_INC|| (_AP_S2 && + _AP_O==AP_SAT_SYM)) )) {// saturation + bool deleted_zeros = _AP_S2?true:!carry, + deleted_ones = true; + bool neg_src; + const bool lD=(_AP_I2>_AP_I) && (_AP_W2-_AP_I2+_AP_I>=0) && (man & (1ULL <<(DOUBLE_MAN+2-_AP_I2+_AP_I))); + int pos1=F2+_AP_W-_AP_F; + if (pos1 < _AP_W2) { + int pos2=pos1+1; + bool Range1_all_ones=true; + bool Range1_all_zeros=true; + if (pos1>=0) { + ap_private<_AP_W,_AP_S> Range1= + ap_private<_AP_W,_AP_S>((man >> pos1) | ((1ULL<<(DOUBLE_MAN+1)&man) ? (DOUBLE_MAN_MASK >> (DOUBLE_MAN+2-pos1) <<(DOUBLE_MAN+2-pos1)):0)); + Range1_all_ones = Range1.isAllOnesValue(); // Range1.isAllOnesValue(); + Range1_all_zeros = Range1.isMinValue(); // Range1.isMinValue(); + } else { + Range1_all_ones=false; + Range1_all_zeros = man==0; // man.isMinValue(); + } + bool Range2_all_ones=true; + if (pos2<_AP_W2 && pos2>=0) { + ap_private<_AP_W, _AP_S> Range2= + ap_private<_AP_W, _AP_S>((man >> pos2) | ((1ULL<<(DOUBLE_MAN+1)&man) ? (DOUBLE_MAN_MASK >> (DOUBLE_MAN+2-pos2) <<(DOUBLE_MAN+2-pos2)):0)); + Range2_all_ones=Range2.isAllOnesValue(); // Range2.isAllOnesValue(); + } else if (pos2<0) + Range2_all_ones=false; + deleted_zeros=deleted_zeros && (carry?Range1_all_ones:Range1_all_zeros); + deleted_ones=carry?Range2_all_ones&&(F2-_AP_F+_AP_W<0||!lD) : Range1_all_ones; + neg_src=isneg&&!(carry&Range1_all_ones); + } else + neg_src = isneg && V[_AP_W -1]; + + const bool neg_trg=V.isNegative(); + const bool overflow=(neg_trg||!deleted_zeros) && !isneg; + bool underflow=(!neg_trg||!deleted_ones)&&neg_src; + //printf("neg_src = %d, neg_trg = %d, deleted_zeros = %d, + // deleted_ones = %d, overflow = %d, underflow = %d\n", + // neg_src, neg_trg, deleted_zeros, deleted_ones, + // overflow, underflow); + if (_AP_O==AP_SAT_SYM && _AP_S2 && _AP_S) + underflow |= neg_src && (_AP_W>1?V.isMinSignedValue():true); + overflow_adjust(underflow,overflow,lD, neg_src); + } + } + report(); + } + + + ///assign operators + //------------------------------------------------------------------------- + + INLINE volatile ap_fixed_base& operator=(const ap_fixed_base<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& op) volatile { + V = op.V; + return *this; + } + + INLINE ap_fixed_base& operator=(const ap_fixed_base<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& op) { + V = op.V; + return *this; + } + + INLINE volatile ap_fixed_base& operator=(const volatile ap_fixed_base<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& op) volatile { + V = op.V; + return *this; + } + + INLINE ap_fixed_base& operator=(const volatile ap_fixed_base<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& op) { + V = op.V; + return *this; + } + + // Set this ap_fixed_base with a bits string. That means the ssdm_int::V + // inside this ap_fixed_base is assigned by bv. + // Note the input parameter should be a fixed-point formatted bit string. + INLINE ap_fixed_base& setBits(unsigned long long bv) { + V=bv; + return *this; + } + + // Return a ap_fixed_base object whose ssdm_int::V is assigned by bv. + // Note the input parameter should be a fixed-point formatted bit string. + static INLINE ap_fixed_base bitsToFixed(unsigned long long bv) { + ap_fixed_base Tmp=bv; + return Tmp; + } + + // Explicit conversion functions to ap_private that captures + // all integer bits (bits are truncated) + INLINE ap_private + to_ap_private(bool Cnative = true) const { + ap_private ret = ap_private ((_AP_I >= 1) ? (_AP_S==true ? V.ashr(AP_MAX(0,_AP_W - _AP_I)) : V.lshr(AP_MAX(0,_AP_W - _AP_I))) : ap_private<_AP_W, _AP_S>(0)); + + if (Cnative) { + bool r = false; + if (_AP_I < _AP_W) { + if (_AP_I > 0) r = !(V.getLoBits(_AP_W - _AP_I).isMinValue()); + else r = !(V.isMinValue()); + } + if (r && V.isNegative()) { // if this is negative integer + ++ret;//ap_private(1,_AP_S); + } + } else { + //Follow OSCI library, conversion from sc_fixed to sc_int + } + return ret; + } + + template + INLINE operator ap_private<_AP_W2,_AP_S2> () const { + return (ap_private<_AP_W2,_AP_S2>)to_ap_private(); + } + + template + INLINE operator ap_private<_AP_W2,_AP_S2,_AP_N2> () const { + return (ap_private<_AP_W2,_AP_S2,_AP_N2>)to_ap_private(); + } + + //Explict conversion function to C built-in integral type + INLINE int to_int() const { + return to_ap_private().to_int(); + } + + INLINE int to_uint() const { + return to_ap_private().to_uint(); + } + + INLINE ap_slong to_int64() const { + return to_ap_private().to_int64(); + } + + INLINE ap_ulong to_uint64() const { + return to_ap_private().to_uint64(); + } + + INLINE double to_double() const { + if (!V) + return 0; + if (_AP_W>64 || (_AP_W - _AP_I) > 0) { + bool isneg = _AP_S && V[_AP_W-1]; + uint64_t res = isneg ? 0x8000000000000000ULL : 0; + ap_private<_AP_W, false> tmp = V; + if (isneg) tmp = -tmp; + int i = _AP_W -1 - tmp.countLeadingZeros(); + int exp = _AP_I-(_AP_W-i); + res|=((uint64_t)(exp+DOUBLE_BIAS))<DOUBLE_MAN)?tmp.lshr(i-DOUBLE_MAN):tmp).to_uint64() & DOUBLE_MAN_MASK; + res |= i 0) { + /* This specialization is disabled. It is giving wrong results in some cases. + bool isneg=V.isNegative(); + double dp = V.get(); + dp /= (1<< (_AP_W - _AP_I)); + return dp;*/ + } else + return double(to_int64()); + } + + INLINE float to_float() const { + uint32_t res=0; + if (V==0) + return 0; + bool isneg=V.isNegative(); + ap_private<_AP_W, _AP_S> tmp=V; + if (isneg) tmp = -tmp; + if (_AP_W-_AP_I>0||_AP_W>64) { + if (isneg) + res=0x80000000; + int i=_AP_W-1; + i-=tmp.countLeadingZeros(); + int exp=_AP_I-(_AP_W-i); + res|=(exp+FLOAT_BIAS)< man = 0; + if (i!=0) { + tmp.clear(i); + if (i>FLOAT_MAN) + man=tmp.lshr(i-FLOAT_MAN); + else + man=tmp; + res |= i < FLOAT_MAN?man.getZExtValue()<<(FLOAT_MAN-i):man.getZExtValue(); + } + } else { + return float(to_int64()); + } + float dp=rawBitsToFloat(res); + return dp; + } + + INLINE operator double () const { + return to_double(); + } +#ifndef __SC_COMPATIBLE__ + INLINE operator float () const { + return to_float(); + } + + INLINE operator char () const { + return (char) to_int(); + } + + INLINE operator unsigned char () const { + return (unsigned char) to_uint(); + } + + INLINE operator short () const { + return (short) to_int(); + } + + INLINE operator unsigned short () const { + return (unsigned short) to_uint(); + } + + INLINE operator int () const { + return to_int(); + } + + INLINE operator unsigned int () const { + return to_uint(); + } +#if 1 +#ifdef __x86_64__ + INLINE operator long () const { + return (long)to_int64(); + } + + INLINE operator unsigned long () const { + return (unsigned long) to_uint64(); + } +#else + INLINE operator long () const { + return to_int64(); + } + + INLINE operator unsigned long () const { + return to_uint64(); + } + +#endif +#endif + INLINE operator unsigned long long () const { + return to_uint64(); + } + + INLINE operator long long () const { + return to_int64(); + } +#endif + + INLINE std::string to_string(uint8_t radix=2, bool sign=false) const; + + INLINE ap_slong bits_to_int64() const { + ap_private res(V); + return (ap_slong) res; + } + + INLINE ap_ulong bits_to_uint64() const { + ap_private res(V); + return (ap_ulong) res; + } + + INLINE int length() const {return _AP_W;} + + // Count the number of zeros from the most significant bit + // to the first one bit. Note this is only for ap_fixed_base whose + // _AP_W <= 64, otherwise will incur assertion. + INLINE int countLeadingZeros() { + return V.countLeadingZeros(); + } + + ///Arithmetic:Binary + //------------------------------------------------------------------------- + template + INLINE typename RType<_AP_W2,_AP_I2,_AP_S2>::mult + operator * (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + typename RType<_AP_W2,_AP_I2,_AP_S2>::mult r; + r.V = V * op2.V; + return r; + } + + template + static INLINE ap_fixed_base multiply(const ap_fixed_base<_AP_W1,_AP_I1,_AP_S1>& op1, const + ap_fixed_base<_AP_W2,_AP_I2,_AP_S2>& op2) { + ap_private<_AP_W+_AP_W2, _AP_S> OP1=op1.V; + ap_private<_AP_W2,_AP_S2> OP2=op2.V; + return OP1*OP2; + } + + template + INLINE typename RType<_AP_W2,_AP_I2,_AP_S2>::div + operator / (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + enum {F2 = _AP_W2-_AP_I2, _W1=AP_MAX(_AP_W + AP_MAX(F2, 0), _AP_W2), + _W2=AP_MAX(_AP_W2,AP_MAX(_AP_W + AP_MAX(F2, 0), _AP_W2))}; + ap_private<_W1, _AP_S> dividend = (ap_private<_W1, _AP_S>(V)) << ((_W1>_AP_W)?F2:0); + ap_private<_W1, _AP_S2> divisior = ap_private<_W2, _AP_S2>(op2.V); + ap_private<_W1, _AP_S> ret = ap_private<_W1,_AP_S> ((_AP_S||_AP_S2) ? dividend.sdiv(divisior): dividend.udiv(divisior)); + typename RType<_AP_W2, _AP_I2, _AP_S2>::div r; + r.V = ret; + return r; + } +#define OP_BIN_AF(Sym, Rty, Width, Sign, Fun) \ + template \ + INLINE typename RType<_AP_W2,_AP_I2,_AP_S2>::Rty \ + operator Sym (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const \ + { \ + enum {_AP_F=_AP_W-_AP_I, F2=_AP_W2-_AP_I2}; \ + typename RType<_AP_W2,_AP_I2,_AP_S2>::Rty r, lhs(*this), rhs(op2); \ + r.V = lhs.V.Fun(rhs.V); \ + return r; \ + } \ + INLINE typename RType<_AP_W,_AP_I,_AP_S>::Rty \ + operator Sym (const ap_fixed_base& op2) const \ + { \ + typename RType<_AP_W,_AP_I,_AP_S>::Rty r; \ + r.V = V Sym op2.V; \ + return r; \ + } \ + + OP_BIN_AF(+, plus, plus_w, plus_s, Add) + OP_BIN_AF(-, minus, minus_w, minus_s, Sub) + +#define OP_LOGIC_BIN_AF(Sym, Rty, Width, Sign) \ + template \ + INLINE typename RType<_AP_W2,_AP_I2,_AP_S2>::Rty \ + operator Sym (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const \ + { \ + typename RType<_AP_W2,_AP_I2,_AP_S2>::Rty r, lhs(*this), rhs(op2); \ + r.V=lhs.V Sym rhs.V; \ + return r; \ + } \ + INLINE typename RType<_AP_W,_AP_I,_AP_S>::Rty \ + operator Sym (const ap_fixed_base& op2) const \ + { \ + typename RType<_AP_W,_AP_I,_AP_S>::Rty r; \ + r.V = V Sym op2.V; \ + return r; \ + } \ + INLINE typename RType<_AP_W,_AP_I,_AP_S>::Rty operator Sym(int op2) const \ + { \ + return V Sym (op2<<(_AP_W - _AP_I)); \ + } + OP_LOGIC_BIN_AF(&, logic, logic_w, logic_s) + OP_LOGIC_BIN_AF(|, logic, logic_w, logic_s) + OP_LOGIC_BIN_AF(^, logic, logic_w, logic_s) + + ///Arithmic : assign + //------------------------------------------------------------------------- +#define OP_ASSIGN_AF(Sym) \ + template \ + INLINE ap_fixed_base& operator Sym##= (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) \ + { \ + *this=operator Sym (op2) ; \ + return *this; \ + } + + OP_ASSIGN_AF(+) + OP_ASSIGN_AF(-) + OP_ASSIGN_AF(&) + OP_ASSIGN_AF(|) + OP_ASSIGN_AF(^) + OP_ASSIGN_AF(*) + OP_ASSIGN_AF(/) + + ///Prefix increment, decrement + //------------------------------------------------------------------------- + INLINE ap_fixed_base& operator ++() { + operator+=(ap_fixed_base<1,1,false>(1)); //SystemC's semantics + return *this; + } + + INLINE ap_fixed_base& operator --() { + operator-=(ap_fixed_base<1,1,false>(1)); //SystemC's semantics + return *this; + } + + //Postfix increment, decrement + //------------------------------------------------------------------------- + INLINE const ap_fixed_base operator ++(int) { + ap_fixed_base t(*this); + operator++(); + return t; + } + + INLINE const ap_fixed_base operator --(int) { + ap_fixed_base t = *this; + operator--(); + return t; + } + + ///Unary arithmetic + //------------------------------------------------------------------------- + INLINE ap_fixed_base operator +() {return *this;} + + INLINE ap_fixed_base<_AP_W + 1, _AP_I + 1, true> operator -() const { + ap_fixed_base<_AP_W + 1, _AP_I + 1, true> Tmp(*this); + Tmp.V = - Tmp.V; + return Tmp; + } + + INLINE ap_fixed_base<_AP_W,_AP_I,true,_AP_Q,_AP_O, _AP_N> getNeg() { + ap_fixed_base<_AP_W,_AP_I,true,_AP_Q,_AP_O, _AP_N> Tmp(*this); + Tmp.V=-Tmp.V; + return Tmp; + } + + ///Not (!) + //------------------------------------------------------------------------- + INLINE bool operator !() const { + return !V; + } + + ///Bitwise complement + //------------------------------------------------------------------------- + INLINE ap_fixed_base<_AP_W, _AP_I, _AP_S> + operator ~() const { + ap_fixed_base<_AP_W, _AP_I, _AP_S> res(*this); + res.V.flip(); + return res; + } + + ///Shift + ///template argument as shift value + template + INLINE ap_fixed_base<_AP_W, _AP_I + _AP_SHIFT, _AP_S> lshift () const { + ap_fixed_base<_AP_W, _AP_I + _AP_SHIFT, _AP_S> r; + r.V = V; + return r; + } + + template + INLINE ap_fixed_base<_AP_W, _AP_I - _AP_SHIFT, _AP_S> rshift () const { + ap_fixed_base<_AP_W, _AP_I - _AP_SHIFT, _AP_S> r; + r.V = V; + return r; + } + + //Because the return type is the type of the the first operand, shift assign + //operators do not carry out any quantization or overflow + //While systemc, shift assigns for sc_fixed/sc_ufixed will result in + //quantization or overflow (depending on the mode of the first operand) + //------------------------------------------------------------------------- + INLINE ap_fixed_base operator << (int sh) const { + ap_fixed_base r; + bool isNeg=(sh&0x80000000) != 0; + sh=isNeg?-sh:sh; + bool shiftoverflow = sh >= _AP_W; + bool NegSrc = V.isNegative(); + if (isNeg) { + if (shiftoverflow) + NegSrc?r.V.set():r.V.clear(); + else + r.V=_AP_S?V.ashr(sh):V.lshr(sh); + } else { + if (shiftoverflow) + r.V.clear(); + else + r.V=V< 1 && sh <= _AP_W) + rb = (V << (_AP_W - sh + 1 )) != 0; + else if (sh > _AP_W) + rb = V != 0; + r.quantization_adjust(qb, rb, NegSrc); + } else if (isNeg == false && _AP_O != AP_WRAP) { + bool allones, allzeros; + if (sh < _AP_W ) { + ap_private<_AP_W, _AP_S > range1 = V.lshr(_AP_W - sh - 1); + allones = range1.isAllOnesValue(); + allzeros = range1.isMinValue(); + } else { + allones = false; + allzeros = V.isMinValue(); + } + bool overflow = !allzeros && !NegSrc; + bool underflow = !allones && NegSrc; + if (_AP_O == AP_SAT_SYM && _AP_S) + underflow |= NegSrc && (_AP_W > 1 ? r.V.isMinSignedValue():true); + bool lD = false; + if ( sh < _AP_W ) lD = V[_AP_W - sh - 1]; + r.overflow_adjust(underflow, overflow, lD, NegSrc); + } +#endif + return r; + } + + template + INLINE ap_fixed_base operator<<(const ap_private<_AP_W2,true>& op2) const { + int sh = op2.to_int(); + return operator << (sh); + } + + INLINE ap_fixed_base operator << (unsigned int sh ) const { + ap_fixed_base r; + bool shiftoverflow = sh >= _AP_W; + r.V = shiftoverflow ? ap_private<_AP_W, _AP_S >(0) : V << sh; + if (sh == 0) return r; +#ifdef __SC_COMPATIBLE__ + bool NegSrc = V.isNegative(); + if (_AP_O != AP_WRAP) { + bool allones, allzeros; + if (sh < _AP_W ) { + ap_private<_AP_W, _AP_S > range1 = V.lshr(_AP_W - sh -1); + allones = range1.isAllOnesValue(); + allzeros = range1.isMinValue(); + } else { + allones = false; + allzeros = V.isMinValue(); + } + bool overflow = !allzeros && !NegSrc; + bool underflow = !allones && NegSrc; + if (_AP_O == AP_SAT_SYM && _AP_S) + underflow |= NegSrc && (_AP_W > 1 ? r.V.isMinSignedValue():true); + bool lD = false; + if ( sh < _AP_W ) lD = V[_AP_W - sh - 1]; + r.overflow_adjust(underflow, overflow, lD, NegSrc); + } +#endif + return r; + } + + template + INLINE ap_fixed_base operator << (const ap_private<_AP_W2,false>& op2) const { + unsigned int sh = op2.to_uint(); + return operator << (sh); + } + + INLINE ap_fixed_base operator >> (int sh) const { + ap_fixed_base r; + bool isNeg=(sh&0x80000000) != 0; + bool NegSrc = V.isNegative(); + sh=isNeg?-sh:sh; + bool shiftoverflow = sh >= _AP_W; + if (isNeg && !shiftoverflow) r.V=V< 1 && sh <= _AP_W) + rb = (V << (_AP_W - sh + 1 )) != 0; + else if (sh > _AP_W) + rb = V != 0; + r.quantization_adjust(qb, rb, NegSrc); + } else if (isNeg == true && _AP_O != AP_WRAP) { + bool allones, allzeros; + if (sh < _AP_W ) { + ap_private<_AP_W, _AP_S > range1 = V.lshr(_AP_W - sh - 1); + allones = range1.isAllOnesValue(); + allzeros = range1.isMinValue(); + } else { + allones = false; + allzeros = V.isMinValue(); + } + bool overflow = !allzeros && !NegSrc; + bool underflow = !allones && NegSrc; + if (_AP_O == AP_SAT_SYM && _AP_S) + underflow |= NegSrc && (_AP_W > 1 ? r.V.isMinSignedValue():true); + bool lD = false; + if ( sh < _AP_W ) lD = V[_AP_W - sh - 1]; + r.overflow_adjust(underflow, overflow, lD, NegSrc); + } +#endif + return r; + } + + template + INLINE ap_fixed_base operator >> (const ap_private<_AP_W2,true>& op2) const { + int sh = op2.to_int(); + return operator >> (sh); + } + + INLINE ap_fixed_base operator >> (unsigned int sh) const { + ap_fixed_base r; + bool NegSrc = V.isNegative(); + bool shiftoverflow = sh >= _AP_W; + if (shiftoverflow) + NegSrc?r.V.set():r.V.clear(); + else + r.V=_AP_S?V.ashr(sh):V.lshr(sh); +#ifdef __SC_COMPATIBLE__ + if (sh == 0) return r; + if (_AP_Q != AP_TRN) { + bool qb = false; + if (sh <= _AP_W) qb = V[sh - 1]; + bool rb = false; + if (sh > 1 && sh <= _AP_W) + rb = (V << (_AP_W - sh + 1 )) != 0; + else if (sh > _AP_W) + rb = V != 0; + r.quantization_adjust(qb, rb, NegSrc); + } +#endif + return r; + } + + template + INLINE ap_fixed_base operator >> (const ap_private<_AP_W2,false>& op2) const { + unsigned int sh = op2.to_uint(); + return operator >> (sh); + } + + ///shift assign + //------------------------------------------------------------------------- +#define OP_AP_SHIFT_AP_ASSIGN_AF(Sym) \ + template \ + INLINE ap_fixed_base& operator Sym##=(const ap_private<_AP_W2,_AP_S2>& op2) \ + { \ + *this=operator Sym (op2); \ + return *this; \ + } + + OP_AP_SHIFT_AP_ASSIGN_AF(<<) + OP_AP_SHIFT_AP_ASSIGN_AF(>>) + + ///Support shift(ap_fixed_base) +#define OP_AP_SHIFT_AF(Sym) \ + template \ + INLINE ap_fixed_base operator Sym (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const \ + { \ + return operator Sym (op2.to_ap_private()); \ + } \ + template \ + INLINE ap_fixed_base& operator Sym##= (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) \ + { \ + *this=operator Sym (op2); \ + return *this; \ + } + + OP_AP_SHIFT_AF(<<) + OP_AP_SHIFT_AF(>>) + + INLINE ap_fixed_base& operator >>= (unsigned int sh) { + *this = operator >> (sh); + return *this; + } + + INLINE ap_fixed_base& operator <<= (unsigned int sh) { + *this = operator << (sh); + return *this; + } + + INLINE ap_fixed_base& operator >>= (int sh) { + *this = operator >> (sh); + return *this; + } + + INLINE ap_fixed_base& operator <<= (int sh) { + *this = operator << (sh); + return *this; + } + + ///Comparisons + //------------------------------------------------------------------------- + template + INLINE bool operator == (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + enum {_AP_F=_AP_W-_AP_I,F2=_AP_W2-_AP_I2, shAmt1 = AP_MAX(F2-_AP_F, 0), shAmt2 = AP_MAX(_AP_F-F2,0), _AP_W3 = (_AP_F==F2) ? AP_MAX(_AP_W,_AP_W2) : AP_MAX(_AP_W+shAmt1, _AP_W2+shAmt2)}; + ap_private<_AP_W3, _AP_S > OP1= ap_private<_AP_W3, _AP_S >(V)< OP2=ap_private<_AP_W3,_AP_S2 >(op2.V)< + INLINE bool operator != (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + return !(*this==op2); + } + + template + INLINE bool operator > (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + enum {_AP_F=_AP_W-_AP_I,F2=_AP_W2-_AP_I2, shAmt1 = AP_MAX(F2-_AP_F, 0), shAmt2 = AP_MAX(_AP_F-F2,0), _AP_W3 = (_AP_F==F2) ? AP_MAX(_AP_W,_AP_W2) : AP_MAX(_AP_W+shAmt1, _AP_W2+shAmt2)}; + ap_private<_AP_W3, _AP_S > OP1= ap_private<_AP_W3, _AP_S >(V)< OP2=ap_private<_AP_W3,_AP_S2 >(op2.V)< + INLINE bool operator <= (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + return !(*this>op2); + } + + template + INLINE bool operator < (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + enum {_AP_F=_AP_W-_AP_I,F2=_AP_W2-_AP_I2, shAmt1 = AP_MAX(F2-_AP_F, 0), shAmt2 = AP_MAX(_AP_F-F2,0), _AP_W3 = (_AP_F==F2) ? AP_MAX(_AP_W,_AP_W2) : AP_MAX(_AP_W+shAmt1, _AP_W2+shAmt2)}; + ap_private<_AP_W3, _AP_S > OP1= ap_private<_AP_W3, _AP_S >(V)< OP2=ap_private<_AP_W3,_AP_S2 >(op2.V)< + INLINE bool operator >= (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + return !(*this) + DOUBLE_CMP_AF(>=) + DOUBLE_CMP_AF(<) + DOUBLE_CMP_AF(<=) + + // Bit and Slice Select + INLINE af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N> operator [] (unsigned int index) { + assert(index<_AP_W&&"Attemping to read bit beyond MSB"); + return af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(this, index); + } + + INLINE af_bit_ref<_AP_W, _AP_I,_AP_S,_AP_Q,_AP_O, _AP_N> bit(unsigned int index) { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(this, index); + } + + template + INLINE af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N> bit (const ap_private<_AP_W2,_AP_S2>& index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(this, index.to_int()); + } + + INLINE bool bit (unsigned int index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return V[index]; + } + + INLINE bool operator [] (unsigned int index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return V[index]; + } + + template + INLINE bool bit (const ap_private<_AP_W2, _AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return V[index.to_uint()]; + } + + template + INLINE bool operator [] (const ap_private<_AP_W2, _AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return V[index.to_uint()]; + } + + INLINE af_bit_ref<_AP_W, _AP_I,_AP_S,_AP_Q,_AP_O, _AP_N> get_bit(int index) { + assert(index < _AP_I && "Attempting to read bit beyond MSB"); + assert(index >= _AP_I - _AP_W&& "Attempting to read bit beyond MSB"); + return af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(this, index + _AP_W - _AP_I); + } + + template + INLINE af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N> get_bit (const ap_private<_AP_W2, true>& index) { + assert(index >= _AP_I - _AP_W && "Attempting to read bit with negative index"); + assert(index < _AP_I && "Attempting to read bit beyond MSB"); + return af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(this, index.to_int() + _AP_W - _AP_I); + } + + INLINE bool get_bit (int index) const { + assert(index >= _AP_I - _AP_W && "Attempting to read bit with negative index"); + assert(index < _AP_I && "Attempting to read bit beyond MSB"); + return V[index + _AP_W - _AP_I]; + } + + template + INLINE bool get_bit (const ap_private<_AP_W2, true>& index) const { + assert(index >= _AP_I - _AP_W && "Attempting to read bit with negative index"); + assert(index < _AP_I && "Attempting to read bit beyond MSB"); + return V[index.to_int() + _AP_W - _AP_I]; + } + + INLINE af_range_ref<_AP_W,_AP_I,_AP_S, _AP_Q, _AP_O, _AP_N> + range(int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(this, Hi, Lo); + } + + INLINE af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> + operator () (int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(this, Hi, Lo); + } + + INLINE af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> + range(int Hi, int Lo) const { + assert((Hi < _AP_W) && (Lo < _AP_W) &&"Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(const_cast(this), Hi, Lo); + } + + INLINE af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> + operator () (int Hi, int Lo) const { + return this->range(Hi, Lo); + } + + template + INLINE af_range_ref<_AP_W,_AP_I,_AP_S, _AP_Q, _AP_O, _AP_N> + range(const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(this, Hi, Lo); + } + + template + INLINE af_range_ref<_AP_W,_AP_I,_AP_S, _AP_Q, _AP_O, _AP_N> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(this, Hi, Lo); + } + + template + INLINE af_range_ref<_AP_W,_AP_I,_AP_S, _AP_Q, _AP_O, _AP_N> + range(const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(const_cast< + ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>*>(this), + Hi, Lo); + } + + template + INLINE af_range_ref<_AP_W,_AP_I,_AP_S, _AP_Q, _AP_O, _AP_N> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + return this->range(Hi, Lo); + } + + INLINE af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> + range() { + return this->range(_AP_W - 1, 0); + } + + INLINE af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> + range() const { + return this->range(_AP_W - 1, 0); + } + + INLINE bool is_zero () const { + return V.isMinValue(); + } + + INLINE bool is_neg () const { + if (V.isNegative()) + return true; + return false; + } + + INLINE int wl () const { + return _AP_W; + } + + INLINE int iwl () const { + return _AP_I; + } + + INLINE ap_q_mode q_mode () const { + return _AP_Q; + } + + INLINE ap_o_mode o_mode () const { + return _AP_O; + } + + INLINE int n_bits () const { + return 0; + } + + //private: +public: + ap_private<_AP_W, _AP_S> V; +}; + +template +std::string ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>::to_string( + uint8_t radix, bool sign) const { + std::string str; + str.clear(); + char step; + std::string prefix; + switch (radix) { + case 2 : prefix = "0b"; step = 1; break; + case 8 : prefix = "0o"; step = 3; break; + case 16 : prefix = "0x"; step = 4; break; + default : break; + } + if (_AP_W <= _AP_I) + str = this->to_ap_private().to_string(radix, + radix == 10 ? _AP_S : sign); + else { + if (radix == 10) { + bool isNeg = _AP_S && V.isNegative(); + if (_AP_I > 0) { + ap_private int_part(0); + int_part = this->to_ap_private(); + str += int_part.to_string(radix, false); + } else { + if (isNeg) str += '-'; + } + ap_fixed_base<_AP_W, _AP_I, _AP_S> tmp(*this); + if (isNeg && _AP_I <= 0) tmp = -tmp; + ap_fixed_base<_AP_W - AP_MIN(_AP_I, 0), 0, false> frac_part = tmp; + if (frac_part == 0) return str; + str += "."; + while (frac_part != 0) { + char digit = (frac_part * radix).to_ap_private(); + str += static_cast(digit + '0'); + frac_part *= radix; + } + } else { + if (_AP_I > 0) { + for (signed i = _AP_W - _AP_I; i < _AP_W; i += step) { + + char digit = (char)(this->range(AP_MIN(i + step - 1, _AP_W - 1), i)); + str = (digit < 10 ? static_cast(digit + '0') : + static_cast(digit - 10 + 'a')) + str; + } + } + str += '.'; + ap_fixed_base tmp(*this); + for (signed i = _AP_W - _AP_I - 1; i >= 0; i -= step) { + char digit = (char)(tmp.range(i, AP_MAX(0, i - step + 1))); + str += digit < 10 ? static_cast(digit + '0') : + static_cast(digit - 10 + 'a'); + } + } + } + str = prefix + str; + return str; +} + +template +INLINE void b_not(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op) { + ret.V = op.V; + ret.V.flip(); +} + +template +INLINE void b_and(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op1, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op2) { + ret.V = op1.V & op2.V; +} + +template +INLINE void b_or(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op1, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op2) { + ret.V = op1.V | op2.V; +} + +template +INLINE void b_xor(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op1, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op2) { + ret.V = op1.V ^ op2.V; +} + +template +INLINE void neg(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op) { + ap_fixed_base<_AP_W2+!_AP_S2, _AP_I2+!_AP_S2, true, _AP_Q2, _AP_O2, _AP_N2> Tmp; + Tmp.V = - op.V; + ret = Tmp; +} + +template +INLINE void neg(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op) { + ret.V = -op.V; +} + +template +INLINE void lshift(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op, + int i) { + ap_fixed_base<_AP_W2 - _AP_I2 + AP_MAX(_AP_I, _AP_I2), AP_MAX(_AP_I, _AP_I2), _AP_S2, _AP_Q2, _AP_O2, _AP_N2> Tmp; + Tmp = op; + Tmp.V <<= i; + ret = Tmp; +} + +template +INLINE void lshift(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op, + int i) { + ret.V = op.V << i; +} + +template +INLINE void rshift(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op, + int i) { + ap_fixed_base<_AP_I2 + AP_MAX(_AP_W - _AP_I, _AP_W2 - _AP_I2), _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> Tmp; + Tmp = op; + Tmp.V = _AP_S2 ? Tmp.V.ashr(i): Tmp.V.lshr(i); + ret = Tmp; +} + +template +INLINE void rshift(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op, + int i) { + ret.V = _AP_S ? op.V.ashr(i): op.V.lshr(i); +} + +#define AF_CTOR_SPEC_BASE(_AP_W,_AP_S,C_TYPE) \ + template<> INLINE ap_fixed_base<_AP_W,_AP_W,_AP_S,AP_TRN,AP_WRAP>::ap_fixed_base(C_TYPE i_op):V(i_op) \ + { \ + } + +#define AF_CTOR_SPEC(__W,C_TYPE) \ + AF_CTOR_SPEC_BASE(__W,true,C_TYPE) \ + AF_CTOR_SPEC_BASE(__W,false,C_TYPE) + +AF_CTOR_SPEC(1,bool) +AF_CTOR_SPEC(8, signed char) +AF_CTOR_SPEC(8, unsigned char) +AF_CTOR_SPEC(16, signed short) +AF_CTOR_SPEC(16, unsigned short) +AF_CTOR_SPEC(32, signed int) +AF_CTOR_SPEC(32, unsigned int) +AF_CTOR_SPEC(64, ap_slong) +AF_CTOR_SPEC(64, ap_ulong) + +///Output streaming +//----------------------------------------------------------------------------- +template +INLINE std::ostream& +operator <<(std::ostream& os, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& x) { + os << x.to_double(); + return os; +} + +///Input streaming +//----------------------------------------------------------------------------- +template +INLINE std::istream& +operator >> (std::istream& os, ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& x) { + double d; + os >> d; + x = ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(x); + return os; +} + +template +INLINE void print(const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& x) { + ap_private<_AP_W,_AP_S> data=x.V; + if (_AP_I>0) { + const ap_private<_AP_I,_AP_S> p1=data>>(_AP_W-_AP_I); + print(p1); + + } else + printf("0"); + printf("."); + if (_AP_I<_AP_W) { + const ap_private<_AP_W-_AP_I,false> p2=data; + print(p2,false); + } +} + +///Operators mixing Integers with ap_fixed_base +//----------------------------------------------------------------------------- +#if 1 +#define AF_BIN_OP_WITH_INT_SF(BIN_OP,C_TYPE,_AP_W2,_AP_S2,RTYPE) \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op.operator BIN_OP(ap_private<_AP_W2,_AP_S2>(i_op)); \ + } +#define AF_BIN_OP_WITH_INT(BIN_OP, C_TYPE, _AP_W2,_AP_S2,RTYPE) \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op.operator BIN_OP (ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } \ + \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (C_TYPE i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) \ + { \ + return ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op).operator BIN_OP (op); \ + } + +#else +#define AF_BIN_OP_WITH_INT_SF(BIN_OP,C_TYPE,_AP_W2,_AP_S2,RTYPE) \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op BIN_OP (i_op); \ + } +#define AF_BIN_OP_WITH_INT(BIN_OP, C_TYPE, _AP_W2,_AP_S2,RTYPE) \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op.V BIN_OP (i_op<<(_AP_W-_AP_I)); \ + } \ + \ + \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (C_TYPE i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) \ + { \ + return ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op).operator BIN_OP (op); \ + } + +#endif +#if 1 +#define AF_REL_OP_WITH_INT(REL_OP, C_TYPE, _AP_W2,_AP_S2) \ + template \ + INLINE bool operator REL_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op.operator REL_OP (ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } \ + \ + \ + template \ + INLINE bool operator REL_OP (C_TYPE i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) \ + { \ + return ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op).operator REL_OP (op); \ + } +#else +#define AF_REL_OP_WITH_INT(REL_OP, C_TYPE, _AP_W2,_AP_S2) \ + template \ + INLINE bool operator REL_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op.V.operator REL_OP (i_op<<(_AP_W-_AP_I)); \ + } \ + \ + \ + template \ + INLINE bool operator REL_OP (C_TYPE i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) \ + { \ + return (i_op<<(_AP_W-_AP_I)) REL_OP (op.V.VAL); \ + } +#endif +#if 1 +#define AF_ASSIGN_OP_WITH_INT(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& operator ASSIGN_OP ( ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) { \ + return op.operator ASSIGN_OP (ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } +#define AF_ASSIGN_OP_WITH_INT_SF(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& operator ASSIGN_OP ( ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) { \ + return op.operator ASSIGN_OP (ap_private<_AP_W2,_AP_S2>(i_op)); \ + } +#else +#define AF_ASSIGN_OP_WITH_INT(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& operator ASSIGN_OP ( ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) { \ + return op.V.operator ASSIGN_OP (i_op); \ + } +#define AF_ASSIGN_OP_WITH_INT_SF(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& operator ASSIGN_OP ( ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) { \ + return op.V.operator ASSIGN_OP (i_op); \ + } +#endif + +#define AF_OPS_WITH_INT(C_TYPE, WI, SI) \ + AF_BIN_OP_WITH_INT(+, C_TYPE, WI, SI, plus) \ + AF_BIN_OP_WITH_INT(-, C_TYPE, WI, SI, minus) \ + AF_BIN_OP_WITH_INT(*, C_TYPE, WI, SI, mult) \ + AF_BIN_OP_WITH_INT(/, C_TYPE, WI, SI, div) \ + AF_BIN_OP_WITH_INT_SF(>>, C_TYPE, WI, SI, arg1) \ + AF_BIN_OP_WITH_INT_SF(<<, C_TYPE, WI, SI, arg1) \ + AF_BIN_OP_WITH_INT(&, C_TYPE, WI, SI, logic) \ + AF_BIN_OP_WITH_INT(|, C_TYPE, WI, SI, logic) \ + AF_BIN_OP_WITH_INT(^, C_TYPE, WI, SI, logic) \ + \ + AF_REL_OP_WITH_INT(==, C_TYPE, WI, SI) \ + AF_REL_OP_WITH_INT(!=, C_TYPE, WI, SI) \ + AF_REL_OP_WITH_INT(>, C_TYPE, WI, SI) \ + AF_REL_OP_WITH_INT(>=, C_TYPE, WI, SI) \ + AF_REL_OP_WITH_INT(<, C_TYPE, WI, SI) \ + AF_REL_OP_WITH_INT(<=, C_TYPE, WI, SI) \ + \ + AF_ASSIGN_OP_WITH_INT(+=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(-=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(*=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(/=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT_SF(>>=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT_SF(<<=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(&=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(|=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(^=, C_TYPE, WI, SI) + +AF_OPS_WITH_INT(bool, 1, false) +AF_OPS_WITH_INT(char, 8, true) +AF_OPS_WITH_INT(signed char, 8, true) +AF_OPS_WITH_INT(unsigned char, 8, false) +AF_OPS_WITH_INT(short, 16, true) +AF_OPS_WITH_INT(unsigned short, 16, false) +AF_OPS_WITH_INT(int, 32, true) +AF_OPS_WITH_INT(unsigned int, 32, false) +# if defined __x86_64__ +AF_OPS_WITH_INT(long, 64, true) +AF_OPS_WITH_INT(unsigned long, 64, false) +# else +AF_OPS_WITH_INT(long, 32, true) +AF_OPS_WITH_INT(unsigned long, 32, false) +# endif +AF_OPS_WITH_INT(ap_slong, 64, true) +AF_OPS_WITH_INT(ap_ulong, 64, false) + +#define AF_BIN_OP_WITH_AP_INT(BIN_OP, RTYPE) \ + template \ + INLINE typename ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>::template RType<_AP_W,_AP_I,_AP_S>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W2,_AP_S2>& i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) { \ + return ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op).operator BIN_OP (op); \ + } \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP ( const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, const ap_private<_AP_W2,_AP_S2>& i_op) { \ + return op.operator BIN_OP (ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } + +#define AF_REL_OP_WITH_AP_INT(REL_OP) \ + template \ + INLINE bool operator REL_OP ( const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, const ap_private<_AP_W2,_AP_S2>& i_op) { \ + return op.operator REL_OP ( ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } \ + template \ + INLINE bool operator REL_OP ( const ap_private<_AP_W2,_AP_S2>& i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) { \ + return ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op).operator REL_OP (op); \ + } + +#define AF_ASSIGN_OP_WITH_AP_INT(ASSIGN_OP) \ + template \ + INLINE ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& operator ASSIGN_OP ( ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, const ap_private<_AP_W2,_AP_S2>& i_op) { \ + return op.operator ASSIGN_OP (ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } \ + template \ + INLINE ap_private<_AP_W2,_AP_S2>& operator ASSIGN_OP ( ap_private<_AP_W2,_AP_S2>& i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) { \ + return i_op.operator ASSIGN_OP (op.to_ap_private()); \ + } + +AF_BIN_OP_WITH_AP_INT(+, plus) +AF_BIN_OP_WITH_AP_INT(-, minus) +AF_BIN_OP_WITH_AP_INT(*, mult) +AF_BIN_OP_WITH_AP_INT(/, div) +AF_BIN_OP_WITH_AP_INT(&, logic) +AF_BIN_OP_WITH_AP_INT(|, logic) +AF_BIN_OP_WITH_AP_INT(^, logic) + +AF_REL_OP_WITH_AP_INT(==) +AF_REL_OP_WITH_AP_INT(!=) +AF_REL_OP_WITH_AP_INT(>) +AF_REL_OP_WITH_AP_INT(>=) +AF_REL_OP_WITH_AP_INT(<) +AF_REL_OP_WITH_AP_INT(<=) + +AF_ASSIGN_OP_WITH_AP_INT(+=) +AF_ASSIGN_OP_WITH_AP_INT(-=) +AF_ASSIGN_OP_WITH_AP_INT(*=) +AF_ASSIGN_OP_WITH_AP_INT(/=) +AF_ASSIGN_OP_WITH_AP_INT(&=) +AF_ASSIGN_OP_WITH_AP_INT(|=) +AF_ASSIGN_OP_WITH_AP_INT(^=) + +#define AF_REF_REL_OP_MIX_INT(REL_OP, C_TYPE, _AP_W2, _AP_S2) \ +template \ + INLINE bool operator REL_OP ( const af_range_ref<_AP_W,_AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op, C_TYPE op2) { \ + return (ap_private<_AP_W, false>(op)).operator REL_OP (ap_private<_AP_W2,_AP_S2>(op2)); \ + } \ +template \ + INLINE bool operator REL_OP ( C_TYPE op2, const af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op) { \ + return ap_private<_AP_W2,_AP_S2>(op2).operator REL_OP (ap_private<_AP_W, false>(op)); \ + } \ +template \ + INLINE bool operator REL_OP ( const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op, C_TYPE op2) { \ + return (bool(op)) REL_OP op2; \ + } \ +template \ + INLINE bool operator REL_OP ( C_TYPE op2, const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op) { \ + return op2 REL_OP (bool(op)); \ + } + +#define AF_REF_REL_MIX_INT(C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(>, C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(<, C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(>=, C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(<=, C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(==, C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(!=, C_TYPE, _AP_WI, _AP_SI) + +AF_REF_REL_MIX_INT(bool, 1, false) +AF_REF_REL_MIX_INT(char, 8, true) +AF_REF_REL_MIX_INT(signed char, 8, true) +AF_REF_REL_MIX_INT(unsigned char, 8, false) +AF_REF_REL_MIX_INT(short, 16, true) +AF_REF_REL_MIX_INT(unsigned short, 16, false) +AF_REF_REL_MIX_INT(int, 32, true) +AF_REF_REL_MIX_INT(unsigned int, 32, false) +# if defined __x86_64__ +AF_REF_REL_MIX_INT(long, 64, true) +AF_REF_REL_MIX_INT(unsigned long, 64, false) +# else +AF_REF_REL_MIX_INT(long, 32, true) +AF_REF_REL_MIX_INT(unsigned long, 32, false) +# endif +AF_REF_REL_MIX_INT(ap_slong, 64, true) +AF_REF_REL_MIX_INT(ap_ulong, 64, false) + +#define AF_REF_REL_OP_AP_INT(REL_OP) \ +template \ + INLINE bool operator REL_OP ( const af_range_ref<_AP_W,_AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op, const ap_private<_AP_W2, _AP_S> &op2) { \ + return (ap_private<_AP_W, false>(op)).operator REL_OP (op2); \ + } \ +template \ + INLINE bool operator REL_OP (const ap_private<_AP_W2, _AP_S2> &op2, const af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op) { \ + return op2.operator REL_OP (ap_private<_AP_W, false>(op)); \ + } \ +template \ + INLINE bool operator REL_OP ( const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op, const ap_private<_AP_W2, _AP_S2> &op2) { \ + return (ap_private<1, false>(op)).operator REL_OP (op2); \ + } \ +template \ + INLINE bool operator REL_OP ( const ap_private<_AP_W2, _AP_S2> &op2, const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op) { \ + return op2.operator REL_OP (ap_private<1,false>(op)); \ + } + +AF_REF_REL_OP_AP_INT(>) +AF_REF_REL_OP_AP_INT(<) +AF_REF_REL_OP_AP_INT(>=) +AF_REF_REL_OP_AP_INT(<=) +AF_REF_REL_OP_AP_INT(==) +AF_REF_REL_OP_AP_INT(!=) + +// Relational Operators with double +template +INLINE bool operator == ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator == (op1); +} + +template +INLINE bool operator != ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator != (op1); +} + +template +INLINE bool operator > ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator < (op1); +} + +template +INLINE bool operator >= ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator <= (op1); +} + +template +INLINE bool operator < ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator > (op1); +} + +template +INLINE bool operator <= ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator >= (op1); +} + +#endif /* #ifndef __AESL_GCC_AP_FIXED_H__ */ \ No newline at end of file diff --git a/hls_2018/router_02_boardstr/etc/ap_int_sim.h b/hls_2018/router_02_boardstr/etc/ap_int_sim.h new file mode 100755 index 0000000..887ccd8 --- /dev/null +++ b/hls_2018/router_02_boardstr/etc/ap_int_sim.h @@ -0,0 +1,1629 @@ +/* + * Copyright 2012 Xilinx, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __AESL_GCC_AP_INT_H__ +#define __AESL_GCC_AP_INT_H__ + +#ifndef __cplusplus +#error C++ is required to include this header file +#endif /* #ifndef __cplusplus */ + +#undef _AP_DEBUG_ +#include +#include + +// for safety +#if (defined(_AP_N)|| defined(_AP_C)) +#error One or more of the following is defined: _AP_N, _AP_C. Definition conflicts with their usage as template parameters. +#endif /* #if (defined(_AP_N)|| defined(_AP_C)) */ + +// for safety +#if (defined(_AP_W) || defined(_AP_I) || defined(_AP_S) || defined(_AP_Q) || defined(_AP_O) || defined(_AP_W2) || defined(_AP_I2) || defined(_AP_S2) || defined(_AP_Q2) || defined(_AP_O2)) +#error One or more of the following is defined: _AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2. Definition conflicts with their usage as template parameters. +#endif /* #if (defined(_AP_W) || defined(_AP_I) || defined(_AP_S) || defined(_AP_Q) || defined(_AP_O) || defined(_AP_W2) || defined(_AP_I2) || defined(_AP_S2) || defined(_AP_Q2) || defined(_AP_O2)) */ + +//for safety +#if (defined(_AP_W3) || defined(_AP_S3) || defined(_AP_W4) || defined(_AP_S4)) +#error One or more of the following is defined: _AP_W3, _AP_S3, _AP_W4,_AP_S4. Definition conflicts with their usage as template parameters. +#endif /* #if (defined(_AP_W3) || defined(_AP_S3) || defined(_AP_W4) || defined(_AP_S4)) */ + +//for safety +#if (defined(_AP_W1) || defined(_AP_S1) || defined(_AP_I1) || defined(_AP_T) || defined(_AP_T1) || defined(_AP_T2) || defined(_AP_T3) || defined(_AP_T4)) +#error One or more of the following is defined: _AP_W1, _AP_S1, _AP_I1, _AP_T, _AP_T1, _AP_T2, _AP_T3, _AP_T4. Definition conflicts with their usage as template parameters. +#endif /* #if (defined(_AP_W1) || defined(_AP_S1) || defined(_AP_I1) || defined(_AP_T) || defined(_AP_T1) || defined(_AP_T2) || defined(_AP_T3) || defined(_AP_T4)) */ + +#define __AESL_APDT_IN_SCFLOW__ +#ifndef __AESL_APDT_IN_SCFLOW__ + #include "etc/ap_private.h" +#else + #include "../etc/ap_private.h" +#endif /* #ifndef __AESL_APDT_IN_SCFLOW__ */ + +#ifdef _AP_DEBUG_ + #define AP_DEBUG(s) s +#else + #define AP_DEBUG(s) +#endif /* #ifdef _AP_DEBUG_ */ + +#ifndef __SIMULATION__ + #define __SIMULATION__ +#endif /* #ifndef __SIMULATION__ */ + +#if !(defined SYSTEMC_H) && !(defined SYSTEMC_INCLUDED) + #ifndef SC_TRN + #define SC_TRN AP_TRN + #endif /* #ifndef SC_TRN */ + #ifndef SC_RND + #define SC_RND AP_RND + #endif /* #ifndef SC_RND */ + #ifndef SC_TRN_ZERO + #define SC_TRN_ZERO AP_TRN_ZERO + #endif /* #ifndef SC_TRN_ZERO */ + #ifndef SC_RND_ZERO + #define SC_RND_ZERO AP_RND_ZERO + #endif /* #ifndef SC_RND_ZERO */ + #ifndef SC_RND_INF + #define SC_RND_INF AP_RND_INF + #endif /* #ifndef SC_RND_INF */ + #ifndef SC_RND_MIN_INF + #define SC_RND_MIN_INF AP_RND_MIN_INF + #endif /* #ifndef SC_RND_MIN_INF */ + #ifndef SC_RND_CONV + #define SC_RND_CONV AP_RND_CONV + #endif /* #ifndef SC_RND_CONV */ + #ifndef SC_WRAP + #define SC_WRAP AP_WRAP + #endif /* #ifndef SC_WRAP */ + #ifndef SC_SAT + #define SC_SAT AP_SAT + #endif /* #ifndef SC_SAT */ + #ifndef SC_SAT_ZERO + #define SC_SAT_ZERO AP_SAT_ZERO + #endif /* #ifndef SC_SAT_ZERO */ + #ifndef SC_SAT_SYM + #define SC_SAT_SYM AP_SAT_SYM + #endif /* #ifndef SC_SAT_SYM */ + #ifndef SC_WRAP_SM + #define SC_WRAP_SM AP_WRAP_SM + #endif /* #ifndef SC_WRAP_SM */ + #ifndef SC_BIN + #define SC_BIN AP_BIN + #endif /* #ifndef SC_BIN */ + #ifndef SC_OCT + #define SC_OCT AP_OCT + #endif /* #ifndef SC_OCT */ + #ifndef SC_DEC + #define SC_DEC AP_DEC + #endif /* #ifndef SC_DEC */ + #ifndef SC_HEX + #define SC_HEX AP_HEX + #endif /* #ifndef SC_HEX */ +#endif /* #if !(defined SYSTEMC_H) && !(defined SYSTEMC_INCLUDED) */ +#ifndef AP_INT_MAX_W +#define AP_INT_MAX_W 1024 +#endif +#define BIT_WIDTH_UPPER_LIMIT (1 << 15) +#if AP_INT_MAX_W > BIT_WIDTH_UPPER_LIMIT +#error "Bitwidth exceeds 32768 (1 << 15), the maximum allowed value" +#endif +#define MAX_MODE(BITS) ((BITS + 1023) / 1024) + +///Forward declaration +template struct ap_range_ref; +template struct ap_bit_ref; + +template struct ap_fixed_base; +template struct af_range_ref; +template struct af_bit_ref; +template class ap_uint; + +enum { + AP_BIN = 2, + AP_OCT = 8, + AP_DEC = 10, + AP_HEX = 16 +}; + +///Why to use reference? +///Because we will operate the original object indirectly by operating the +///result object directly after concating or part selecting + +///Proxy class which allows concatination to be used as rvalue(for reading) and +//lvalue(for writing) + +/// Concatination reference. +// ---------------------------------------------------------------- +template +struct ap_concat_ref { +#ifdef _MSC_VER + #pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ + enum {_AP_WR=_AP_W1+_AP_W2,}; + _AP_T1& mbv1; + _AP_T2& mbv2; + + INLINE ap_concat_ref(const ap_concat_ref<_AP_W1, _AP_T1, + _AP_W2, _AP_T2>& ref): + mbv1(ref.mbv1), mbv2(ref.mbv2) {} + + INLINE ap_concat_ref(_AP_T1& bv1, _AP_T2& bv2):mbv1(bv1),mbv2(bv2) {} + + template + INLINE ap_concat_ref& operator = (const ap_private<_AP_W3,_AP_S3>& val) { + ap_private<_AP_W1+_AP_W2, false> vval(val); + int W_ref1=mbv1.length(); + int W_ref2=mbv2.length(); + ap_private<_AP_W1,false> mask1(-1); + mask1>>=_AP_W1-W_ref1; + ap_private<_AP_W2,false> mask2(-1); + mask2>>=_AP_W2-W_ref2; + mbv1.set(ap_private<_AP_W1,false>((vval>>W_ref2)&mask1)); + mbv2.set(ap_private<_AP_W2,false>(vval&mask2)); + return *this; + } + + INLINE ap_concat_ref& operator = (unsigned long long val) { + ap_private<_AP_W1+_AP_W2, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE ap_concat_ref& operator = + (const ap_concat_ref <_AP_W3, _AP_T3, _AP_W4, _AP_T4>& val) { + ap_private<_AP_W1+_AP_W2, false> tmpVal(val); + return operator = (tmpVal); + } + + INLINE ap_concat_ref& operator = + (const ap_concat_ref <_AP_W1, _AP_T1, _AP_W2, _AP_T2>& val) { + ap_private<_AP_W1+_AP_W2, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE ap_concat_ref& operator =(const ap_bit_ref<_AP_W3, _AP_S3>& val) { + ap_private<_AP_W1+_AP_W2, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE ap_concat_ref& operator =(const ap_range_ref<_AP_W3,_AP_S3>& val) { + ap_private<_AP_W1+_AP_W2, false> tmpVal(val); + return operator =(tmpVal); + } + + template + INLINE ap_concat_ref& operator= (const af_range_ref<_AP_W3, _AP_I3, _AP_S3, + _AP_Q3, _AP_O3, _AP_N3>& val) { + return operator = ((const ap_private<_AP_W3, false>)(val)); + } + + template + INLINE ap_concat_ref& operator= (const ap_fixed_base<_AP_W3, _AP_I3, _AP_S3, + _AP_Q3, _AP_O3, _AP_N3>& val) { + return operator = (val.to_ap_private()); + } + + template + INLINE ap_concat_ref& operator= (const af_bit_ref<_AP_W3, _AP_I3, _AP_S3, + _AP_Q3, _AP_O3, _AP_N3>& val) { + return operator=((unsigned long long)(bool)(val)); + } + + + INLINE operator ap_private<_AP_WR, false> () const { + return get(); + } + + INLINE operator unsigned long long () const { + return get().to_uint64(); + } + + template + INLINE ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3, ap_range_ref<_AP_W3, _AP_S3> > + operator, (const ap_range_ref<_AP_W3, _AP_S3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, + _AP_W3, ap_range_ref<_AP_W3, _AP_S3> >(*this, + const_cast &>(a2)); + } + + template + INLINE ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3, ap_private<_AP_W3, _AP_S3> > + operator, (ap_private<_AP_W3, _AP_S3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, + _AP_W3, ap_private<_AP_W3, _AP_S3> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3, ap_private<_AP_W3, _AP_S3> > + operator, (const ap_private<_AP_W3, _AP_S3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, + _AP_W3, ap_private<_AP_W3, _AP_S3> >(*this, + const_cast&>(a2)); + } + + template + INLINE ap_concat_ref<_AP_WR, ap_concat_ref, 1, ap_bit_ref<_AP_W3, _AP_S3> > + operator, (const ap_bit_ref<_AP_W3, _AP_S3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, + 1, ap_bit_ref<_AP_W3, _AP_S3> >(*this, + const_cast &>(a2)); + } + + template + INLINE ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3+_AP_W4, ap_concat_ref<_AP_W3,_AP_T3,_AP_W4,_AP_T4> > + operator, (const ap_concat_ref<_AP_W3,_AP_T3,_AP_W4,_AP_T4> &a2) + { + return ap_concat_ref<_AP_WR, ap_concat_ref, + _AP_W3+_AP_W4, ap_concat_ref<_AP_W3,_AP_T3,_AP_W4, + _AP_T4> >(*this, const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3, af_range_ref<_AP_W3, _AP_I3, _AP_S3, _AP_Q3, _AP_O3, _AP_N3> > + operator, (const af_range_ref<_AP_W3, _AP_I3, _AP_S3, _AP_Q3, + _AP_O3, _AP_N3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3, af_range_ref<_AP_W3, + _AP_I3, _AP_S3, _AP_Q3, _AP_O3, _AP_N3> >(*this, + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<_AP_WR, ap_concat_ref, 1, af_bit_ref<_AP_W3, _AP_I3, _AP_S3, _AP_Q3, _AP_O3, _AP_N3> > + operator, (const af_bit_ref<_AP_W3, _AP_I3, _AP_S3, _AP_Q3, + _AP_O3, _AP_N3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, 1, af_bit_ref<_AP_W3, + _AP_I3, _AP_S3, _AP_Q3, _AP_O3, _AP_N3> >(*this, + const_cast& >(a2)); + } + + template + INLINE ap_private + operator & (const ap_private<_AP_W3,_AP_S3>& a2) { + return get() & a2; + } + + + template + INLINE ap_private + operator | (const ap_private<_AP_W3,_AP_S3>& a2) { + return get() | a2; + } + + + template + INLINE ap_private + operator ^ (const ap_private<_AP_W3,_AP_S3>& a2) { + return ap_private(get() ^ a2); + } + + INLINE const ap_private<_AP_WR, false> get() const + { + ap_private<_AP_W1+_AP_W2, false> tmpVal = ap_private<_AP_W1+_AP_W2, false> (mbv1.get()); + ap_private<_AP_W1+_AP_W2, false> tmpVal2 = ap_private<_AP_W1+_AP_W2, false> (mbv2.get()); + int W_ref2 = mbv2.length(); + tmpVal <<= W_ref2; + tmpVal |= tmpVal2; + return tmpVal; + } + + INLINE const ap_private<_AP_WR, false> get() { + ap_private<_AP_W1+_AP_W2, false> tmpVal = ap_private<_AP_W1+_AP_W2, false> ( mbv1.get()); + ap_private<_AP_W1+_AP_W2, false> tmpVal2 = ap_private<_AP_W1+_AP_W2, false> (mbv2.get()); + int W_ref2 = mbv2.length(); + tmpVal <<= W_ref2; + tmpVal |= tmpVal2; + return tmpVal; + } + + template + INLINE void set(const ap_private<_AP_W3,false> & val) { + ap_private<_AP_W1+_AP_W2, false> vval(val); + int W_ref1=mbv1.length(); + int W_ref2=mbv2.length(); + ap_private<_AP_W1,false> mask1(-1); + mask1>>=_AP_W1-W_ref1; + ap_private<_AP_W2,false> mask2(-1); + mask2>>=_AP_W2-W_ref2; + mbv1.set(ap_private<_AP_W1,false>((vval>>W_ref2)&mask1)); + mbv2.set(ap_private<_AP_W2,false>(vval&mask2)); + } + + INLINE int length() const { + return mbv1.length()+mbv2.length(); + } + + INLINE std::string to_string(uint8_t radix=2) const { + return get().to_string(radix); + } +}; + +///Proxy class, which allows part selection to be used as rvalue(for reading) and +//lvalue(for writing) + +///Range(slice) reference +//------------------------------------------------------------ +template +struct ap_range_ref { +#ifdef _MSC_VER + #pragma warning( disable : 4521 4522 ) +#endif /* #ifdef _MSC_VER */ + ap_private<_AP_W,_AP_S> &d_bv; + int l_index; + int h_index; + +public: + INLINE ap_range_ref(const ap_range_ref<_AP_W, _AP_S>& ref): + d_bv(ref.d_bv), l_index(ref.l_index), h_index(ref.h_index) {} + + INLINE ap_range_ref(ap_private<_AP_W,_AP_S>* bv, int h, int l): + d_bv(*bv),l_index(l),h_index(h) { + //if (h < l) + //fprintf(stderr, "Warning! The bits selected will be returned in reverse order\n"); + } + + INLINE operator ap_private<_AP_W, false> () const { + ap_private<_AP_W, false> val(0); + if(h_index>=l_index) { + if (_AP_W > 64) { + val=d_bv; + ap_private<_AP_W,false> mask(-1); + mask>>=_AP_W-(h_index-l_index+1); + val>>=l_index; + val&=mask; + } else { + const static uint64_t mask = (~0ULL>> (64>_AP_W ? (64-_AP_W):0)); + val = (d_bv >> l_index) & (mask >>(_AP_W-(h_index-l_index+1))); + } + } else { + for(int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + if((d_bv)[j]) val.set(i); + } + return val; + } + + INLINE operator unsigned long long () const { + return to_uint64(); + } + + template + INLINE ap_range_ref& operator =(const ap_private<_AP_W2,_AP_S2>& val) { + ap_private<_AP_W,false> vval=ap_private<_AP_W,false>(val); + if (l_index>h_index) { + for (int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + (vval)[i]? d_bv.set(j):d_bv.clear(j); + } else { + if (_AP_W > 64) { + ap_private<_AP_W,false> mask(-1); + if (l_index>0) { + mask<<=l_index; + vval<<=l_index; + } + if(h_index<_AP_W-1) + { + ap_private<_AP_W,false> mask2(-1); + mask2>>=_AP_W-h_index-1; + mask&=mask2; + vval&=mask2; + } + mask.flip(); + d_bv&=mask; + d_bv|=vval; + } else { + unsigned shift = 64-_AP_W; + uint64_t mask = ~0ULL>>(shift); + if(l_index>0) + { + vval = mask & vval << l_index; + mask = mask & mask << l_index; + } + if(h_index<_AP_W-1) + { + uint64_t mask2 = mask; + mask2 >>= (_AP_W-h_index-1); + mask&=mask2; + vval&=mask2; + } + mask = ~mask; + d_bv&=mask; + d_bv|=vval; + } + } + return *this; + } + + INLINE ap_range_ref& operator = (unsigned long long val) + { + const ap_private<_AP_W,_AP_S> vval=val; + return operator = (vval); + } + + + INLINE ap_range_ref& operator =(const ap_range_ref<_AP_W, _AP_S>& val) + { + const ap_private<_AP_W, false> tmpVal(val); + return operator =(tmpVal); + } + + + + template + INLINE ap_range_ref& operator = + (const ap_concat_ref <_AP_W3, _AP_T3, _AP_W4, _AP_T4>& val) + { + const ap_private<_AP_W, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE ap_range_ref& operator =(const ap_range_ref<_AP_W3,_AP_S3>& val) + { + const ap_private<_AP_W, false> tmpVal(val); + return operator =(tmpVal); + } + + template + INLINE ap_range_ref& operator= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=((const ap_private<_AP_W2, _AP_S2>)(val)); + } + + template + INLINE ap_range_ref& operator= (const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=(val.to_ap_private()); + } + + template + INLINE ap_range_ref& operator= (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=((unsigned long long)(bool)(val)); + } + + template + INLINE ap_range_ref& operator= (const ap_bit_ref<_AP_W2, _AP_S2>& val) { + return operator=((unsigned long long)(bool)(val)); + } + + template + INLINE + ap_concat_ref<_AP_W,ap_range_ref,_AP_W2,ap_range_ref<_AP_W2,_AP_S2> > + operator, (const ap_range_ref<_AP_W2,_AP_S2> &a2) + { + return + ap_concat_ref<_AP_W, ap_range_ref, _AP_W2, + ap_range_ref<_AP_W2,_AP_S2> >(*this, + const_cast& >(a2)); + } + + + template + INLINE ap_concat_ref<_AP_W,ap_range_ref,_AP_W2,ap_private<_AP_W2,_AP_S2> > + operator , (ap_private<_AP_W2,_AP_S2>& a2) + { + return + ap_concat_ref<_AP_W, ap_range_ref, _AP_W2, ap_private<_AP_W2,_AP_S2> >(*this, a2); + } + + INLINE ap_concat_ref<_AP_W,ap_range_ref,_AP_W,ap_private<_AP_W,_AP_S> > + operator , (ap_private<_AP_W, _AP_S>& a2) + { + return + ap_concat_ref<_AP_W, ap_range_ref, _AP_W, + ap_private<_AP_W,_AP_S> >(*this, a2); + } + + + + template + INLINE + ap_concat_ref<_AP_W,ap_range_ref,1,ap_bit_ref<_AP_W2,_AP_S2> > + operator, (const ap_bit_ref<_AP_W2,_AP_S2> &a2) + { + return + ap_concat_ref<_AP_W, ap_range_ref, 1, + ap_bit_ref<_AP_W2,_AP_S2> >(*this, const_cast& >(a2)); + } + + + template + INLINE + ap_concat_ref<_AP_W, ap_range_ref, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &a2) + { + return ap_concat_ref<_AP_W, ap_range_ref, _AP_W2+_AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(*this, + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<_AP_W, ap_range_ref, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_range_ref, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<_AP_W, ap_range_ref, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_range_ref, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(a2)); + } + + template + INLINE bool operator == (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs==rhs; + } + + + template + INLINE bool operator != (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs!=rhs; + } + + + template + INLINE bool operator > (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>rhs; + } + + + template + INLINE bool operator >= (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>=rhs; + } + + + template + INLINE bool operator < (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs + INLINE bool operator <= (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs<=rhs; + } + + + template + INLINE void set(const ap_private<_AP_W2,false>& val) + { + ap_private<_AP_W,_AP_S> vval=val; + if(l_index>h_index) + { + for(int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + (vval)[i]? d_bv.set(j):d_bv.clear(j); + } else { + if (_AP_W>64 ) { + ap_private<_AP_W,_AP_S> mask(-1); + if(l_index>0) + { + ap_private<_AP_W,false> mask1(-1); + mask1>>=_AP_W-l_index; + mask1.flip(); + mask=mask1; + //vval&=mask1; + vval<<=l_index; + } + if(h_index<_AP_W-1) + { + ap_private<_AP_W,false> mask2(-1); + mask2<<=h_index+1; + mask2.flip(); + mask&=mask2; + vval&=mask2; + } + mask.flip(); + d_bv&=mask; + d_bv|=vval; + } else { + uint64_t mask = ~0ULL >> (64-_AP_W); + if(l_index>0) + { + uint64_t mask1 = mask; + mask1=mask & (mask1>>(_AP_W-l_index)); + vval =mask&( vval <> (64-_AP_W); + mask2 = mask &(mask2<<(h_index+1)); + mask&=~mask2; + vval&=~mask2; + } + d_bv&=(~mask&(~0ULL >> (64-_AP_W))); + d_bv|=vval; + } + } + } + + + INLINE ap_private<_AP_W,false> get() const + { + ap_private<_AP_W,false> val(0); + if(h_index=0&&j>=h_index;j--,i++) + if((d_bv)[j]) val.set(i); + } else { + val=d_bv; + val>>=l_index; + if(h_index<_AP_W-1) + { + if (_AP_W <= 64) { + const static uint64_t mask = (~0ULL>> (64>_AP_W ? (64-_AP_W):0)); + val &= (mask>> (_AP_W-(h_index-l_index+1))); + } else { + ap_private<_AP_W,false> mask(-1); + mask>>=_AP_W-(h_index-l_index+1); + val&=mask; + } + } + } + return val; + } + + + INLINE ap_private<_AP_W,false> get() + { + ap_private<_AP_W,false> val(0); + if(h_index=0&&j>=h_index;j--,i++) + if((d_bv)[j]) val.set(i); + } else { + val=d_bv; + val>>=l_index; + if(h_index<_AP_W-1) + { + if (_AP_W <= 64 ) { + static const uint64_t mask = ~0ULL>> (64>_AP_W ? (64-_AP_W):0); + return val &= ( (mask) >> (_AP_W - (h_index-l_index+1))); + } else { + ap_private<_AP_W,false> mask(-1); + mask>>=_AP_W-(h_index-l_index+1); + val&=mask; + } + } + } + return val; + } + + + INLINE int length() const + { + return h_index>=l_index?h_index-l_index+1:l_index-h_index+1; + } + + + INLINE int to_int() const + { + ap_private<_AP_W,false> val=get(); + return val.to_int(); + } + + + INLINE unsigned int to_uint() const + { + ap_private<_AP_W,false> val=get(); + return val.to_uint(); + } + + + INLINE long to_long() const + { + ap_private<_AP_W,false> val=get(); + return val.to_long(); + } + + + INLINE unsigned long to_ulong() const + { + ap_private<_AP_W,false> val=get(); + return val.to_ulong(); + } + + + INLINE ap_slong to_int64() const + { + ap_private<_AP_W,false> val=get(); + return val.to_int64(); + } + + + INLINE ap_ulong to_uint64() const + { + ap_private<_AP_W,false> val=get(); + return val.to_uint64(); + } + + INLINE std::string to_string(uint8_t radix=2) const { + return get().to_string(radix); + } + +}; + +///Proxy class, which allows bit selection to be used as rvalue(for reading) and +//lvalue(for writing) + +///Bit reference +//-------------------------------------------------------------- +template +struct ap_bit_ref { +#ifdef _MSC_VER +#pragma warning( disable : 4521 4522 ) +#endif + ap_private<_AP_W,_AP_S>& d_bv; + int d_index; + +public: + INLINE ap_bit_ref(const ap_bit_ref<_AP_W, _AP_S>& ref): + d_bv(ref.d_bv), d_index(ref.d_index) {} + + INLINE ap_bit_ref(ap_private<_AP_W,_AP_S>& bv, int index=0): + d_bv(bv),d_index(index) + { +#ifdef _AP_DEBUG_ + assert(d_index<_AP_W&&"index out of bound"); +#endif + } + + + INLINE operator bool () const + { + return d_bv.get_bit(d_index); + } + + + INLINE bool to_bool() const + { + return operator bool (); + } + + + INLINE ap_bit_ref& operator = (unsigned long long val) + { + if(val) + d_bv.set(d_index); + else + d_bv.clear(d_index); + return *this; + } + + +#if 0 + INLINE ap_bit_ref& operator = (bool val) + { + if(val) + d_bv.set(d_index); + else + d_bv.clear(d_index); + return *this; + } +#endif + template + INLINE ap_bit_ref& operator =(const ap_private<_AP_W2,_AP_S2>& val) + { + return operator =((unsigned long long)(val != 0)); + } + + + template + INLINE ap_bit_ref& operator =(const ap_bit_ref<_AP_W2,_AP_S2>& val) + { + return operator =((unsigned long long)(bool)val); + } + + INLINE ap_bit_ref& operator =(const ap_bit_ref<_AP_W,_AP_S>& val) + { + return operator =((unsigned long long)(bool)val); + } + + template + INLINE ap_bit_ref& operator =(const ap_range_ref<_AP_W2,_AP_S2>& val) + { + return operator =((unsigned long long)(bool) val); + } + + + template + INLINE ap_bit_ref& operator= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=((const ap_private<_AP_W2, false>)(val)); + } + + template + INLINE ap_bit_ref& operator= (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=((unsigned long long)(bool)(val)); + } + + template + INLINE ap_bit_ref& operator= (const ap_concat_ref<_AP_W2, _AP_T3, _AP_W3, _AP_T3>& val) { + return operator=((const ap_private<_AP_W2 + _AP_W3, false>)(val)); + } + + + + template + INLINE ap_concat_ref<1, ap_bit_ref, _AP_W2, ap_private<_AP_W2,_AP_S2> > + operator , (ap_private<_AP_W2, _AP_S2>& a2) + { + return ap_concat_ref<1, ap_bit_ref, _AP_W2, ap_private<_AP_W2,_AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<1, ap_bit_ref, _AP_W2, ap_range_ref<_AP_W2,_AP_S2> > + operator, (const ap_range_ref<_AP_W2, _AP_S2> &a2) + { + return + ap_concat_ref<1, ap_bit_ref, _AP_W2, ap_range_ref<_AP_W2,_AP_S2> >(*this, + const_cast &>(a2)); + } + + + template + INLINE ap_concat_ref<1, ap_bit_ref, 1, ap_bit_ref<_AP_W2,_AP_S2> > + operator, (const ap_bit_ref<_AP_W2, _AP_S2> &a2) + { + return + ap_concat_ref<1, ap_bit_ref, 1, ap_bit_ref<_AP_W2,_AP_S2> >(*this, + const_cast &>(a2)); + } + + + INLINE ap_concat_ref<1, ap_bit_ref, 1, ap_bit_ref > + operator, (const ap_bit_ref &a2) + { + return + ap_concat_ref<1, ap_bit_ref, 1, ap_bit_ref >(*this, + const_cast(a2)); + } + + + template + INLINE ap_concat_ref<1, ap_bit_ref, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2,_AP_T2,_AP_W3,_AP_T3> > + operator, (const ap_concat_ref<_AP_W2,_AP_T2,_AP_W3,_AP_T3> &a2) + { + return + ap_concat_ref<1,ap_bit_ref,_AP_W2+_AP_W3, + ap_concat_ref<_AP_W2,_AP_T2,_AP_W3,_AP_T3> >(*this, + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<1, ap_bit_ref, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<1, ap_bit_ref, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<1, ap_bit_ref, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<1, ap_bit_ref, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(a2)); + } + + template + INLINE bool operator == (const ap_bit_ref<_AP_W2, _AP_S2>& op) { + return get() == op.get(); + } + + template + INLINE bool operator != (const ap_bit_ref<_AP_W2, _AP_S2>& op) { + return get() != op.get(); + } + + + INLINE bool get() const + { + return operator bool (); + } + + + INLINE bool get() + { + return operator bool (); + } + + + template + INLINE void set(const ap_private<_AP_W3, false>& val) + { + operator = (val); + } + + INLINE bool operator ~ () const { + bool bit = (d_bv)[d_index]; + return bit ? false : true; + } + + INLINE int length() const { return 1; } + + INLINE std::string to_string() const { + bool val = get(); + return val ? "1" : "0"; + } +}; + +/// Operators mixing Integers with AP_Int +// ---------------------------------------------------------------- +#if 1 +#define OP_BIN_MIX_INT(BIN_OP, C_TYPE, _AP_WI, _AP_SI, RTYPE) \ + template \ + INLINE typename ap_private<_AP_WI,_AP_SI>::template RType<_AP_W,_AP_S>::RTYPE \ + operator BIN_OP ( C_TYPE i_op, const ap_private<_AP_W,_AP_S> &op) { \ + return ap_private<_AP_WI,_AP_SI>(i_op).operator BIN_OP (op); \ + } \ + template \ + INLINE typename ap_private<_AP_W,_AP_S>::template RType<_AP_WI,_AP_SI>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W,_AP_S> &op, C_TYPE i_op) { \ + return op.operator BIN_OP (ap_private<_AP_WI,_AP_SI>(i_op)); \ + } +#else +#define OP_BIN_MIX_INT(BIN_OP, C_TYPE, _AP_WI, _AP_SI, RTYPE) \ + template \ + INLINE typename ap_private<_AP_WI,_AP_SI>::template RType<_AP_W,_AP_S>::RTYPE \ + operator BIN_OP ( C_TYPE i_op, const ap_private<_AP_W,_AP_S> &op) { \ + return ap_private<_AP_WI,_AP_SI>(i_op).operator BIN_OP (op); \ + } \ + template \ + INLINE typename ap_private<_AP_W,_AP_S>::template RType<_AP_WI,_AP_SI>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W,_AP_S> &op, C_TYPE i_op) { \ + return op.operator BIN_OP (ap_private<_AP_WI,_AP_SI>(i_op)); \ + } +#endif +#define OP_REL_MIX_INT(REL_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE bool operator REL_OP ( const ap_private<_AP_W,_AP_S> &op, C_TYPE op2) { \ + return op.operator REL_OP (ap_private<_AP_W2, _AP_S2>(op2)); \ + } \ + template \ + INLINE bool operator REL_OP ( C_TYPE op2, const ap_private<_AP_W,_AP_S> &op) { \ + return ap_private<_AP_W2,_AP_S2>(op2).operator REL_OP (op); \ + } +#define OP_ASSIGN_MIX_INT(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_private<_AP_W,_AP_S> &operator ASSIGN_OP ( ap_private<_AP_W,_AP_S> &op, C_TYPE op2) { \ + return op.operator ASSIGN_OP (ap_private<_AP_W2,_AP_S2>(op2)); \ + } + +#define OP_BIN_SHIFT_INT(BIN_OP, C_TYPE, _AP_WI, _AP_SI, RTYPE) \ + template \ + C_TYPE operator BIN_OP ( C_TYPE i_op, const ap_private<_AP_W,_AP_S> &op) { \ + return i_op BIN_OP (op.getVal()); \ + } \ + template \ + INLINE typename ap_private<_AP_W,_AP_S>::template RType<_AP_WI,_AP_SI>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W,_AP_S> &op, C_TYPE i_op) { \ + return op.operator BIN_OP (i_op); \ + } +#define OP_ASSIGN_RSHIFT_INT(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_private<_AP_W,_AP_S> &operator ASSIGN_OP ( ap_private<_AP_W,_AP_S> &op, C_TYPE op2) { \ + op = op.operator >> (op2); \ + return op; \ + } +#define OP_ASSIGN_LSHIFT_INT(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_private<_AP_W,_AP_S> &operator ASSIGN_OP ( ap_private<_AP_W,_AP_S> &op, C_TYPE op2) { \ + op = op.operator << (op2); \ + return op; \ + } + +#define OPS_MIX_INT(C_TYPE, WI, SI) \ + OP_BIN_MIX_INT(*, C_TYPE, WI, SI, mult) \ + OP_BIN_MIX_INT(+, C_TYPE, WI, SI, plus) \ + OP_BIN_MIX_INT(-, C_TYPE, WI, SI, minus) \ + OP_BIN_MIX_INT(/, C_TYPE, WI, SI, div) \ + OP_BIN_MIX_INT(%, C_TYPE, WI, SI, mod) \ + OP_BIN_MIX_INT(&, C_TYPE, WI, SI, logic) \ + OP_BIN_MIX_INT(|, C_TYPE, WI, SI, logic) \ + OP_BIN_MIX_INT(^, C_TYPE, WI, SI, logic) \ + OP_BIN_SHIFT_INT(>>, C_TYPE, WI, SI, arg1) \ + OP_BIN_SHIFT_INT(<<, C_TYPE, WI, SI, arg1) \ + \ + OP_REL_MIX_INT(==, C_TYPE, WI, SI) \ + OP_REL_MIX_INT(!=, C_TYPE, WI, SI) \ + OP_REL_MIX_INT(>, C_TYPE, WI, SI) \ + OP_REL_MIX_INT(>=, C_TYPE, WI, SI) \ + OP_REL_MIX_INT(<, C_TYPE, WI, SI) \ + OP_REL_MIX_INT(<=, C_TYPE, WI, SI) \ + \ + OP_ASSIGN_MIX_INT(+=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(-=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(*=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(/=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(%=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(&=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(|=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(^=, C_TYPE, WI, SI) \ + OP_ASSIGN_RSHIFT_INT(>>=, C_TYPE, WI, SI) \ + OP_ASSIGN_LSHIFT_INT(<<=, C_TYPE, WI, SI) + + +OPS_MIX_INT(bool, 1, false) +OPS_MIX_INT(char, 8, true) +OPS_MIX_INT(signed char, 8, true) +OPS_MIX_INT(unsigned char, 8, false) +OPS_MIX_INT(short, 16, true) +OPS_MIX_INT(unsigned short, 16, false) +OPS_MIX_INT(int, 32, true) +OPS_MIX_INT(unsigned int, 32, false) +# if defined __x86_64__ +OPS_MIX_INT(long, 64, true) +OPS_MIX_INT(unsigned long, 64, false) +# else +OPS_MIX_INT(long, 32, true) +OPS_MIX_INT(unsigned long, 32, false) +# endif +OPS_MIX_INT(ap_slong, 64, true) +OPS_MIX_INT(ap_ulong, 64, false) + +#define OP_BIN_MIX_RANGE(BIN_OP, RTYPE) \ + template \ + INLINE typename ap_private<_AP_W1,_AP_S1>::template RType<_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP ( const ap_range_ref<_AP_W1,_AP_S1>& op1, const ap_private<_AP_W2,_AP_S2>& op2) { \ + return ap_private<_AP_W1, false>(op1).operator BIN_OP (op2); \ + } \ + template \ + INLINE typename ap_private<_AP_W1,_AP_S1>::template RType<_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W1,_AP_S1>& op1, const ap_range_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator BIN_OP (ap_private<_AP_W2, false>(op2)); \ + } + +#define OP_REL_MIX_RANGE(REL_OP) \ + template \ + INLINE bool operator REL_OP ( const ap_range_ref<_AP_W1,_AP_S1>& op1, const ap_private<_AP_W2,_AP_S2>& op2) { \ + return ap_private<_AP_W1,false>(op1).operator REL_OP (op2); \ + } \ + template \ + INLINE bool operator REL_OP ( const ap_private<_AP_W1,_AP_S1>& op1, const ap_range_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator REL_OP (op2.operator ap_private<_AP_W2, false>()); \ + } + +#define OP_ASSIGN_MIX_RANGE(ASSIGN_OP) \ + template \ + INLINE ap_private<_AP_W1,_AP_S1>& operator ASSIGN_OP ( ap_private<_AP_W1,_AP_S1>& op1, const ap_range_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator ASSIGN_OP (ap_private<_AP_W2, false>(op2)); \ + } \ + template \ + INLINE ap_range_ref<_AP_W1,_AP_S1>& operator ASSIGN_OP (ap_range_ref<_AP_W1,_AP_S1>& op1, ap_private<_AP_W2,_AP_S2>& op2) { \ + ap_private<_AP_W1, false> tmp(op1); \ + tmp.operator ASSIGN_OP (op2); \ + op1 = tmp; \ + return op1; \ + } + + +OP_ASSIGN_MIX_RANGE(+=) +OP_ASSIGN_MIX_RANGE(-=) +OP_ASSIGN_MIX_RANGE(*=) +OP_ASSIGN_MIX_RANGE(/=) +OP_ASSIGN_MIX_RANGE(%=) +OP_ASSIGN_MIX_RANGE(>>=) +OP_ASSIGN_MIX_RANGE(<<=) +OP_ASSIGN_MIX_RANGE(&=) +OP_ASSIGN_MIX_RANGE(|=) +OP_ASSIGN_MIX_RANGE(^=) + +OP_REL_MIX_RANGE(==) +OP_REL_MIX_RANGE(!=) +OP_REL_MIX_RANGE(>) +OP_REL_MIX_RANGE(>=) +OP_REL_MIX_RANGE(<) +OP_REL_MIX_RANGE(<=) + +OP_BIN_MIX_RANGE(+, plus) +OP_BIN_MIX_RANGE(-, minus) +OP_BIN_MIX_RANGE(*, mult) +OP_BIN_MIX_RANGE(/, div) +OP_BIN_MIX_RANGE(%, mod) +OP_BIN_MIX_RANGE(>>, arg1) +OP_BIN_MIX_RANGE(<<, arg1) +OP_BIN_MIX_RANGE(&, logic) +OP_BIN_MIX_RANGE(|, logic) +OP_BIN_MIX_RANGE(^, logic) + +#define OP_BIN_MIX_BIT(BIN_OP, RTYPE) \ + template \ + INLINE typename ap_private<1, false>::template RType<_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP ( const ap_bit_ref<_AP_W1,_AP_S1>& op1, const ap_private<_AP_W2,_AP_S2>& op2) { \ + return ap_private<1, false>(op1).operator BIN_OP (op2); \ + } \ + template \ + INLINE typename ap_private<_AP_W1,_AP_S1>::template RType<1,false>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W1,_AP_S1>& op1, const ap_bit_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator BIN_OP (ap_private<1, false>(op2)); \ + } + +#define OP_REL_MIX_BIT(REL_OP) \ + template \ + INLINE bool operator REL_OP ( const ap_bit_ref<_AP_W1,_AP_S1>& op1, const ap_private<_AP_W2,_AP_S2>& op2) { \ + return ap_private<_AP_W1,false>(op1).operator REL_OP (op2); \ + } \ + template \ + INLINE bool operator REL_OP ( const ap_private<_AP_W1,_AP_S1>& op1, const ap_bit_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator REL_OP (ap_private<1, false>(op2)); \ + } + +#define OP_ASSIGN_MIX_BIT(ASSIGN_OP) \ + template \ + INLINE ap_private<_AP_W1,_AP_S1>& operator ASSIGN_OP ( ap_private<_AP_W1,_AP_S1>& op1, ap_bit_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator ASSIGN_OP (ap_private<1, false>(op2)); \ + } \ + template \ + INLINE ap_bit_ref<_AP_W1,_AP_S1>& operator ASSIGN_OP ( ap_bit_ref<_AP_W1,_AP_S1>& op1, ap_private<_AP_W2,_AP_S2>& op2) { \ + ap_private<1, false> tmp(op1); \ + tmp.operator ASSIGN_OP (op2); \ + op1 = tmp; \ + return op1; \ + } + + +OP_ASSIGN_MIX_BIT(+=) +OP_ASSIGN_MIX_BIT(-=) +OP_ASSIGN_MIX_BIT(*=) +OP_ASSIGN_MIX_BIT(/=) +OP_ASSIGN_MIX_BIT(%=) +OP_ASSIGN_MIX_BIT(>>=) +OP_ASSIGN_MIX_BIT(<<=) +OP_ASSIGN_MIX_BIT(&=) +OP_ASSIGN_MIX_BIT(|=) +OP_ASSIGN_MIX_BIT(^=) + +OP_REL_MIX_BIT(==) +OP_REL_MIX_BIT(!=) +OP_REL_MIX_BIT(>) +OP_REL_MIX_BIT(>=) +OP_REL_MIX_BIT(<) +OP_REL_MIX_BIT(<=) + +OP_BIN_MIX_BIT(+, plus) +OP_BIN_MIX_BIT(-, minus) +OP_BIN_MIX_BIT(*, mult) +OP_BIN_MIX_BIT(/, div) +OP_BIN_MIX_BIT(%, mod) +OP_BIN_MIX_BIT(>>, arg1) +OP_BIN_MIX_BIT(<<, arg1) +OP_BIN_MIX_BIT(&, logic) +OP_BIN_MIX_BIT(|, logic) +OP_BIN_MIX_BIT(^, logic) + +#define REF_REL_OP_MIX_INT(REL_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE bool operator REL_OP ( const ap_range_ref<_AP_W,_AP_S> &op, C_TYPE op2) { \ + return (ap_private<_AP_W, false>(op)).operator REL_OP (ap_private<_AP_W2,_AP_S2>(op2)); \ + } \ + template \ + INLINE bool operator REL_OP ( C_TYPE op2, const ap_range_ref<_AP_W,_AP_S> &op) { \ + return ap_private<_AP_W2,_AP_S2>(op2).operator REL_OP (ap_private<_AP_W, false>(op)); \ + } \ + template \ + INLINE bool operator REL_OP ( const ap_bit_ref<_AP_W,_AP_S> &op, C_TYPE op2) { \ + return (bool(op)) REL_OP op2; \ + } \ + template \ + INLINE bool operator REL_OP ( C_TYPE op2, const ap_bit_ref<_AP_W,_AP_S> &op) { \ + return op2 REL_OP (bool(op)); \ + } \ + template \ + INLINE bool operator REL_OP ( const ap_concat_ref<_AP_W,_AP_T, _AP_W1, _AP_T1> &op, C_TYPE op2) { \ + return (ap_private<_AP_W + _AP_W1, false>(op)).operator REL_OP (ap_private<_AP_W2,_AP_S2>(op2)); \ + } \ + template \ + INLINE bool operator REL_OP ( C_TYPE op2, const ap_concat_ref<_AP_W,_AP_T, _AP_W1, _AP_T1> &op) { \ + return ap_private<_AP_W2,_AP_S2>(op2).operator REL_OP (ap_private<_AP_W + _AP_W1, false>(op)); \ + } + +#define REF_REL_MIX_INT(C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(>, C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(<, C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(>=, C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(<=, C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(==, C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(!=, C_TYPE, _AP_WI, _AP_SI) + +REF_REL_MIX_INT(bool, 1, false) +REF_REL_MIX_INT(char, 8, true) +REF_REL_MIX_INT(signed char, 8, true) +REF_REL_MIX_INT(unsigned char, 8, false) +REF_REL_MIX_INT(short, 16, true) +REF_REL_MIX_INT(unsigned short, 16, false) +REF_REL_MIX_INT(int, 32, true) +REF_REL_MIX_INT(unsigned int, 32, false) +# if defined __x86_64__ +REF_REL_MIX_INT(long, 64, true) +REF_REL_MIX_INT(unsigned long, 64, false) +# else +REF_REL_MIX_INT(long, 32, true) +REF_REL_MIX_INT(unsigned long, 32, false) +# endif +REF_REL_MIX_INT(ap_slong, 64, true) +REF_REL_MIX_INT(ap_ulong, 64, false) + +#define REF_BIN_OP_MIX_INT(BIN_OP, RTYPE, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE typename ap_private<_AP_W, false>::template RType<_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP ( const ap_range_ref<_AP_W,_AP_S> &op, C_TYPE op2) { \ + return (ap_private<_AP_W, false>(op)).operator BIN_OP (ap_private<_AP_W2,_AP_S2>(op2)); \ + } \ + template \ + INLINE typename ap_private<_AP_W2, _AP_S2>::template RType<_AP_W,false>::RTYPE \ + operator BIN_OP ( C_TYPE op2, const ap_range_ref<_AP_W,_AP_S> &op) { \ + return ap_private<_AP_W2,_AP_S2>(op2).operator BIN_OP (ap_private<_AP_W, false>(op)); \ + } + +#define REF_BIN_MIX_INT(C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(+, plus, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(-, minus, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(*, mult, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(/, div, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(%, mod, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(>>, arg1, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(<<, arg1, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(&, logic, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(|, logic, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(^, logic, C_TYPE, _AP_WI, _AP_SI) + +REF_BIN_MIX_INT(bool, 1, false) +REF_BIN_MIX_INT(char, 8, true) +REF_BIN_MIX_INT(signed char, 8, true) +REF_BIN_MIX_INT(unsigned char, 8, false) +REF_BIN_MIX_INT(short, 16, true) +REF_BIN_MIX_INT(unsigned short, 16, false) +REF_BIN_MIX_INT(int, 32, true) +REF_BIN_MIX_INT(unsigned int, 32, false) +# if defined __x86_64__ +REF_BIN_MIX_INT(long, 64, true) +REF_BIN_MIX_INT(unsigned long, 64, false) +#else +REF_BIN_MIX_INT(long, 32, true) +REF_BIN_MIX_INT(unsigned long, 32, false) +#endif +REF_BIN_MIX_INT(ap_slong, 64, true) +REF_BIN_MIX_INT(ap_ulong, 64, false) + +#define REF_BIN_OP(BIN_OP, RTYPE) \ +template \ +INLINE typename ap_private<_AP_W, false>::template RType<_AP_W2, false>::RTYPE \ +operator BIN_OP (const ap_range_ref<_AP_W,_AP_S> &lhs, const ap_range_ref<_AP_W2,_AP_S2> &rhs) { \ + return ap_private<_AP_W,false>(lhs).operator BIN_OP (ap_private<_AP_W2, false>(rhs)); \ +} + +REF_BIN_OP(+, plus) +REF_BIN_OP(-, minus) +REF_BIN_OP(*, mult) +REF_BIN_OP(/, div) +REF_BIN_OP(%, mod) +REF_BIN_OP(>>, arg1) +REF_BIN_OP(<<, arg1) +REF_BIN_OP(&, logic) +REF_BIN_OP(|, logic) +REF_BIN_OP(^, logic) + +#if 1 +#define CONCAT_OP_MIX_INT(C_TYPE, _AP_WI, _AP_SI) \ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (const ap_private<_AP_W, _AP_S> &op1, C_TYPE op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op2); \ + ap_private<_AP_WI + _AP_W, false> ret(op1); \ + ret <<= _AP_WI; \ + if (_AP_SI) { \ + val <<= _AP_W; val >>= _AP_W; \ + }\ + ret |= val; \ + return ret;\ +} \ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (C_TYPE op1, const ap_private<_AP_W, _AP_S>& op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op1); \ + ap_private<_AP_WI + _AP_W, false> ret(op2); \ + if (_AP_S) { \ + ret <<= _AP_WI; ret >>= _AP_WI; \ + } \ + ret |= val << _AP_W; \ + return ret; \ +} \ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (const ap_range_ref<_AP_W, _AP_S> &op1, C_TYPE op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op2); \ + ap_private<_AP_WI + _AP_W, false> ret(op1); \ + ret <<= _AP_WI; \ + if (_AP_SI) { \ + val <<= _AP_W; val >>= _AP_W; \ + } \ + ret |= val; \ + return ret; \ +} \ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (C_TYPE op1, const ap_range_ref<_AP_W, _AP_S> &op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op1); \ + ap_private<_AP_WI + _AP_W, false> ret(op2); \ + int len = op2.length(); \ + val <<= len; \ + ret |= val; \ + return ret; \ +} \ +template \ +INLINE \ +ap_private<_AP_WI + 1, false > \ + operator, (const ap_bit_ref<_AP_W, _AP_S> &op1, C_TYPE op2) { \ + ap_private<_AP_WI + 1, false> val(op2); \ + val[_AP_WI] = op1; \ + return val; \ +} \ +template \ +INLINE \ +ap_private<_AP_WI + 1, false > \ + operator, (C_TYPE op1, const ap_bit_ref<_AP_W, _AP_S> &op2) { \ + ap_private<_AP_WI + 1, false> val(op1); \ + val <<= 1; \ + val[0] = op2; \ + return val; \ +} \ +template \ +INLINE \ +ap_private<_AP_W + _AP_W2 + _AP_WI, false > \ + operator, (const ap_concat_ref<_AP_W, _AP_T, _AP_W2, _AP_T2> &op1, C_TYPE op2) {\ + ap_private<_AP_WI + _AP_W + _AP_W2, _AP_SI> val(op2);\ + ap_private<_AP_WI + _AP_W + _AP_W2, _AP_SI> ret(op1);\ + if (_AP_SI) { \ + val <<= _AP_W + _AP_W2; val >>= _AP_W + _AP_W2; \ + } \ + ret <<= _AP_WI; \ + ret |= val; \ + return ret; \ +}\ +template \ +INLINE \ +ap_private<_AP_W + _AP_W2 + _AP_WI, false > \ + operator, (C_TYPE op1, const ap_concat_ref<_AP_W, _AP_T, _AP_W2, _AP_T2> &op2) {\ + ap_private<_AP_WI + _AP_W + _AP_W2, _AP_SI> val(op1);\ + ap_private<_AP_WI + _AP_W + _AP_W2, _AP_SI> ret(op2);\ + int len = op2.length(); \ + val <<= len; \ + ret |= val;\ + return ret; \ +}\ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (const af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op1, C_TYPE op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op2); \ + ap_private<_AP_WI + _AP_W, false> ret(op1); \ + if (_AP_SI) { \ + val <<= _AP_W; val >>= _AP_W; \ + }\ + ret <<= _AP_WI; \ + ret |= val; \ + return ret; \ +} \ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (C_TYPE op1, const af_range_ref<_AP_W, _AP_I, _AP_S, \ + _AP_Q, _AP_O, _AP_N> &op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op1); \ + ap_private<_AP_WI + _AP_W, false> ret(op2); \ + int len = op2.length(); \ + val <<= len; \ + ret |= val; \ + return ret; \ +} \ +template \ +INLINE \ +ap_private< 1 + _AP_WI, false> \ + operator, (const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, \ + _AP_N> &op1, C_TYPE op2) { \ + ap_private<_AP_WI + 1, _AP_SI> val(op2); \ + val[_AP_WI] = op1; \ + return val; \ +} \ +template \ +INLINE \ +ap_private< 1 + _AP_WI, false> \ + operator, (C_TYPE op1, const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q,\ + _AP_O, _AP_N> &op2) { \ + ap_private<_AP_WI + 1, _AP_SI> val(op1); \ + val <<= 1; \ + val[0] = op2; \ + return val; \ +} + +CONCAT_OP_MIX_INT(bool, 1, false) +CONCAT_OP_MIX_INT(char, 8, true) +CONCAT_OP_MIX_INT(signed char, 8, true) +CONCAT_OP_MIX_INT(unsigned char, 8, false) +CONCAT_OP_MIX_INT(short, 16, true) +CONCAT_OP_MIX_INT(unsigned short, 16, false) +CONCAT_OP_MIX_INT(int, 32, true) +CONCAT_OP_MIX_INT(unsigned int, 32, false) +# if defined __x86_64__ +CONCAT_OP_MIX_INT(long, 64, true) +CONCAT_OP_MIX_INT(unsigned long, 64, false) +# else +CONCAT_OP_MIX_INT(long, 32, true) +CONCAT_OP_MIX_INT(unsigned long, 32, false) +# endif +CONCAT_OP_MIX_INT(ap_slong, 64, true) +CONCAT_OP_MIX_INT(ap_ulong, 64, false) +#endif + +#if 1 +#define CONCAT_SHIFT_MIX_INT(C_TYPE, op) \ +template \ +INLINE ap_uint<_AP_W+_AP_W1> operator op (const ap_concat_ref<_AP_W, _AP_T, _AP_W1, _AP_T1> lhs, C_TYPE rhs) { \ + return ((ap_uint<_AP_W+_AP_W1>)lhs.get()) op ((int)rhs); \ +} + +CONCAT_SHIFT_MIX_INT(long, <<) +CONCAT_SHIFT_MIX_INT(unsigned long, <<) +CONCAT_SHIFT_MIX_INT(unsigned int, <<) +CONCAT_SHIFT_MIX_INT(ap_ulong, <<) +CONCAT_SHIFT_MIX_INT(ap_slong, <<) +CONCAT_SHIFT_MIX_INT(long, >>) +CONCAT_SHIFT_MIX_INT(unsigned long, >>) +CONCAT_SHIFT_MIX_INT(unsigned int, >>) +CONCAT_SHIFT_MIX_INT(ap_ulong, >>) +CONCAT_SHIFT_MIX_INT(ap_slong, >>) +#endif + +#if defined(SYSTEMC_H) || defined(SYSTEMC_INCLUDED) +template +INLINE void sc_trace(sc_core::sc_trace_file *tf, const ap_private<_AP_W, _AP_S> &op, + const std::string &name) { + if (tf) + tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name); +} +#endif + +template +INLINE std::ostream& operator<<(std::ostream& out, const ap_private<_AP_W,_AP_S> &op) +{ + ap_private<_AP_W, _AP_S> v=op; + const std::ios_base::fmtflags basefield = out.flags() & std::ios_base::basefield; + unsigned radix = (basefield == std::ios_base::hex) ? 16 : + ((basefield == std::ios_base::oct) ? 8 : 10); + std::string str=v.toString(radix,_AP_S); + out< +INLINE std::istream& operator >> (std::istream& in, ap_private<_AP_W,_AP_S> &op) +{ + std::string str; + in >> str; + op = ap_private<_AP_W, _AP_S>(str.c_str()); + return in; + +} + +template +INLINE std::ostream& operator<<(std::ostream& out, const ap_range_ref<_AP_W,_AP_S> &op) +{ + return operator<<(out, ap_private<_AP_W, _AP_S>(op)); +} + +template +INLINE std::istream& operator >> (std::istream& in, ap_range_ref<_AP_W,_AP_S> &op) +{ + return operator>>(in, ap_private<_AP_W, _AP_S>(op));; +} + +template +INLINE void print(const ap_private<_AP_W,_AP_S> &op, bool fill=true ) +{ + ap_private<_AP_W, _AP_S> v=op; + uint32_t ws=v.getNumWords(); + const uint64_t *ptr=v.getRawData(); + int i=ws-1; +#if 0 + if(fill) + printf("%016llx",*(ptr+i)); + else + printf("%llx",*(ptr+i)); +#else +//match SystemC output + if(_AP_W%64 != 0) { + uint32_t offset=_AP_W%64; + uint32_t count=(offset+3)/4; + int64_t data=*(ptr+i); + if(_AP_S) + data=(data<<(64-offset))>>(64-offset); + else + count=(offset+4)/4; + while(count-->0) + printf("%llx",(data>>(count*4))&0xf); + } else { + if(_AP_S==false) + printf("0"); + printf("%016llx",*(ptr+i)); + } +#endif + for(--i;i>=0;i--) + printf("%016llx",*(ptr+i)); + printf("\n"); + +} +#endif /* #ifndef __AESL_GCC_AP_INT_H__ */ \ No newline at end of file diff --git a/hls_2018/router_02_boardstr/etc/ap_private.h b/hls_2018/router_02_boardstr/etc/ap_private.h new file mode 100755 index 0000000..1a68a9e --- /dev/null +++ b/hls_2018/router_02_boardstr/etc/ap_private.h @@ -0,0 +1,5858 @@ +/* + * Copyright 2012 Xilinx, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LLVM_SUPPORT_MATHEXTRAS_H +#define LLVM_SUPPORT_MATHEXTRAS_H + +#ifdef _MSC_VER +#if _MSC_VER <= 1500 +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else if +#include +#endif /* #if _MSC_VER <= 1500 */ +#else +#include +#endif /* #if _MSC_VER <= 1500 */ +#undef INLINE +#if 1 +#define INLINE inline +#else +//Enable to debug ap_int/ap_fixed +#define INLINE __attribute__((weak)) +#endif +#define AP_MAX(a,b) ((a) > (b) ? (a) : (b)) +#define AP_MIN(a,b) ((a) < (b) ? (a) : (b)) +#define AP_ABS(a) ((a)>=0 ? (a):-(a)) +#ifndef AP_INT_MAX_W +#define AP_INT_MAX_W 1024 +#endif +#define BIT_WIDTH_UPPER_LIMIT (1 << 15) +#if AP_INT_MAX_W > BIT_WIDTH_UPPER_LIMIT +#error "Bitwidth exceeds 32768 (1 << 15), the maximum allowed value" +#endif +#define MAX_MODE(BITS) ((BITS + 1023) / 1024) + +// NOTE: The following support functions use the _32/_64 extensions instead of +// type overloading so that signed and unsigned integers can be used without +// ambiguity. + +/// Hi_32 - This function returns the high 32 bits of a 64 bit value. +INLINE uint32_t Hi_32(uint64_t Value) { + return static_cast(Value >> 32); +} + +/// Lo_32 - This function returns the low 32 bits of a 64 bit value. +INLINE uint32_t Lo_32(uint64_t Value) { + return static_cast(Value); +} + +/// ByteSwap_16 - This function returns a byte-swapped representation of the +/// 16-bit argument, Value. +INLINE uint16_t ByteSwap_16(uint16_t Value) { +#if defined(_MSC_VER) && !defined(_DEBUG) + // The DLL version of the runtime lacks these functions (bug!?), but in a + // release build they're replaced with BSWAP instructions anyway. + return (uint16_t)(_byteswap_ushort(Value)); +#else + uint16_t Hi = (uint16_t)((Value) << 8); + uint16_t Lo = (uint16_t)((Value) >> 8); + return Hi | Lo; +#endif +} + +/// ByteSwap_32 - This function returns a byte-swapped representation of the +/// 32-bit argument, Value. +INLINE uint32_t ByteSwap_32(uint32_t Value) { + uint32_t Byte0 = Value & 0x000000FF; + uint32_t Byte1 = Value & 0x0000FF00; + uint32_t Byte2 = Value & 0x00FF0000; + uint32_t Byte3 = Value & 0xFF000000; + return ((Byte0) << 24) | ((Byte1) << 8) | ((Byte2) >> 8) | ((Byte3) >> 24); +} + +/// ByteSwap_64 - This function returns a byte-swapped representation of the +/// 64-bit argument, Value. +INLINE uint64_t ByteSwap_64(uint64_t Value) { + uint64_t Hi = ByteSwap_32(uint32_t(Value)); + uint32_t Lo = ByteSwap_32(uint32_t(Value >> 32)); + return ((Hi) << 32) | Lo; +} + +/// CountLeadingZeros_32 - this function performs the platform optimal form of +/// counting the number of zeros from the most significant bit to the first one +/// bit. Ex. CountLeadingZeros_32(0x00F000FF) == 8. +/// Returns 32 if the word is zero. +INLINE unsigned CountLeadingZeros_32(uint32_t Value) { + unsigned Count; // result +#if __GNUC__ >= 4 + // PowerPC is defined for __builtin_clz(0) +#if !defined(__ppc__) && !defined(__ppc64__) + if (Value == 0) return 32; +#endif + Count = __builtin_clz(Value); +#else + if (Value == 0) return 32; + Count = 0; + // bisecton method for count leading zeros + for (unsigned Shift = 32 >> 1; Shift; Shift >>= 1) { + uint32_t Tmp = (Value) >> (Shift); + if (Tmp) { + Value = Tmp; + } else { + Count |= Shift; + } + } +#endif + return Count; +} + +/// CountLeadingZeros_64 - This function performs the platform optimal form +/// of counting the number of zeros from the most significant bit to the first +/// one bit (64 bit edition.) +/// Returns 64 if the word is zero. +INLINE unsigned CountLeadingZeros_64(uint64_t Value) { + unsigned Count; // result +#if __GNUC__ >= 4 + // PowerPC is defined for __builtin_clzll(0) +#if !defined(__ppc__) && !defined(__ppc64__) + if (!Value) return 64; +#endif + Count = __builtin_clzll(Value); +#else + if (sizeof(long) == sizeof(int64_t)) { + if (!Value) return 64; + Count = 0; + // bisecton method for count leading zeros + for (unsigned Shift = 64 >> 1; Shift; Shift >>= 1) { + uint64_t Tmp = (Value) >> (Shift); + if (Tmp) { + Value = Tmp; + } else { + Count |= Shift; + } + } + } else { + // get hi portion + uint32_t Hi = Hi_32(Value); + + // if some bits in hi portion + if (Hi) { + // leading zeros in hi portion plus all bits in lo portion + Count = CountLeadingZeros_32(Hi); + } else { + // get lo portion + uint32_t Lo = Lo_32(Value); + // same as 32 bit value + Count = CountLeadingZeros_32(Lo)+32; + } + } +#endif + return Count; +} + +/// CountTrailingZeros_64 - This function performs the platform optimal form +/// of counting the number of zeros from the least significant bit to the first +/// one bit (64 bit edition.) +/// Returns 64 if the word is zero. +INLINE unsigned CountTrailingZeros_64(uint64_t Value) { +#if __GNUC__ >= 4 + return (Value != 0) ? __builtin_ctzll(Value) : 64; +#else + static const unsigned Mod67Position[] = { + 64, 0, 1, 39, 2, 15, 40, 23, 3, 12, 16, 59, 41, 19, 24, 54, + 4, 64, 13, 10, 17, 62, 60, 28, 42, 30, 20, 51, 25, 44, 55, + 47, 5, 32, 65, 38, 14, 22, 11, 58, 18, 53, 63, 9, 61, 27, + 29, 50, 43, 46, 31, 37, 21, 57, 52, 8, 26, 49, 45, 36, 56, + 7, 48, 35, 6, 34, 33, 0 + }; + return Mod67Position[(uint64_t)(-(int64_t)Value & (int64_t)Value) % 67]; +#endif +} + +/// CountPopulation_64 - this function counts the number of set bits in a value, +/// (64 bit edition.) +INLINE unsigned CountPopulation_64(uint64_t Value) { +#if __GNUC__ >= 4 + return __builtin_popcountll(Value); +#else + uint64_t v = Value - (((Value) >> 1) & 0x5555555555555555ULL); + v = (v & 0x3333333333333333ULL) + (((v) >> 2) & 0x3333333333333333ULL); + v = (v + ((v) >> 4)) & 0x0F0F0F0F0F0F0F0FULL; + return unsigned((uint64_t)(v * 0x0101010101010101ULL) >> 56); +#endif +} + +#endif // LLVM_SUPPORT_MATHEXTRAS_H + + +#ifndef AP_PRIVATE_H +#define AP_PRIVATE_H + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AESL_std { + template + DataType INLINE min(DataType a, DataType b) { + // if (a >= b) return b; + // else return a; + return (a>=b) ? b : a; + } + + template + DataType INLINE max(DataType a, DataType b) { + // if (a >= b) return a; + // else return b; + return (a>=b) ? a : b; + } +} +enum ap_q_mode { + AP_RND, // rounding to plus infinity + AP_RND_ZERO,// rounding to zero + AP_RND_MIN_INF,// rounding to minus infinity + AP_RND_INF,// rounding to infinity + AP_RND_CONV, // convergent rounding + AP_TRN, // truncation + AP_TRN_ZERO // truncation to zero + +}; +enum ap_o_mode { + AP_SAT, // saturation + AP_SAT_ZERO, // saturation to zero + AP_SAT_SYM, // symmetrical saturation + AP_WRAP, // wrap-around (*) + AP_WRAP_SM // sign magnitude wrap-around (*) +}; + +template struct ap_fixed_base; +template struct af_range_ref; +template struct af_bit_ref; + +template struct ap_range_ref; +template struct ap_bit_ref; +template struct ap_concat_ref; +static bool InvalidDigit(const char* str, unsigned len, unsigned start, unsigned radix) { + unsigned i; + for (i = start; i < len; ++i) + if ((radix == 2 && (str[i] == '0' || str[i] == '1')) || + (radix == 8 && str[i] >= '0' && str[i] <= '7') || + (radix == 10 && str[i] >= '0' && str[i] <= '9') || + (radix == 16 && ((str[i] >= '0' && str[i] <= '9') || + (str[i] >= 'a' && str[i] <= 'f') || + (str[i] >= 'A' && str[i] <= 'F')))) + continue; + else + return true; + return false; +} + +static void ap_parse_sign(const char* str, uint32_t &base, bool &neg) { + if (str[0] == '+' || str[0] == '-') base = 1; + if (str[0] == '-') neg = true; + else neg = false; + return; +} + +static void ap_parse_prefix(const char* str, uint32_t &offset, uint32_t &radix) { + if (str[0] == '0') { + switch (str[1]) { + case 'b': + case 'B': offset = 2; radix = 2; break; + case 'x': + case 'X': offset = 2; radix = 16; break; + case 'd': + case 'D': offset = 2; radix = 10; break; + case 'o': + case 'O': offset = 2; radix = 8; break; + default: break; + } + } + if (offset == 0) + for (int i=0, len = strlen(str); i= 'a') || (str[i] <= 'F' && str[i] >= 'A')) { + radix = 16; + break; + } + return; +} + +/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from +/// the multi-digit integer array, x[], propagating the borrowed 1 value until +/// no further borrowing is neeeded or it runs out of "digits" in x. The result +/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted. +/// In other words, if y > x then this function returns 1, otherwise 0. +/// @returns the borrow out of the subtraction +static bool sub_1(uint64_t x[], uint32_t len, uint64_t y) { + for (uint32_t i = 0; i < len; ++i) { + uint64_t __X = x[i]; + x[i] -= y; + if (y > __X) + y = 1; // We have to "borrow 1" from next "digit" + else { + y = 0; // No need to borrow + break; // Remaining digits are unchanged so exit early + } + } + return (y != 0); +} + + /// This enumeration just provides for internal constants used in this + /// translation unit. + enum { + MIN_INT_BITS = 1, ///< Minimum number of bits that can be specified + ///< Note that this must remain synchronized with IntegerType::MIN_INT_BITS + MAX_INT_BITS = (1<<23)-1 ///< Maximum number of bits that can be specified + ///< Note that this must remain synchronized with IntegerType::MAX_INT_BITS + }; + + /// A utility function for allocating memory and checking for allocation + /// failure. The content is not zeroed. + static uint64_t* getMemory(uint32_t numWords) { + return (uint64_t*) malloc(numWords*sizeof(uint64_t)); + } + + //===----------------------------------------------------------------------===// + // ap_private Class + //===----------------------------------------------------------------------===// + + /// ap_private - This class represents arbitrary precision constant integral values. + /// It is a functional replacement for common case unsigned integer type like + /// "unsigned", "unsigned long" or "uint64_t", but also allows non-byte-width + /// integer sizes and large integer value types such as 3-bits, 15-bits, or more + /// than 64-bits of precision. ap_private provides a variety of arithmetic operators + /// and methods to manipulate integer values of any bit-width. It supports both + /// the typical integer arithmetic and comparison operations as well as bitwise + /// manipulation. + /// + /// The class has several invariants worth noting: + /// * All bit, byte, and word positions are zero-based. + /// * Once the bit width is set, it doesn't change except by the Truncate, + /// SignExtend, or ZeroExtend operations. + /// * All binary operators must be on ap_private instances of the same bit width. + /// Attempting to use these operators on instances with different bit + /// widths will yield an assertion. + /// * The value is stored canonically as an unsigned value. For operations + /// where it makes a difference, there are both signed and unsigned variants + /// of the operation. For example, sdiv and udiv. However, because the bit + /// widths must be the same, operations such as Mul and Add produce the same + /// results regardless of whether the values are interpreted as signed or + /// not. + /// * In general, the class tries to follow the style of computation that LLVM + /// uses in its IR. This simplifies its use for LLVM. + /// + /// @brief Class for arbitrary precision integers. + template class ap_private; + namespace ap_private_ops{ + template + INLINE ap_private<_AP_W, _AP_S, _AP_N> lshr(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t shiftAmt); + template + INLINE ap_private<_AP_W, _AP_S, _AP_N> shl(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t shiftAmt); + } + +#if defined(_MSC_VER) +# if _MSC_VER < 1400 && !defined(for) +# define for if(0);else for +# endif + typedef unsigned __int64 ap_ulong; + typedef signed __int64 ap_slong; +#else + typedef unsigned long long ap_ulong; + typedef signed long long ap_slong; +#endif + template struct retval { + }; + template<> struct retval { + typedef ap_slong Type; + }; + template<> struct retval { + typedef ap_ulong Type; + }; + + template + class ap_private { +#ifdef _MSC_VER +#pragma warning( disable : 4521 4522 ) +#endif +public: + typedef typename retval<_AP_S>::Type ValType; + template friend struct ap_fixed_base; + ///return type of variety of operations + //---------------------------------------------------------- + template + struct RType { + enum { + mult_w = _AP_W+_AP_W2, + mult_s = _AP_S||_AP_S2, + plus_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2))+1, + plus_s = _AP_S||_AP_S2, + minus_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2))+1, + minus_s = true, + div_w = _AP_W+_AP_S2, + div_s = _AP_S||_AP_S2, + mod_w = AP_MIN(_AP_W,_AP_W2+(!_AP_S2&&_AP_S)), + mod_s = _AP_S, + logic_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2)), + logic_s = _AP_S||_AP_S2 + }; + typedef ap_private mult; + typedef ap_private plus; + typedef ap_private minus; + typedef ap_private logic; + typedef ap_private div; + typedef ap_private mod; + typedef ap_private<_AP_W, _AP_S> arg1; + typedef bool reduce; + }; + + INLINE void report() { +#if 0 + if (_AP_W > 1024 && _AP_W <= 4096) { + fprintf(stderr, "[W] W=%d is out of bound (1<=W<=1024): for" + " synthesis: please define macro AP_INT_TYPE_EXT(N)" + " to extend the valid range.\n", _AP_W); + } else +#endif + if (_AP_W > MAX_MODE(AP_INT_MAX_W) * 1024) { + fprintf(stderr, "[E] ap_%sint<%d>: Bitwidth exceeds the " + "default max value %d. Please use macro " + "AP_INT_MAX_W to set a larger max value.\n", + _AP_S?"":"u", _AP_W, + MAX_MODE(AP_INT_MAX_W) * 1024); + exit(1); + } + } + + enum { BitWidth = _AP_W }; + /// This union is used to store the integer value. When the + /// integer bit-width <= 64, it uses VAL, otherwise it uses pVal. + + /// This enum is used to hold the constants we needed for ap_private. + uint64_t VAL; ///< Used to store the <= 64 bits integer value. + uint64_t pVal[_AP_N]; ///< Used to store the >64 bits integer value. + + /// This enum is used to hold the constants we needed for ap_private. + enum { + APINT_BITS_PER_WORD = sizeof(uint64_t) * 8, ///< Bits in a word + APINT_WORD_SIZE = sizeof(uint64_t) ///< Byte size of a word + }; + + enum { excess_bits = (_AP_W%APINT_BITS_PER_WORD) ? APINT_BITS_PER_WORD -(_AP_W%APINT_BITS_PER_WORD) : 0}; + static const uint64_t mask = ((uint64_t)~0ULL >> (excess_bits)); + + /// This constructor is used only internally for speed of construction of + /// temporaries. It is unsafe for general use so it is not public. + /* Constructors */ + + ap_private(const char* val) { + std::string str(val); + uint32_t strLen = str.length(); + const char *strp = str.c_str(); + uint32_t offset = 0; + uint32_t base = 0; + bool neg = false; + uint32_t radix = 16; + ap_parse_sign(strp, base, neg); + ap_parse_prefix(strp + base, offset, radix); + + if ((radix != 10 && neg) || + (strLen - base - offset <= 0) || + InvalidDigit(strp, strLen, base + offset, radix)) { + fprintf(stderr, "invalid character string %s !\n", val); + assert(0); + } + + ap_private ap_private_val(str.c_str(), strLen, radix, base, offset); + if (neg) + ap_private_val = -ap_private_val; + operator = (ap_private_val); + report(); + } + + ap_private(const char* val, int rd) { + std::string str(val); + uint32_t strLen = str.length(); + const char *strp = str.c_str(); + uint32_t offset = 0; + uint32_t base = 0; + uint32_t radix = rd; + bool neg = false; + ap_parse_sign(strp, base, neg); + ap_parse_prefix(strp + base, offset, radix); + + if ((radix != 10 && neg) || + (strLen - base - offset <= 0) || + InvalidDigit(strp, strLen, base + offset, radix)) { + fprintf(stderr, "invalid character string %s !\n", val); + assert(0); + } + + // uint32_t bitsNeeded = ap_private<_AP_W, _AP_S>::getBitsNeeded(strp, strLen, radix); + // ap_private<_AP_W, _AP_S> ap_private_val(bitsNeeded, strp , strLen, radix, base, offset); + ap_private ap_private_val(strp , strLen, radix, base, offset); + if (neg) + ap_private_val = -ap_private_val; + operator = (ap_private_val); + report(); + } + + /// Note that numWords can be smaller or larger than the corresponding bit + /// width but any extraneous bits will be dropped. + /// @param numBits the bit width of the constructed ap_private + /// @param numWords the number of words in bigVal + /// @param bigVal a sequence of words to form the initial value of the ap_private + /// @brief Construct an ap_private of numBits width, initialized as bigVal[]. + ap_private(uint32_t numWords, const uint64_t bigVal[]): VAL(0) { + assert(bigVal && "Null pointer detected!"); + { + // Get memory, cleared to 0 + memset(pVal, 0, _AP_N * sizeof(uint64_t)); + + // Calculate the number of words to copy + uint32_t words = AESL_std::min(numWords, _AP_N); + // Copy the words from bigVal to pVal + memcpy(pVal, bigVal, words * APINT_WORD_SIZE); + if (words >= _AP_W) + clearUnusedBits(); + // Make sure unused high bits are cleared + } + } + + /// This constructor interprets Val as a string in the given radix. The + /// interpretation stops when the first charater that is not suitable for the + /// radix is encountered. Acceptable radix values are 2, 8, 10 and 16. It is + /// an error for the value implied by the string to require more bits than + /// numBits. + /// @param numBits the bit width of the constructed ap_private + /// @param val the string to be interpreted + /// @param radix the radix of Val to use for the intepretation + /// @brief Construct an ap_private from a string representation. + ap_private(const std::string& val, uint8_t radix=2, int base=0, int offset=0): VAL(0) { + assert(!val.empty() && "The input string is empty."); + const char *c_str = val.c_str(); + fromString(c_str+base+offset, val.size()-base-offset, radix); + } + + /// This constructor interprets the slen characters starting at StrStart as + /// a string in the given radix. The interpretation stops when the first + /// character that is not suitable for the radix is encountered. Acceptable + /// radix values are 2, 8, 10 and 16. It is an error for the value implied by + /// the string to require more bits than numBits. + /// @param numBits the bit width of the constructed ap_private + /// @param strStart the start of the string to be interpreted + /// @param slen the maximum number of characters to interpret + /// @param radix the radix to use for the conversion + /// @brief Construct an ap_private from a string representation. + /// This method does not consider whether it is negative or not. + ap_private(const char strStart[], uint32_t slen, uint8_t radix, int base=0, int offset=0) : VAL(0) { + fromString(strStart+base+offset, slen-base-offset, radix); + } + + template + INLINE ap_private(const ap_range_ref<_AP_W2,_AP_S2>& ref) { + *this=ref.get(); + report(); + } + + template + INLINE ap_private(const ap_bit_ref<_AP_W2,_AP_S2>& ref) { + *this = ((uint64_t)(bool)ref); + report(); + } + + template + INLINE ap_private(const ap_concat_ref<_AP_W2, _AP_T2,_AP_W3, _AP_T3>& ref) { + *this=ref.get(); + report(); + } + + template + INLINE ap_private(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2> &val) { + *this = ((val.operator ap_private<_AP_W2, false> ())); + report(); + } + + template + INLINE ap_private(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2> &val) { + *this = (uint64_t)(bool)val; + report(); + } + + /// Simply makes *this a copy of that. + /// @brief Copy Constructor. + template + ap_private(const volatile ap_private<_AP_W1, _AP_S1, _AP_N1>& that): VAL(0) { + operator = (const_cast& >(that)); + } + + template + ap_private(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that): VAL(0) { + operator = (that); + } + + template + explicit ap_private(const ap_private<_AP_W1, _AP_S1, 1>& that): VAL(0) { + static const uint64_t that_sign_ext_mask = (_AP_W1==APINT_BITS_PER_WORD)?0:~0ULL>>(_AP_W1%APINT_BITS_PER_WORD)<<(_AP_W1%APINT_BITS_PER_WORD); + if (that.isNegative()) { + pVal[0] = that.VAL|that_sign_ext_mask; + memset(pVal+1, ~0, sizeof(uint64_t)*(_AP_N-1)); + } else { + pVal[0] = that.VAL; + memset(pVal+1, 0, sizeof(uint64_t)*(_AP_N-1)); + } + clearUnusedBits(); + } + + ap_private(const ap_private& that): VAL(0) { + memcpy(pVal, that.pVal, _AP_N * APINT_WORD_SIZE); + clearUnusedBits(); + } + + /// @brief Destructor. + virtual ~ap_private() {} + + /// Default constructor that creates an uninitialized ap_private. This is useful + /// for object deserialization (pair this with the static method Read). + ap_private(){memset(pVal, 0, sizeof(uint64_t)*(_AP_N));} + + ap_private(uint64_t* val, uint32_t bits=_AP_W) {assert(0);} + ap_private(const uint64_t *const val, uint32_t bits) {assert(0);} + + /// @name Constructors + /// @{ + /// If isSigned is true then val is treated as if it were a signed value + /// (i.e. as an int64_t) and the appropriate sign extension to the bit width + /// will be done. Otherwise, no sign extension occurs (high order bits beyond + /// the range of val are zero filled). + /// @param numBits the bit width of the constructed ap_private + /// @param val the initial value of the ap_private + /// @param isSigned how to treat signedness of val + /// @brief Create a new ap_private of numBits width, initialized as val. +#define CTOR(TYPE, SIGNED) \ + ap_private(TYPE val, bool isSigned=SIGNED) { \ + pVal[0] = val; \ + if (isSigned && int64_t(pVal[0]) < 0) { \ + memset(pVal+1, ~0, sizeof(uint64_t)*(_AP_N-1)); \ + } else { \ + memset(pVal+1, 0, sizeof(uint64_t)*(_AP_N-1)); \ + } \ + clearUnusedBits(); \ + } +#if 1 + CTOR(int, true) + CTOR(bool, false) + CTOR(signed char, true) + CTOR(unsigned char, false) + CTOR(short, true) + CTOR(unsigned short, false) + CTOR(unsigned int, false) + CTOR(long, true) + CTOR(unsigned long, false) + CTOR(unsigned long long, false) + CTOR(long long, true) + CTOR(float, false) + CTOR(double, false) +#undef CTOR +#else + CTOR(uint64_t) +#undef CTOR +#endif + + + /// @returns true if the number of bits <= 64, false otherwise. + /// @brief Determine if this ap_private just has one word to store value. + INLINE bool isSingleWord() const { + return false; + } + + /// @returns the word position for the specified bit position. + /// @brief Determine which word a bit is in. + static uint32_t whichWord(uint32_t bitPosition) { + // return bitPosition / APINT_BITS_PER_WORD; + return (bitPosition) >> 6; + } + + /// @returns the bit position in a word for the specified bit position + /// in the ap_private. + /// @brief Determine which bit in a word a bit is in. + static uint32_t whichBit(uint32_t bitPosition) { + // return bitPosition % APINT_BITS_PER_WORD; + return bitPosition & 0x3f; + } + + /// bit at a specific bit position. This is used to mask the bit in the + /// corresponding word. + /// @returns a uint64_t with only bit at "whichBit(bitPosition)" set + /// @brief Get a single bit mask. + static uint64_t maskBit(uint32_t bitPosition) { + return 1ULL << (whichBit(bitPosition)); + } + + /// @returns the corresponding word for the specified bit position. + /// @brief Get the word corresponding to a bit position + INLINE uint64_t getWord(uint32_t bitPosition) const { + return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; + } + + /// This method is used internally to clear the to "N" bits in the high order + /// word that are not used by the ap_private. This is needed after the most + /// significant word is assigned a value to ensure that those bits are + /// zero'd out. + /// @brief Clear unused high order bits + INLINE void clearUnusedBits(void) { + pVal[_AP_N-1] = _AP_S ? ((((int64_t)pVal[_AP_N-1])<<(excess_bits))>> excess_bits) : (excess_bits ? ((pVal[_AP_N-1])<<(excess_bits))>>(excess_bits) : pVal[_AP_N-1]); + } + + INLINE void clearUnusedBitsToZero(void) { + pVal[_AP_N-1] &= mask; + } + + INLINE void clearUnusedBitsToOne(void) { + pVal[_AP_N-1] |= mask; + } + + /// This is used by the constructors that take string arguments. + /// @brief Convert a char array into an ap_private + INLINE void fromString(const char *strStart, uint32_t slen, + uint8_t radix) ; + + INLINE ap_private read() volatile { + return *this; + } + + INLINE void write(const ap_private& op2) volatile { + *this = (op2); + } + + //Explicit conversions to C interger types + //----------------------------------------------------------- + operator ValType() const { + return getVal(); + } + + INLINE ValType getVal() const{ + return *pVal; + } + + INLINE int to_int() const { + return int(*this); + } + + INLINE unsigned to_uint() const { + return (unsigned) getVal(); + } + + INLINE long to_long() const { + return (long) getVal(); + } + + INLINE unsigned long to_ulong() const { + return (unsigned long) getVal(); + } + + INLINE ap_slong to_int64() const { + return (ap_slong) getVal(); + } + + INLINE ap_ulong to_uint64() const { + return (ap_ulong) getVal(); + } + + INLINE double to_double() const { + if (isNegative()) + return roundToDouble(true); + else + return roundToDouble(false); + } + + INLINE unsigned length() const { return _AP_W; } + + /*Reverse the contents of ap_private instance. I.e. LSB becomes MSB and vise versa*/ + INLINE ap_private& reverse () { + for (int i = 0; i < _AP_W/2; ++i) { + bool tmp = operator[](i); + if (operator[](_AP_W - 1 - i)) + set(i); + else + clear(i); + if (tmp) + set(_AP_W - 1 - i); + else + clear(_AP_W - 1 - i); + } + clearUnusedBits(); + return *this; + } + + /*Return true if the value of ap_private instance is zero*/ + INLINE bool iszero () const { + return isMinValue(); + } + + /* x < 0 */ + INLINE bool sign () const { + if (isNegative()) + return true; + return false; + } + + /* x[i] = !x[i] */ + INLINE void invert (int i) { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + flip(i); + } + + /* x[i] */ + INLINE bool test (int i) const { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + return operator[](i); + } + + //Set the ith bit into v + INLINE void set (int i, bool v) { + assert( i >= 0 && "Attempting to write bit with negative index"); + assert( i < _AP_W && "Attempting to write bit beyond MSB"); + v ? set(i) : clear(i); + } + + //Set the ith bit into v + INLINE void set_bit (int i, bool v) { + assert( i >= 0 && "Attempting to write bit with negative index"); + assert( i < _AP_W && "Attempting to write bit beyond MSB"); + v ? set(i) : clear(i); + } + + INLINE ap_private& set(uint32_t bitPosition) { + pVal[whichWord(bitPosition)] |= maskBit(bitPosition); + clearUnusedBits(); + return *this; + } + + INLINE void set() { + for (uint32_t i = 0; i < _AP_N; ++i) + pVal[i] = ~0ULL; + clearUnusedBits(); + } + + //Get the value of ith bit + INLINE bool get (int i) const { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + return operator [](i); + } + + //Get the value of ith bit + INLINE bool get_bit (int i) const { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + return operator [](i); + } + + //This is used for sc_lv and sc_bv, which is implemented by sc_uint + //Rotate an ap_private object n places to the left + INLINE void lrotate(int n) { + assert( n >= 0 && "Attempting to shift negative index"); + assert( n < _AP_W && "Shift value larger than bit width"); + operator = (shl(n) | lshr(_AP_W - n)); + } + + //This is used for sc_lv and sc_bv, which is implemented by sc_uint + //Rotate an ap_private object n places to the right + INLINE void rrotate(int n) { + assert( n >= 0 && "Attempting to shift negative index"); + assert( n < _AP_W && "Shift value larger than bit width"); + operator = (lshr(n) | shl(_AP_W - n)); + } + + /// Set the given bit to 0 whose position is given as "bitPosition". + /// @brief Set a given bit to 0. + ap_private& clear(uint32_t bitPosition) { + pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition); + clearUnusedBits(); + return *this; + } + + /// @brief Set every bit to 0. + void clear() { + memset(pVal, 0, _AP_N * APINT_WORD_SIZE); + } + + /// @brief Toggle every bit to its opposite value. + ap_private& flip() { + for (uint32_t i = 0; i < _AP_N; ++i) + pVal[i] ^= ~0ULL; + clearUnusedBits(); + return *this; + } + + /// Toggle a given bit to its opposite value whose position is given + /// as "bitPosition". + /// @brief Toggles a given bit to its opposite value. + ap_private& flip(uint32_t bitPosition) { + assert(bitPosition < BitWidth && "Out of the bit-width range!"); + if ((*this)[bitPosition]) clear(bitPosition); + else set(bitPosition); + return *this; + } + + //complements every bit + INLINE void b_not() { + flip(); + } + + ap_private getLoBits(uint32_t numBits) const { + return ap_private_ops::lshr(ap_private_ops::shl(*this, _AP_W - numBits), + _AP_W - numBits); + } + + ap_private getHiBits(uint32_t numBits) const { + return ap_private_ops::lshr(*this, _AP_W - numBits); + } + + //Binary Arithmetic + //----------------------------------------------------------- + + template + INLINE ap_private + operator & (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this & a2.get(); + } + + template + INLINE ap_private + operator | (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this | a2.get(); + } + + template + INLINE ap_private + operator ^ (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this ^ a2.get(); + } + + + ///Arithmetic assign + //------------------------------------------------------------- + +#define OP_BIN_LOGIC_ASSIGN_AP(Sym) \ + template \ + INLINE ap_private& operator Sym(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { \ + uint32_t numWords = AESL_std::min(_AP_N, _AP_N1); \ + uint32_t i; \ + for (i = 0; i < numWords; ++i) \ + pVal[i] Sym RHS.pVal[i]; \ + if (_AP_N1 < _AP_N) { \ + uint64_t ext = RHS.isNegative()?~0ULL:0; \ + for (;i<_AP_N; i++) \ + pVal[i] Sym ext; \ + } \ + clearUnusedBits(); \ + return *this; \ + } + + OP_BIN_LOGIC_ASSIGN_AP(&=); + OP_BIN_LOGIC_ASSIGN_AP(|=); + OP_BIN_LOGIC_ASSIGN_AP(^=); +#undef OP_BIN_LOGIC_ASSIGN_AP + + /// Adds the RHS APint to this ap_private. + /// @returns this, after addition of RHS. + /// @brief Addition assignment operator. + template + INLINE ap_private& operator+=(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + add(pVal, pVal, RHS.pVal, _AP_N, _AP_N, _AP_N1, _AP_S, _AP_S1); + clearUnusedBits(); + return *this; + } + + template + INLINE ap_private& operator-=(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + sub(pVal, pVal, RHS.pVal, _AP_N, _AP_N, _AP_N1, _AP_S, _AP_S1); + clearUnusedBits(); + return *this; + } + + template + ap_private& operator*=(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + // Get some bit facts about LHS and check for zero + uint32_t lhsBits = getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1; + if (!lhsWords) { + // 0 * X ===> 0 + return *this; + } + + ap_private dupRHS = RHS; + // Get some bit facts about RHS and check for zero + uint32_t rhsBits = dupRHS.getActiveBits(); + uint32_t rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1; + if (!rhsWords) { + // X * 0 ===> 0 + clear(); + return *this; + } + + // Allocate space for the result + uint32_t destWords = rhsWords + lhsWords; + uint64_t *dest = getMemory(destWords); + + // Perform the long multiply + mul(dest, pVal, lhsWords, dupRHS.pVal, rhsWords, destWords); + + // Copy result back into *this + clear(); + uint32_t wordsToCopy = destWords >= _AP_N ? _AP_N : destWords; + + memcpy(pVal, dest, wordsToCopy* APINT_WORD_SIZE); + + uint64_t ext = (isNegative() ^ RHS.isNegative()) ? ~0ULL : 0ULL; + for (int i=wordsToCopy; i<_AP_N; i++) + pVal[i]=ext; + clearUnusedBits(); + // delete dest array and return + free(dest); + return *this; + } + +#define OP_ASSIGN_AP(Sym) \ + template \ + INLINE ap_private& operator Sym##=(const ap_private<_AP_W2,_AP_S2>& op) \ + { \ + *this=operator Sym (op); \ + return *this; \ + } \ + + OP_ASSIGN_AP(/) + OP_ASSIGN_AP(%) +#undef OP_ASSIGN_AP + +#define OP_BIN_LOGIC_AP(Sym) \ + template \ + INLINE \ + typename RType<_AP_W1, _AP_S1>::logic \ + operator Sym (const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) const { \ + enum { numWords = (RType<_AP_W1, _AP_S1>::logic_w +APINT_BITS_PER_WORD-1)/APINT_BITS_PER_WORD}; \ + typename RType<_AP_W1, _AP_S1>::logic Result; \ + uint64_t *val = Result.pVal; \ + uint32_t i; \ + uint32_t min_N = std::min(_AP_N, _AP_N1); \ + uint32_t max_N = std::max(_AP_N, _AP_N1); \ + for (i = 0; i < min_N; ++i) \ + val[i] = pVal[i] Sym RHS.pVal[i]; \ + if (numWords > i) { \ + const uint64_t* tmpVal = (_AP_N>_AP_N1 ? pVal : RHS.pVal)+i; \ + uint64_t ext = ((_AP_N<_AP_N1 && isNegative() )||(_AP_N1 < _AP_N && RHS.isNegative())) ? ~0ULL : 0; \ + for (;i i) { \ + uint64_t ext2 = ((_AP_N>_AP_N1 && isNegative() )||(_AP_N1 > _AP_N && RHS.isNegative())) ? ~0ULL : 0; \ + val[i] = ext Sym ext2; \ + } \ + } \ + Result.clearUnusedBits(); \ + return Result; \ + } + + OP_BIN_LOGIC_AP(|); + OP_BIN_LOGIC_AP(&); + OP_BIN_LOGIC_AP(^); + +#undef OP_BIN_LOGIC_AP + + template + INLINE typename RType<_AP_W1,_AP_S1>::plus operator+(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) const { + // assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); + typename RType<_AP_W1,_AP_S1>::plus Result; + bool carry = add(Result.pVal, this->pVal, RHS.pVal, (RType<_AP_W1,_AP_S1>::plus_w + 63) / 64, _AP_N, _AP_N1, _AP_S, _AP_S1); + if ((RType<_AP_W1,_AP_S1>::plus_w + 63) / 64> std::max(_AP_W, _AP_W1) ) + Result.pVal[(RType<_AP_W1,_AP_S1>::plus_w + 63)/64 - 1] = carry; + Result.clearUnusedBits(); + return Result; + } + + template + INLINE typename RType<_AP_W1,_AP_S1>::minus operator-(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) const { + typename RType<_AP_W1,_AP_S1>::minus Result; + bool borrow = sub(Result.pVal, this->pVal, RHS.pVal, (RType<_AP_W1,_AP_S1>::minus_w + 63) / 64, _AP_N, _AP_N1, _AP_S, _AP_S1); + if ((RType<_AP_W1,_AP_S1>::minus_w + 63) / 64 > AESL_std::max(_AP_W, _AP_W1) ) { + Result.pVal[(RType<_AP_W1,_AP_S1>::minus_w+63)/64 - 1] = borrow; + } + Result.clearUnusedBits(); + return Result; + } + + template + typename RType<_AP_W1, _AP_S1>::mult operator*(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) const { + + // Get some bit facts about LHS and check for zero + uint32_t lhsBits = getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1; + if (!lhsWords) + // 0 * X ===> 0 + return typename RType<_AP_W1, _AP_S1>::mult(); + + // Get some bit facts about RHS and check for zero + uint32_t rhsBits = RHS.getActiveBits(); + uint32_t rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1; + if (!rhsWords) { + // X * 0 ===> 0 + return typename RType<_AP_W1, _AP_S1>::mult(); + } + + //extend size to avoid result loss + typename RType<_AP_W1, _AP_S1>::mult dupLHS = *this; + typename RType<_AP_W1, _AP_S1>::mult dupRHS = RHS; + lhsBits = dupLHS.getActiveBits(); + lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1; + rhsBits = dupRHS.getActiveBits(); + rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1; + + // Allocate space for the result + enum { destWords =(RType<_AP_W1, _AP_S1>::mult_w+APINT_BITS_PER_WORD-1)/APINT_BITS_PER_WORD}; + int destw = destWords; + typename RType<_AP_W1, _AP_S1>::mult Result; + uint64_t *dest = Result.pVal; + uint64_t ext = (isNegative() ^ RHS.isNegative()) ? ~0ULL : 0; + + // Perform the long multiply + mul(dest, dupLHS.pVal, lhsWords, dupRHS.pVal, rhsWords, destWords); + + for (int i=lhsWords+rhsWords; i + INLINE typename RType<_AP_W2,_AP_S2>::div + operator / (const ap_private<_AP_W2,_AP_S2>& op) const { + ap_private lhs=ap_private(*this); + ap_private rhs=ap_private(op); + return typename RType<_AP_W2,_AP_S2>::div((_AP_S||_AP_S2)?lhs.sdiv(rhs):lhs.udiv(rhs)); + } + + template + INLINE typename RType<_AP_W2,_AP_S2>::mod + operator % (const ap_private<_AP_W2,_AP_S2>& op) const { + ap_private lhs=*this; + ap_private rhs= op; + typename RType<_AP_W2,_AP_S2>::mod res = typename RType<_AP_W2,_AP_S2>::mod(_AP_S?lhs.srem(rhs):lhs.urem(rhs)); + return res; + } + + template + INLINE ap_private + operator << (const ap_private<_AP_W2, _AP_S2>& op2) const { + uint32_t sh=op2.to_uint(); + return *this << sh; + } + + INLINE ap_private + operator << (uint32_t sh) const { + ap_private r(*this); + bool overflow=(sh>=length()); + if(overflow) + r.clear(); + else + r = ap_private(r.shl(sh)); + return r; + } + + template + INLINE ap_private + operator >> (const ap_private<_AP_W2, _AP_S2>& op2) const { + uint32_t sh = op2.to_uint(); + return *this >> sh; + } + + INLINE ap_private + operator >> (uint32_t sh) const { + ap_private r(*this); + bool overflow=(sh>=_AP_W); + bool neg_v=r.isNegative(); + if(_AP_S) { + if(overflow) + neg_v?r.set():r.clear(); + else + return r.ashr(sh); + } else { + if(overflow) + r.clear(); + else + return r.lshr(sh); + } + return r; + } + + ///Shift assign + //------------------------------------------------------------------ +#define OP_ASSIGN_AP(Sym) \ + template \ + INLINE ap_private& operator Sym##=(int op) \ + { \ + *this = operator Sym (op); \ + return *this; \ + } \ + INLINE ap_private& operator Sym##=(unsigned int op) \ + { \ + *this = operator Sym (op); \ + return *this; \ + } \ + template \ + INLINE ap_private& operator Sym##=(const ap_private<_AP_W2,_AP_S2>& op) \ + { \ + *this = operator Sym (op); \ + return *this; \ + } + OP_ASSIGN_AP(>>) + OP_ASSIGN_AP(<<) +#undef OP_ASSIGN_AP + ///Comparisons + //----------------------------------------------------------------- + bool operator==(const ap_private& RHS) const { + // Get some facts about the number of bits used in the two operands. + uint32_t n1 = getActiveBits(); + uint32_t n2 = RHS.getActiveBits(); + + // If the number of bits isn't the same, they aren't equal + if (n1 != n2) + return false; + + // If the number of bits fits in a word, we only need to compare the low word. + if (n1 <= APINT_BITS_PER_WORD) + return pVal[0] == RHS.pVal[0]; + + // Otherwise, compare everything + for (int i = whichWord(n1 - 1); i >= 0; --i) + if (pVal[i] != RHS.pVal[i]) + return false; + return true; + } + + template + INLINE bool operator == (const ap_private<_AP_W2, _AP_S2>& op) const { + enum { _AP_MAX_W = AP_MAX(_AP_W+(_AP_S||_AP_S2),_AP_W2+(_AP_S||_AP_S2))}; + ap_private<_AP_MAX_W, _AP_S|_AP_S2> lhs(*this); + ap_private<_AP_MAX_W, _AP_S|_AP_S2> rhs(op); + return lhs==rhs; + } + + bool operator==(uint64_t Val) const { + uint32_t n = getActiveBits(); + if (n <= APINT_BITS_PER_WORD) + return pVal[0] == Val; + else + return false; + } + + template + INLINE bool operator != (const ap_private<_AP_W2, _AP_S2>& op) const { + return !(*this==op); + } + + template + INLINE bool operator!=(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return !((*this) == RHS); + } + + INLINE bool operator!=(uint64_t Val) const { + return !((*this) == Val); + } + + + template + INLINE bool operator <= (const ap_private<_AP_W2,_AP_S2>& op) const { + return !(*this>op); + } + + INLINE bool operator <(const ap_private& op) const { + return _AP_S ? slt(op):ult(op); + } + + template + INLINE bool operator < (const ap_private<_AP_W2, _AP_S2>& op) const { + enum { _AP_MAX_W = AP_MAX(_AP_W+(_AP_S||_AP_S2),_AP_W2+(_AP_S||_AP_S2))}; + ap_private<_AP_MAX_W, _AP_S> lhs(*this); + ap_private<_AP_MAX_W, _AP_S2> rhs(op); + if (_AP_S == _AP_S2) + return _AP_S?lhs.slt(rhs):lhs.ult(rhs); + else + if (_AP_S) + if (_AP_W2 >= _AP_W) + return lhs.ult(rhs); + else + return lhs.slt(rhs); + else + if (_AP_W >= _AP_W2) + return lhs.ult(rhs); + else + return lhs.slt(rhs); + } + + template + INLINE bool operator >=(const ap_private<_AP_W2,_AP_S2>& op) const { + return !(*this + INLINE bool operator > (const ap_private<_AP_W2, _AP_S2>& op) const { + enum { _AP_MAX_W = AP_MAX(_AP_W+(_AP_S||_AP_S2),_AP_W2+(_AP_S||_AP_S2))}; + ap_private<_AP_MAX_W, _AP_S> lhs(*this); + ap_private<_AP_MAX_W, _AP_S2> rhs(op); + if (_AP_S == _AP_S2) + return _AP_S?lhs.sgt(rhs):lhs.ugt(rhs); + else + if (_AP_S) + if (_AP_W2 >= _AP_W) + return lhs.ugt(rhs); + else + return lhs.sgt(rhs); + else + if (_AP_W >= _AP_W2) + return lhs.ugt(rhs); + else + return lhs.sgt(rhs); + } + + ///Bit and Part Select + //-------------------------------------------------------------- + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (int Hi, int Lo) const { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(const_cast*>(this), Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + range (int Hi, int Lo) const { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>((const_cast*> (this)), Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + range (int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + range (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + range (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(const_cast(this), Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + return this->range(Hi, Lo); + } + + INLINE ap_bit_ref<_AP_W,_AP_S> operator [] (uint32_t index) { + assert(index >= 0&&"Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index ); + } + + template + INLINE ap_bit_ref<_AP_W,_AP_S> operator [] (const ap_private<_AP_W2,_AP_S2> &index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index.to_int() ); + } + + template + INLINE bool operator [] (const ap_private<_AP_W2,_AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br =operator [] (index); + return br.to_bool(); + } + + INLINE bool operator [](uint32_t bitPosition) const { + return (maskBit(bitPosition) & (pVal[whichWord(bitPosition)])) != 0; + } + + INLINE ap_bit_ref<_AP_W,_AP_S> bit (int index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index ); + } + + template + INLINE ap_bit_ref<_AP_W,_AP_S> bit (const ap_private<_AP_W2,_AP_S2> &index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W &&"Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index.to_int() ); + } + + INLINE bool bit (int index) const { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br(const_cast*>(this), index); + return br.to_bool(); + } + + template + INLINE bool bit (const ap_private<_AP_W2,_AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br = bit(index); + return br.to_bool(); + } + + template + INLINE ap_concat_ref<_AP_W,ap_private<_AP_W, _AP_S>,_AP_W2,ap_private<_AP_W2,_AP_S2> > concat(ap_private<_AP_W2,_AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_private<_AP_W2,_AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W,ap_private<_AP_W, _AP_S>,_AP_W2,ap_private<_AP_W2,_AP_S2> > concat(const ap_private<_AP_W2,_AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_private<_AP_W2,_AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(const_cast& >(*this), a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (const ap_private<_AP_W2, _AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(*this, const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (const ap_private<_AP_W2, _AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(const_cast& >(*this), const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (const ap_range_ref<_AP_W2, _AP_S2> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (ap_range_ref<_AP_W2, _AP_S2> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (const ap_bit_ref<_AP_W2, _AP_S2> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (ap_bit_ref<_AP_W2, _AP_S2> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(*this, a2); + } + + template + INLINE + ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) const { + return ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, a2); + } + + INLINE ap_private<_AP_W,false> get() const { + ap_private<_AP_W,false> ret(*this); + return ret; + } + + template + INLINE void set(const ap_private<_AP_W3, false> & val) { + operator = (ap_private<_AP_W3, _AP_S>(val)); + } + + /// @} + /// @name Value Tests + /// @{ + /// This tests the high bit of this ap_private to determine if it is set. + /// @returns true if this ap_private is negative, false otherwise + /// @brief Determine sign of this ap_private. + INLINE bool isNegative() const { + //just for get rid of warnings + enum {shift = (_AP_W-APINT_BITS_PER_WORD*(_AP_N-1)-1)}; + static const uint64_t mask = 1ULL << (shift); + return _AP_S && (pVal[_AP_N-1]&mask); + } + + /// This tests the high bit of the ap_private to determine if it is unset. + /// @brief Determine if this ap_private Value is positive (not negative). + INLINE bool isPositive() const { + return !isNegative(); + } + + /// This tests if the value of this ap_private is strictly positive (> 0). + /// @returns true if this ap_private is Positive and not zero. + /// @brief Determine if this ap_private Value is strictly positive. + INLINE bool isStrictlyPositive() const { + return isPositive() && (*this) != 0; + } + + /// This checks to see if the value has all bits of the ap_private are set or not. + /// @brief Determine if all bits are set + INLINE bool isAllOnesValue() const { + return countPopulation() == _AP_W; + } + + /// This checks to see if the value of this ap_private is the maximum unsigned + /// value for the ap_private's bit width. + /// @brief Determine if this is the largest unsigned value. + INLINE bool isMaxValue() const { + return countPopulation() == _AP_W; + } + + /// This checks to see if the value of this ap_private is the maximum signed + /// value for the ap_private's bit width. + /// @brief Determine if this is the largest signed value. + INLINE bool isMaxSignedValue() const { + return BitWidth == 1 ? VAL == 0 : + !isNegative() && countPopulation() == _AP_W - 1; + } + + /// This checks to see if the value of this ap_private is the minimum unsigned + /// value for the ap_private's bit width. + /// @brief Determine if this is the smallest unsigned value. + INLINE bool isMinValue() const { + return countPopulation() == 0; + } + + /// This checks to see if the value of this ap_private is the minimum signed + /// value for the ap_private's bit width. + /// @brief Determine if this is the smallest signed value. + INLINE bool isMinSignedValue() const { + return BitWidth == 1 ? VAL == 1 : + isNegative() && countPopulation() == 1; + } + + /// This function returns a pointer to the internal storage of the ap_private. + /// This is useful for writing out the ap_private in binary form without any + /// conversions. + INLINE const uint64_t* getRawData() const { + if (isSingleWord()) + return &VAL; + return &pVal[0]; + } + + ap_private sqrt() const; + + /// @} + /// @Assignment Operators + /// @{ + /// @returns *this after assignment of RHS. + /// @brief Copy assignment operator. + INLINE ap_private& operator=(const ap_private& RHS) { + if (this != &RHS) + memcpy(pVal, RHS.pVal, _AP_N * APINT_WORD_SIZE); + return *this; + } + INLINE ap_private& operator=(const volatile ap_private& RHS) { + if (this != &RHS) + for (int i=0; i<_AP_N; ++i) + pVal[i] = RHS.pVal[i]; + return *this; + } + INLINE volatile ap_private& operator=(const ap_private& RHS) volatile { + if (this != &RHS) + for (int i=0; i<_AP_N; ++i) + pVal[i] = RHS.pVal[i]; + return *this; + } + INLINE volatile ap_private& operator=(const volatile ap_private& RHS) volatile { + if (this != &RHS) + for (int i=0; i<_AP_N; ++i) + pVal[i] = RHS.pVal[i]; + return *this; + } + + template + INLINE ap_private& operator=(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + if (_AP_S1) + cpSextOrTrunc(RHS); + else + cpZextOrTrunc(RHS); + clearUnusedBits(); + return *this; + } + + template + INLINE ap_private& operator=(const volatile ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + if (_AP_S1) + cpSextOrTrunc(RHS); + else + cpZextOrTrunc(RHS); + clearUnusedBits(); + return *this; + } + + template + INLINE ap_private& operator=(const ap_private<_AP_W1, _AP_S1, 1>& RHS) { + static const uint64_t that_sign_ext_mask = (_AP_W1==APINT_BITS_PER_WORD)?0:~0ULL>>(_AP_W1%APINT_BITS_PER_WORD)<<(_AP_W1%APINT_BITS_PER_WORD); + if (RHS.isNegative()) { + pVal[0] = RHS.VAL | that_sign_ext_mask; + memset(pVal+1,~0, APINT_WORD_SIZE*(_AP_N-1)); + } else { + pVal[0] = RHS.VAL; + memset(pVal+1, 0, APINT_WORD_SIZE*(_AP_N-1)); + } + clearUnusedBits(); + return *this; + } + + template + INLINE ap_private& operator=(const volatile ap_private<_AP_W1, _AP_S1, 1>& RHS) { + static const uint64_t that_sign_ext_mask = (_AP_W1==APINT_BITS_PER_WORD)?0:~0ULL>>(_AP_W1%APINT_BITS_PER_WORD)<<(_AP_W1%APINT_BITS_PER_WORD); + if (RHS.isNegative()) { + pVal[0] = RHS.VAL | that_sign_ext_mask; + memset(pVal+1,~0, APINT_WORD_SIZE*(_AP_N-1)); + } else { + pVal[0] = RHS.VAL; + memset(pVal+1, 0, APINT_WORD_SIZE*(_AP_N-1)); + } + clearUnusedBits(); + return *this; + } + + /// @} + /// @name Unary Operators + /// @{ + /// @returns a new ap_private value representing *this incremented by one + /// @brief Postfix increment operator. + INLINE const ap_private operator++(int) { + ap_private API(*this); + ++(*this); + return API; + } + + /// @returns *this incremented by one + /// @brief Prefix increment operator. + INLINE ap_private& operator++() { + add_1(pVal, pVal, _AP_N, 1); + clearUnusedBits(); + return *this; + } + + /// @returns a new ap_private representing *this decremented by one. + /// @brief Postfix decrement operator. + INLINE const ap_private operator--(int) { + ap_private API(*this); + --(*this); + return API; + } + + /// @returns *this decremented by one. + /// @brief Prefix decrement operator. + INLINE ap_private& operator--() { + sub_1(pVal, _AP_N, 1); + clearUnusedBits(); + return *this; + } + + /// Performs a bitwise complement operation on this ap_private. + /// @returns an ap_private that is the bitwise complement of *this + /// @brief Unary bitwise complement operator. + INLINE ap_private operator~() const { + ap_private Result(*this); + Result.flip(); + return Result; + } + + /// Negates *this using two's complement logic. + /// @returns An ap_private value representing the negation of *this. + /// @brief Unary negation operator + INLINE typename RType<1,false>::minus operator-() const { + return ap_private<1,false>(0) - (*this); + } + + /// Performs logical negation operation on this ap_private. + /// @returns true if *this is zero, false otherwise. + /// @brief Logical negation operator. + INLINE bool operator !() const { + for (uint32_t i = 0; i < _AP_N; ++i) + if (pVal[i]) + return false; + return true; + } + + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> And(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return this->operator&(RHS); + } + template + INLINE ap_private Or(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return this->operator|(RHS); + } + template + ap_private Xor(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return this->operator^(RHS); + } + + ap_private Mul(const ap_private& RHS) const { + ap_private Result(*this); + Result *= RHS; + return Result; + } + + ap_private Add(const ap_private& RHS) const { + ap_private Result(0); + bool carry = add(Result.pVal, this->pVal, RHS.pVal, _AP_N, _AP_N, _AP_N, _AP_S, _AP_S); + Result.clearUnusedBits(); + return Result; + } + + ap_private Sub(const ap_private& RHS) const { + ap_private Result(0); + sub(Result.pVal, this->pVal, RHS.pVal, _AP_N, _AP_N, _AP_N, _AP_S, _AP_S); + Result.clearUnusedBits(); + return Result; + } + + /// Arithmetic right-shift this ap_private by shiftAmt. + /// @brief Arithmetic right-shift function. + ap_private ashr(uint32_t shiftAmt) const { + assert(shiftAmt <= BitWidth && "Invalid shift amount, too big"); + // Handle a degenerate case + if (shiftAmt == 0) + return *this; + + // Handle single word shifts with built-in ashr + if (isSingleWord()) { + if (shiftAmt == BitWidth) + return ap_private(/*BitWidth, 0*/); // undefined + else { + uint32_t SignBit = APINT_BITS_PER_WORD - BitWidth; + return ap_private(/*BitWidth,*/ + (((int64_t(VAL) << (SignBit)) >> (SignBit)) >> (shiftAmt))); + } + } + + // If all the bits were shifted out, the result is, technically, undefined. + // We return -1 if it was negative, 0 otherwise. We check this early to avoid + // issues in the algorithm below. + if (shiftAmt == BitWidth) { + if (isNegative()) + return ap_private(-1); + else + return ap_private(0); + } + + // Create some space for the result. + ap_private Retval(0); + uint64_t * val = Retval.pVal; + + // Compute some values needed by the following shift algorithms + uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word + uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift + uint32_t breakWord = _AP_N - 1 - offset; // last word affected + uint32_t bitsInWord = whichBit(BitWidth); // how many bits in last word? + if (bitsInWord == 0) + bitsInWord = APINT_BITS_PER_WORD; + + // If we are shifting whole words, just move whole words + if (wordShift == 0) { + // Move the words containing significant bits + for (uint32_t i = 0; i <= breakWord; ++i) + val[i] = pVal[i+offset]; // move whole word + + // Adjust the top significant word for sign bit fill, if negative + if (isNegative()) + if (bitsInWord < APINT_BITS_PER_WORD) + val[breakWord] |= ~0ULL << (bitsInWord); // set high bits + } else { + // Shift the low order words + for (uint32_t i = 0; i < breakWord; ++i) { + // This combines the shifted corresponding word with the low bits from + // the next word (shifted into this word's high bits). + val[i] = ((pVal[i+offset]) >> (wordShift)); + val[i] |= ((pVal[i+offset+1]) << (APINT_BITS_PER_WORD - wordShift)); + } + + // Shift the break word. In this case there are no bits from the next word + // to include in this word. + val[breakWord] = (pVal[breakWord+offset]) >> (wordShift); + + // Deal with sign extenstion in the break word, and possibly the word before + // it. + if (isNegative()) { + if (wordShift > bitsInWord) { + if (breakWord > 0) + val[breakWord-1] |= + ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord)); + val[breakWord] |= ~0ULL; + } else + val[breakWord] |= (~0ULL << (bitsInWord - wordShift)); + } + } + + // Remaining words are 0 or -1, just assign them. + uint64_t fillValue = (isNegative() ? ~0ULL : 0); + for (uint32_t i = breakWord+1; i < _AP_N; ++i) + val[i] = fillValue; + Retval.clearUnusedBits(); + return Retval; + } + + /// Logical right-shift this ap_private by shiftAmt. + /// @brief Logical right-shift function. + ap_private lshr(uint32_t shiftAmt) const { + if (isSingleWord()) { + if (shiftAmt == BitWidth) + return ap_private(0); + else + return ap_private((this->VAL) >> (shiftAmt)); + } + + // If all the bits were shifted out, the result is 0. This avoids issues + // with shifting by the size of the integer type, which produces undefined + // results. We define these "undefined results" to always be 0. + if (shiftAmt == BitWidth) + return ap_private(0); + + // If none of the bits are shifted out, the result is *this. This avoids + // issues with shifting byt he size of the integer type, which produces + // undefined results in the code below. This is also an optimization. + if (shiftAmt == 0) + return *this; + + // Create some space for the result. + ap_private Retval(0); + uint64_t * val = Retval.pVal; + + // If we are shifting less than a word, compute the shift with a simple carry + if (shiftAmt < APINT_BITS_PER_WORD) { + uint64_t carry = 0; + for (int i = _AP_N-1; i >= 0; --i) { + val[i] = ((pVal[i]) >> (shiftAmt)) | carry; + carry = (pVal[i]) << (APINT_BITS_PER_WORD - shiftAmt); + } + Retval.clearUnusedBits(); + return Retval; + } + + // Compute some values needed by the remaining shift algorithms + uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; + uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; + + // If we are shifting whole words, just move whole words + if (wordShift == 0) { + for (uint32_t i = 0; i < _AP_N - offset; ++i) + val[i] = pVal[i+offset]; + for (uint32_t i = _AP_N-offset; i < _AP_N; i++) + val[i] = 0; + Retval.clearUnusedBits(); + return Retval; + } + + // Shift the low order words + uint32_t breakWord = _AP_N - offset -1; + for (uint32_t i = 0; i < breakWord; ++i) + val[i] = ((pVal[i+offset]) >> (wordShift)) | + ((pVal[i+offset+1]) << (APINT_BITS_PER_WORD - wordShift)); + // Shift the break word. + val[breakWord] = (pVal[breakWord+offset]) >> (wordShift); + + // Remaining words are 0 + for (uint32_t i = breakWord+1; i < _AP_N; ++i) + val[i] = 0; + Retval.clearUnusedBits(); + return Retval; + } + + /// Left-shift this ap_private by shiftAmt. + /// @brief Left-shift function. + ap_private shl(uint32_t shiftAmt) const { + assert(shiftAmt <= BitWidth && "Invalid shift amount, too big"); + if (isSingleWord()) { + if (shiftAmt == BitWidth) + return ap_private(0); // avoid undefined shift results + return ap_private((VAL) << (shiftAmt)); + } + + // If all the bits were shifted out, the result is 0. This avoids issues + // with shifting by the size of the integer type, which produces undefined + // results. We define these "undefined results" to always be 0. + if (shiftAmt == BitWidth) + return ap_private(0); + + // If none of the bits are shifted out, the result is *this. This avoids a + // lshr by the words size in the loop below which can produce incorrect + // results. It also avoids the expensive computation below for a common case. + if (shiftAmt == 0) + return *this; + + // Create some space for the result. + ap_private Retval(0); + uint64_t* val = Retval.pVal; + // If we are shifting less than a word, do it the easy way + if (shiftAmt < APINT_BITS_PER_WORD) { + uint64_t carry = 0; + for (uint32_t i = 0; i < _AP_N; i++) { + val[i] = ((pVal[i]) << (shiftAmt)) | carry; + carry = (pVal[i]) >> (APINT_BITS_PER_WORD - shiftAmt); + } + Retval.clearUnusedBits(); + return Retval; + } + + // Compute some values needed by the remaining shift algorithms + uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; + uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; + + // If we are shifting whole words, just move whole words + if (wordShift == 0) { + for (uint32_t i = 0; i < offset; i++) + val[i] = 0; + for (uint32_t i = offset; i < _AP_N; i++) + val[i] = pVal[i-offset]; + Retval.clearUnusedBits(); + return Retval; + } + + // Copy whole words from this to Result. + uint32_t i = _AP_N - 1; + for (; i > offset; --i) + val[i] = (pVal[i-offset]) << (wordShift) | + (pVal[i-offset-1]) >> (APINT_BITS_PER_WORD - wordShift); + val[offset] = (pVal[0]) << (wordShift); + for (i = 0; i < offset; ++i) + val[i] = 0; + Retval.clearUnusedBits(); + return Retval; + } + + INLINE ap_private rotl(uint32_t rotateAmt) const { + if (rotateAmt == 0) + return *this; + // Don't get too fancy, just use existing shift/or facilities + ap_private hi(*this); + ap_private lo(*this); + hi.shl(rotateAmt); + lo.lshr(BitWidth - rotateAmt); + return hi | lo; + } + + INLINE ap_private rotr(uint32_t rotateAmt) const { + if (rotateAmt == 0) + return *this; + // Don't get too fancy, just use existing shift/or facilities + ap_private hi(*this); + ap_private lo(*this); + lo.lshr(rotateAmt); + hi.shl(BitWidth - rotateAmt); + return hi | lo; + } + + /// Perform an unsigned divide operation on this ap_private by RHS. Both this and + /// RHS are treated as unsigned quantities for purposes of this division. + /// @returns a new ap_private value containing the division result + /// @brief Unsigned division operation. + ap_private udiv(const ap_private& RHS) const { + assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); + + // First, deal with the easy case + if (isSingleWord()) { + assert(RHS.VAL != 0 && "Divide by zero?"); + return ap_private(VAL / RHS.VAL); + } + + // Get some facts about the LHS and RHS number of bits and words + uint32_t rhsBits = RHS.getActiveBits(); + uint32_t rhsWords = !rhsBits ? 0 : (whichWord(rhsBits - 1) + 1); + assert(rhsWords && "Divided by zero???"); + uint32_t lhsBits = this->getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1); + + // Deal with some degenerate cases + if (!lhsWords) + // 0 / X ===> 0 + return ap_private(0); + else if (lhsWords < rhsWords || this->ult(RHS)) { + // X / Y ===> 0, iff X < Y + return ap_private(0); + } else if (*this == RHS) { + // X / X ===> 1 + return ap_private(1); + } else if (lhsWords == 1 && rhsWords == 1) { + // All high words are zero, just use native divide + return ap_private(this->pVal[0] / RHS.pVal[0]); + } + + // We have to compute it the hard way. Invoke the Knuth divide algorithm. + ap_private Quotient(0); // to hold result. + divide(*this, lhsWords, RHS, rhsWords, &Quotient, (ap_private*)0); + return Quotient; + } + + /// Signed divide this ap_private by ap_private RHS. + /// @brief Signed division function for ap_private. + INLINE ap_private sdiv(const ap_private& RHS) const { + if (isNegative()) + if (RHS.isNegative()) + return (-(*this)).udiv(-RHS); + else + return -((-(*this)).udiv(RHS)); + else if (RHS.isNegative()) + return -(this->udiv(-RHS)); + return this->udiv(RHS); + } + + /// Perform an unsigned remainder operation on this ap_private with RHS being the + /// divisor. Both this and RHS are treated as unsigned quantities for purposes + /// of this operation. Note that this is a true remainder operation and not + /// a modulo operation because the sign follows the sign of the dividend + /// which is *this. + /// @returns a new ap_private value containing the remainder result + /// @brief Unsigned remainder operation. + ap_private urem(const ap_private& RHS) const { + if (isSingleWord()) { + assert(RHS.VAL != 0 && "Remainder by zero?"); + return ap_private(VAL % RHS.VAL); + } + + // Get some facts about the LHS + uint32_t lhsBits = getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1); + + // Get some facts about the RHS + uint32_t rhsBits = RHS.getActiveBits(); + uint32_t rhsWords = !rhsBits ? 0 : (whichWord(rhsBits - 1) + 1); + assert(rhsWords && "Performing remainder operation by zero ???"); + + // Check the degenerate cases + if (lhsWords == 0) { + // 0 % Y ===> 0 + return ap_private(0); + } else if (lhsWords < rhsWords || this->ult(RHS)) { + // X % Y ===> X, iff X < Y + return *this; + } else if (*this == RHS) { + // X % X == 0; + return ap_private(0); + } else if (lhsWords == 1) { + // All high words are zero, just use native remainder + return ap_private(pVal[0] % RHS.pVal[0]); + } + + // We have to compute it the hard way. Invoke the Knuth divide algorithm. + ap_private Remainder(0); + divide(*this, lhsWords, RHS, rhsWords, (ap_private*)(0), &Remainder); + return Remainder; + } + + ap_private urem(uint64_t RHS) const { + // Get some facts about the LHS + uint32_t lhsBits = getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1); + // Get some facts about the RHS + uint32_t rhsBits = 64 - CountLeadingZeros_64(RHS); // RHS.getActiveBits(); + uint32_t rhsWords = 1;//!rhsBits ? 0 : (ap_private<_AP_W, _AP_S, _AP_N>::whichWord(rhsBits - 1) + 1); + assert(rhsWords && "Performing remainder operation by zero ???"); + // Check the degenerate cases + if (lhsWords == 0) { + // 0 % Y ===> 0 + return ap_private(0); + } else if (lhsWords < rhsWords || this->ult(RHS)) { + // X % Y ===> X, iff X < Y + return *this; + } else if (*this == RHS) { + // X % X == 0; + return ap_private(0); + } else if (lhsWords == 1) { + // All high words are zero, just use native remainder + return ap_private(pVal[0] % RHS); + } + + // We have to compute it the hard way. Invoke the Knuth divide algorithm. + ap_private Remainder(0); + divide(*this, lhsWords, RHS, (ap_private*)(0), &Remainder); + return Remainder; + } + + /// Signed remainder operation on ap_private. + /// @brief Function for signed remainder operation. + INLINE ap_private srem(const ap_private& RHS) const { + if (isNegative()) { + ap_private lhs = -(*this); + if (RHS.isNegative()) { + ap_private rhs = -RHS; + return -(lhs.urem(rhs)); + } else + return -(lhs.urem(RHS)); + } else if (RHS.isNegative()) { + ap_private rhs = -RHS; + return this->urem(rhs); + } + return this->urem(RHS); + } + + /// Signed remainder operation on ap_private. + /// @brief Function for signed remainder operation. + INLINE ap_private srem(int64_t RHS) const { + if (isNegative()) + if (RHS<0) + return -((-(*this)).urem(-RHS)); + else + return -((-(*this)).urem(RHS)); + else if (RHS<0) + return this->urem(-RHS); + return this->urem(RHS); + } + + /// Sometimes it is convenient to divide two ap_private values and obtain both + /// the quotient and remainder. This function does both operations in the + /// same computation making it a little more efficient. + /// @brief Dual division/remainder interface. + static void udivrem(const ap_private& LHS, const ap_private& RHS, ap_private &Quotient, ap_private& Remainder) { + // Get some size facts about the dividend and divisor + uint32_t lhsBits = LHS.getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : (ap_private::whichWord(lhsBits - 1) + 1); + uint32_t rhsBits = RHS.getActiveBits(); + uint32_t rhsWords = !rhsBits ? 0 : (ap_private::whichWord(rhsBits - 1) + 1); + + // Check the degenerate cases + if (lhsWords == 0) { + Quotient = 0; // 0 / Y ===> 0 + Remainder = 0; // 0 % Y ===> 0 + return; + } + + if (lhsWords < rhsWords || LHS.ult(RHS)) { + Quotient = 0; // X / Y ===> 0, iff X < Y + Remainder = LHS; // X % Y ===> X, iff X < Y + return; + } + + if (LHS == RHS) { + Quotient = 1; // X / X ===> 1 + Remainder = 0; // X % X ===> 0; + return; + } + + if (lhsWords == 1 && rhsWords == 1) { + // There is only one word to consider so use the native versions. + if (LHS.isSingleWord()) { + Quotient = ap_private(LHS.VAL / RHS.VAL); + Remainder = ap_private(LHS.VAL % RHS.VAL); + } else { + Quotient = ap_private(LHS.pVal[0] / RHS.pVal[0]); + Remainder = ap_private(LHS.pVal[0] % RHS.pVal[0]); + } + return; + } + + // Okay, lets do it the long way + divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder); + } + + static void sdivrem(const ap_private &LHS, const ap_private &RHS, + ap_private &Quotient, ap_private &Remainder) { + if (LHS.isNegative()) { + if (RHS.isNegative()) + ap_private::udivrem(-LHS, -RHS, Quotient, Remainder); + else + ap_private::udivrem(-LHS, RHS, Quotient, Remainder); + Quotient = -Quotient; + Remainder = -Remainder; + } else if (RHS.isNegative()) { + ap_private::udivrem(LHS, -RHS, Quotient, Remainder); + Quotient = -Quotient; + } else { + ap_private::udivrem(LHS, RHS, Quotient, Remainder); + } + } + + /// Compares this ap_private with RHS for the validity of the equality + /// relationship. + /// @returns true if *this == Val + /// @brief Equality comparison. + template + INLINE bool eq(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return (*this) == RHS; + } + + /// Compares this ap_private with RHS for the validity of the inequality + /// relationship. + /// @returns true if *this != Val + /// @brief Inequality comparison + template + INLINE bool ne(const ap_private<_AP_W, _AP_S1, _AP_N> &RHS) const { + return !((*this) == RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// the validity of the less-than relationship. + /// @returns true if *this < RHS when both are considered unsigned. + /// @brief Unsigned less than comparison + template + INLINE bool ult(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + // Get active bit length of both operands + uint32_t n1 = getActiveBits(); + uint32_t n2 = RHS.getActiveBits(); + + // If magnitude of LHS is less than RHS, return true. + if (n1 < n2) + return true; + + // If magnitude of RHS is greather than LHS, return false. + if (n2 < n1) + return false; + + // If they bot fit in a word, just compare the low order word + if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD) + return pVal[0] < RHS.pVal[0]; + + // Otherwise, compare all words + uint32_t topWord = whichWord(AESL_std::max(n1,n2)-1); + for (int i = topWord; i >= 0; --i) { + if (pVal[i] > RHS.pVal[i]) + return false; + if (pVal[i] < RHS.pVal[i]) + return true; + } + return false; + } + + INLINE bool ult(uint64_t RHS) const { + // Get active bit length of both operands + uint32_t n1 = getActiveBits(); + uint32_t n2 = 64 - CountLeadingZeros_64(RHS); //RHS.getActiveBits(); + + // If magnitude of LHS is less than RHS, return true. + if (n1 < n2) + return true; + + // If magnitude of RHS is greather than LHS, return false. + if (n2 < n1) + return false; + + // If they bot fit in a word, just compare the low order word + if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD) + return pVal[0] < RHS; + assert(0); + } + + template + INLINE bool slt(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + ap_private lhs(*this); + ap_private<_AP_W, _AP_S1, _AP_N> rhs(RHS); + bool lhsNeg = isNegative(); + bool rhsNeg = rhs.isNegative(); + if (lhsNeg) { + // Sign bit is set so perform two's complement to make it positive + lhs.flip(); + lhs++; + } + if (rhsNeg) { + // Sign bit is set so perform two's complement to make it positive + rhs.flip(); + rhs++; + } + + // Now we have unsigned values to compare so do the comparison if necessary + // based on the negativeness of the values. + if (lhsNeg) + if (rhsNeg) + return lhs.ugt(rhs); + else + return true; + else if (rhsNeg) + return false; + else + return lhs.ult(rhs); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// validity of the less-or-equal relationship. + /// @returns true if *this <= RHS when both are considered unsigned. + /// @brief Unsigned less or equal comparison + template + INLINE bool ule(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return ult(RHS) || eq(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// validity of the less-or-equal relationship. + /// @returns true if *this <= RHS when both are considered signed. + /// @brief Signed less or equal comparison + template + INLINE bool sle(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return slt(RHS) || eq(RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// the validity of the greater-than relationship. + /// @returns true if *this > RHS when both are considered unsigned. + /// @brief Unsigned greather than comparison + template + INLINE bool ugt(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return !ult(RHS) && !eq(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// the validity of the greater-than relationship. + /// @returns true if *this > RHS when both are considered signed. + /// @brief Signed greather than comparison + template + INLINE bool sgt(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return !slt(RHS) && !eq(RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// validity of the greater-or-equal relationship. + /// @returns true if *this >= RHS when both are considered unsigned. + /// @brief Unsigned greater or equal comparison + template + INLINE bool uge(const ap_private<_AP_W, _AP_S, _AP_N>& RHS) const { + return !ult(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// validity of the greater-or-equal relationship. + /// @returns true if *this >= RHS when both are considered signed. + /// @brief Signed greather or equal comparison + template + INLINE bool sge(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return !slt(RHS); + } + + template + void cpTrunc(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) { + assert(_AP_W1 > BitWidth && "Invalid ap_private Truncate request"); + assert(_AP_W1 >= MIN_INT_BITS && "Can't truncate to 0 bits"); + memcpy(pVal, that.pVal, _AP_N*APINT_WORD_SIZE); + } + + // Sign extend to a new width. + template + void cpSext(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) { + assert(_AP_W1 < BitWidth && "Invalid ap_private SignExtend request"); + assert(_AP_W1 <= MAX_INT_BITS && "Too many bits"); + // If the sign bit isn't set, this is the same as zext. + if (!that.isNegative()) { + cpZext(that); + return; + } + + // The sign bit is set. First, get some facts + enum { wordBits = _AP_W1 % APINT_BITS_PER_WORD}; + + // Mask the high order word appropriately + if (_AP_N1 == _AP_N) { + enum { newWordBits = _AP_W % APINT_BITS_PER_WORD}; + // The extension is contained to the wordsBefore-1th word. + static const uint64_t mask = wordBits?(~0ULL<<(wordBits)):0ULL; + if (_AP_N1 == 1) { + assert(0); + } else { + for (uint32_t i = 0; i < _AP_N1; ++i) + pVal[i] = that.pVal[i]; + pVal[_AP_N1-1] |= mask; + return; + } + } + + if (_AP_N1 == 1) { + assert(0);// newVal[0] = VAL | mask; + } else { + enum { newWordBits = _AP_W % APINT_BITS_PER_WORD}; + // The extension is contained to the wordsBefore-1th word. + static const uint64_t mask = wordBits?(~0ULL<<(wordBits)):0ULL; + for (uint32_t i = 0; i < _AP_N1; ++i) + pVal[i] = that.pVal[i]; + pVal[_AP_N1-1] |= mask; + } + for (uint32_t i=_AP_N1; i < _AP_N-1; i++) + pVal[i] = ~0ULL; + pVal[_AP_N-1] = ~0ULL; + clearUnusedBits(); + return; + } + + // Zero extend to a new width. + template + void cpZext(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) { + assert(_AP_W1 < BitWidth && "Invalid ap_private ZeroExtend request"); + assert(_AP_W1 <= MAX_INT_BITS && "Too many bits"); + uint32_t wordsAfter = _AP_N; + if (wordsAfter==1) { + assert(0); // return ap_private<_AP_W1, _AP_S, _AP_N1> (_AP_W1, VAL, _AP_S); + } else { + if (_AP_N1 == 1) { + assert(0); + // newVal[0] = VAL; + } else { + uint32_t i = 0; + for (; i < _AP_N1; ++i) + pVal[i] = that.pVal[i]; + for (; i < _AP_N; ++i) + pVal[i] = 0; + } + } + clearUnusedBits(); + } + + template + void cpZextOrTrunc(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) { + if (BitWidth > _AP_W1) + cpZext(that); + else if (BitWidth < _AP_W1) + cpTrunc(that); + else { + for (int i=0; i<_AP_N1; ++i) + pVal[i]=that.pVal[i]; + clearUnusedBits(); + } + } + + template + void cpSextOrTrunc(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) { + if (BitWidth > _AP_W1) + cpSext(that); + else if (BitWidth < _AP_W1) + cpTrunc(that); + else { + for (int i=0; i<_AP_N1; ++i) + pVal[i] = that.pVal[i]; + clearUnusedBits(); + } + } + + /// @name Value Characterization Functions + /// @{ + + /// @returns the total number of bits. + INLINE uint32_t getBitWidth() const { + return BitWidth; + } + + /// Here one word's bitwidth equals to that of uint64_t. + /// @returns the number of words to hold the integer value of this ap_private. + /// @brief Get the number of words. + INLINE uint32_t getNumWords() const { + return (BitWidth + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD; + } + + /// This function returns the number of active bits which is defined as the + /// bit width minus the number of leading zeros. This is used in several + /// computations to see how "wide" the value is. + /// @brief Compute the number of active bits in the value + INLINE uint32_t getActiveBits() const { + uint32_t bits=BitWidth - countLeadingZeros(); + return bits?bits:1; + } + + + /// This method attempts to return the value of this ap_private as a zero extended + /// uint64_t. The bitwidth must be <= 64 or the value must fit within a + /// uint64_t. Otherwise an assertion will result. + /// @brief Get zero extended value + INLINE uint64_t getZExtValue() const { + assert(getActiveBits() <= 64 && "Too many bits for uint64_t"); + return *pVal; + } + + /// This method attempts to return the value of this ap_private as a sign extended + /// int64_t. The bit width must be <= 64 or the value must fit within an + /// int64_t. Otherwise an assertion will result. + /// @brief Get sign extended value + INLINE int64_t getSExtValue() const { + assert(getActiveBits() <= 64 && "Too many bits for int64_t"); + return int64_t(pVal[0]); + } + + /// This method determines how many bits are required to hold the ap_private + /// equivalent of the string given by \p str of length \p slen. + /// @brief Get bits required for string value. + static uint32_t getBitsNeeded(const char* str, uint32_t slen, uint8_t radix); + + /// countLeadingZeros - This function is an ap_private version of the + /// countLeadingZeros_{32,64} functions in MathExtras.h. It counts the number + /// of zeros from the most significant bit to the first one bit. + /// @returns BitWidth if the value is zero. + /// @returns the number of zeros from the most significant bit to the first + /// one bits. + INLINE uint32_t countLeadingZeros() const ; + + /// countLeadingOnes - This function counts the number of contiguous 1 bits + /// in the high order bits. The count stops when the first 0 bit is reached. + /// @returns 0 if the high order bit is not set + /// @returns the number of 1 bits from the most significant to the least + /// @brief Count the number of leading one bits. + INLINE uint32_t countLeadingOnes() const ; + + /// countTrailingZeros - This function is an ap_private version of the + /// countTrailingZoers_{32,64} functions in MathExtras.h. It counts + /// the number of zeros from the least significant bit to the first set bit. + /// @returns BitWidth if the value is zero. + /// @returns the number of zeros from the least significant bit to the first + /// one bit. + /// @brief Count the number of trailing zero bits. + INLINE uint32_t countTrailingZeros() const ; + + /// countPopulation - This function is an ap_private version of the + /// countPopulation_{32,64} functions in MathExtras.h. It counts the number + /// of 1 bits in the ap_private value. + /// @returns 0 if the value is zero. + /// @returns the number of set bits. + /// @brief Count the number of bits set. + INLINE uint32_t countPopulation() const { + uint32_t Count = 0; + for (uint32_t i = 0; i<_AP_N-1 ; ++i) + Count += CountPopulation_64(pVal[i]); + Count += CountPopulation_64(pVal[_AP_N-1]&mask); + return Count; + } + + /// @} + /// @name Conversion Functions + /// @{ + + /// This is used internally to convert an ap_private to a string. + /// @brief Converts an ap_private to a std::string + INLINE std::string toString(uint8_t radix, bool wantSigned) const + ; + + /// Considers the ap_private to be unsigned and converts it into a string in the + /// radix given. The radix can be 2, 8, 10 or 16. + /// @returns a character interpretation of the ap_private + /// @brief Convert unsigned ap_private to string representation. + INLINE std::string toStringUnsigned(uint8_t radix = 10) const { + return toString(radix, false); + } + + /// Considers the ap_private to be unsigned and converts it into a string in the + /// radix given. The radix can be 2, 8, 10 or 16. + /// @returns a character interpretation of the ap_private + /// @brief Convert unsigned ap_private to string representation. + INLINE std::string toStringSigned(uint8_t radix = 10) const { + return toString(radix, true); + } + + /// @returns a byte-swapped representation of this ap_private Value. + INLINE ap_private byteSwap() const ; + + /// @brief Converts this ap_private to a double value. + INLINE double roundToDouble(bool isSigned) const ; + + /// @brief Converts this unsigned ap_private to a double value. + INLINE double roundToDouble() const { + return roundToDouble(false); + } + + /// @brief Converts this signed ap_private to a double value. + INLINE double signedRoundToDouble() const { + return roundToDouble(true); + } + + /// The conversion does not do a translation from integer to double, it just + /// re-interprets the bits as a double. Note that it is valid to do this on + /// any bit width. Exactly 64 bits will be translated. + /// @brief Converts ap_private bits to a double + INLINE double bitsToDouble() const { + union { + uint64_t __I; + double __D; + } __T; + __T.__I = pVal[0]; + return __T.__D; + } + + /// The conversion does not do a translation from integer to float, it just + /// re-interprets the bits as a float. Note that it is valid to do this on + /// any bit width. Exactly 32 bits will be translated. + /// @brief Converts ap_private bits to a double + INLINE float bitsToFloat() const { + union { + uint32_t __I; + float __F; + } __T; + __T.__I = uint32_t(pVal[0]); + return __T.__F; + } + + /// The conversion does not do a translation from double to integer, it just + /// re-interprets the bits of the double. Note that it is valid to do this on + /// any bit width but bits from V may get truncated. + /// @brief Converts a double to ap_private bits. + INLINE ap_private& doubleToBits(double __V) { + union { + uint64_t __I; + double __D; + } __T; + __T.__D = __V; + pVal[0] = __T.__I; + return *this; + } + + /// The conversion does not do a translation from float to integer, it just + /// re-interprets the bits of the float. Note that it is valid to do this on + /// any bit width but bits from V may get truncated. + /// @brief Converts a float to ap_private bits. + INLINE ap_private& floatToBits(float __V) { + union { + uint32_t __I; + float __F; + } __T; + __T.__F = __V; + pVal[0] = __T.__I; + } + + //Reduce operation + //----------------------------------------------------------- + INLINE bool and_reduce() const { + return isMaxValue(); + } + + INLINE bool nand_reduce() const { + return isMinValue(); + } + + INLINE bool or_reduce() const { + return (bool)countPopulation(); + } + + INLINE bool nor_reduce() const { + return countPopulation()==0; + } + + INLINE bool xor_reduce() const { + unsigned int i=countPopulation(); + return (i%2)?true:false; + } + + INLINE bool xnor_reduce() const { + unsigned int i=countPopulation(); + return (i%2)?false:true; + } + INLINE std::string to_string(uint8_t radix=16, bool sign=false) const { + return toString(radix, radix==10?_AP_S:sign); + } +}; + +template +INLINE bool operator==(uint64_t V1, const ap_private<_AP_W, _AP_S, _AP_N>& V2) { + return V2 == V1; +} + +template +INLINE bool operator!=(uint64_t V1, const ap_private<_AP_W, _AP_S, _AP_N>& V2) { + return V2 != V1; +} + +namespace ap_private_ops { + enum {APINT_BITS_PER_WORD=64}; + /// @brief Determine the smaller of two ap_privates considered to be signed. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> smin(const ap_private<_AP_W, _AP_S, _AP_N> &LHS, const ap_private<_AP_W, _AP_S1, _AP_N> &RHS) { + return LHS.slt(RHS) ? LHS : RHS; + } + + /// @brief Determine the larger of two ap_privates considered to be signed. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> smax(const ap_private<_AP_W, _AP_S, _AP_N> &LHS, const ap_private<_AP_W, _AP_S1, _AP_N> &RHS) { + return LHS.sgt(RHS) ? LHS : RHS; + } + + /// @brief Determine the smaller of two ap_privates considered to be signed. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> umin(const ap_private<_AP_W, _AP_S, _AP_N> &LHS, const ap_private<_AP_W, _AP_S1, _AP_N> &RHS) { + return LHS.ult(RHS) ? LHS : RHS; + } + + /// @brief Determine the larger of two ap_privates considered to be unsigned. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> umax(const ap_private<_AP_W, _AP_S, _AP_N> &LHS, const ap_private<_AP_W, _AP_S1, _AP_N> &RHS) { + return LHS.ugt(RHS) ? LHS : RHS; + } + + /// @brief Check if the specified ap_private has a N-bits integer value. + template + INLINE bool isIntN(uint32_t __N, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.isIntN(__N); + } + + /// @returns true if the argument ap_private value is a sequence of ones + /// starting at the least significant bit with the remainder zero. + template + INLINE bool isMask(uint32_t numBits, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.getBoolValue() && ((APIVal + ap_private<_AP_W, _AP_S, _AP_N>(numBits,1)) & APIVal) == 0; + } + + /// @returns true if the argument ap_private value contains a sequence of ones + /// with the remainder zero. + template + INLINE bool isShiftedMask(uint32_t numBits, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return isMask(numBits, (APIVal - ap_private<_AP_W, _AP_S, _AP_N>(numBits,1)) | APIVal); + } + + /// @returns a byte-swapped representation of the specified ap_private Value. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> byteSwap(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.byteSwap(); + } + + /// @returns the floor log base 2 of the specified ap_private value. + template INLINE uint32_t logBase2(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.logBase2(); + } + + /// GreatestCommonDivisor - This function returns the greatest common + /// divisor of the two ap_private values using Enclid's algorithm. + /// @returns the greatest common divisor of Val1 and Val2 + /// @brief Compute GCD of two ap_private values. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> GreatestCommonDivisor(const ap_private<_AP_W, _AP_S, _AP_N>& Val1, const ap_private<_AP_W, _AP_S, _AP_N>& Val2) + ; + + /// Treats the ap_private as an unsigned value for conversion purposes. + /// @brief Converts the given ap_private to a double value. + template INLINE double Roundap_privateToDouble(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.roundToDouble(); + } + + /// Treats the ap_private as a signed value for conversion purposes. + /// @brief Converts the given ap_private to a double value. + template INLINE double RoundSignedap_privateToDouble(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.signedRoundToDouble(); + } + + /// @brief Converts the given ap_private to a float vlalue. + template INLINE float Roundap_privateToFloat(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return float(Roundap_privateToDouble(APIVal)); + } + + /// Treast the ap_private as a signed value for conversion purposes. + /// @brief Converts the given ap_private to a float value. + template INLINE float RoundSignedap_privateToFloat(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return float(APIVal.signedRoundToDouble()); + } + + /// RoundDoubleToap_private - This function convert a double value to an ap_private value. + /// @brief Converts the given double value into a ap_private. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> RoundDoubleToap_private(double Double, uint32_t width) ; + + /// RoundFloatToap_private - Converts a float value into an ap_private value. + /// @brief Converts a float value into a ap_private. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> RoundFloatToap_private(float Float, uint32_t width) { + return RoundDoubleToap_private<_AP_W, _AP_S, _AP_N>(double(Float), width); + } + + /// Arithmetic right-shift the ap_private by shiftAmt. + /// @brief Arithmetic right-shift function. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> ashr(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t shiftAmt) { + return LHS.ashr(shiftAmt); + } + + /// Logical right-shift the ap_private by shiftAmt. + /// @brief Logical right-shift function. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> lshr(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t shiftAmt) { + return LHS.lshr(shiftAmt); + } + + /// Left-shift the ap_private by shiftAmt. + /// @brief Left-shift function. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> shl(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t shiftAmt) { + return LHS.shl(shiftAmt); + } + + /// Signed divide ap_private LHS by ap_private RHS. + /// @brief Signed division function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> sdiv(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS.sdiv(RHS); + } + + /// Unsigned divide ap_private LHS by ap_private RHS. + /// @brief Unsigned division function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> udiv(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS.udiv(RHS); + } + + /// Signed remainder operation on ap_private. + /// @brief Function for signed remainder operation. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> srem(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS.srem(RHS); + } + + /// Unsigned remainder operation on ap_private. + /// @brief Function for unsigned remainder operation. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> urem(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS.urem(RHS); + } + + /// Performs multiplication on ap_private values. + /// @brief Function for multiplication operation. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> mul(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS * RHS; + } + + /// Performs addition on ap_private values. + /// @brief Function for addition operation. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> add(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS + RHS; + } + + /// Performs subtraction on ap_private values. + /// @brief Function for subtraction operation. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> sub(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS - RHS; + } + + /// Performs bitwise AND operation on ap_private LHS and + /// ap_private RHS. + /// @brief Bitwise AND function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> And(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS & RHS; + } + + /// Performs bitwise OR operation on ap_private LHS and ap_private RHS. + /// @brief Bitwise OR function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> Or(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS | RHS; + } + + /// Performs bitwise XOR operation on ap_private. + /// @brief Bitwise XOR function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> Xor(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS ^ RHS; + } + + /// Performs a bitwise complement operation on ap_private. + /// @brief Bitwise complement function. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> Not(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return ~APIVal; + } + + template void clearUnusedBits(uint64_t& msw) { + // Compute how many bits are used in the final word + // uint32_t wordBits = APIVal.getBitWidth() & 0x3f; + if (wordBits == 0) + // If all bits are used, we want to leave the value alone. This also + // avoids the undefined behavior of >> when the shfit is the same size as + // the word size (64). + return; + + // Mask out the hight bits. + uint64_t mask = ~uint64_t(0ULL) >> (64 /*ap_private::APINT_BITS_PER_WORD */- wordBits); + msw &= mask; + } + template <> INLINE void clearUnusedBits<1>(uint64_t& msw) { + uint64_t mask = ~uint64_t(0ULL) >> (64 /*ap_private::APINT_BITS_PER_WORD */- 1); + msw &= mask; + } + template void clearUnusedBits(int64_t& msw) { + // Compute how many bits are used in the final word + // uint32_t wordBits = APIVal.getBitWidth() & 0x3f; + if (wordBits == 0) + // If all bits are used, we want to leave the value alone. This also + // avoids the undefined behavior of >> when the shfit is the same size as + // the word size (64). + return; + + // Mask out the hight bits. + uint64_t mask = ~uint64_t(0ULL) >> (64 /*ap_private::APINT_BITS_PER_WORD */- wordBits); + msw &= mask; + } + template <> INLINE void clearUnusedBits<1>(int64_t& msw) { + uint64_t mask = ~uint64_t(0ULL) >> (64 /*ap_private::APINT_BITS_PER_WORD */- 1); + msw &= mask; + } + // template + template + INLINE ap_private<_AP_W, _AP_S> ashr(const ap_private<_AP_W, _AP_S>& a) { + return ashr(a, shiftAmt); + } + + template + INLINE ap_private<_AP_W, _AP_S> lshr(const ap_private<_AP_W, _AP_S>& a) { + return lshr(a, shiftAmt); + } + + template + INLINE ap_private<_AP_W, true> ashr(const ap_private<_AP_W, true, 1>& a) { + enum {APINT_BITS_PER_WORD=64, excess_bits=APINT_BITS_PER_WORD-_AP_W}; + static const uint64_t sign_bit = (1ULL<<(_AP_W-1)); + static const uint64_t sign_ext_mask = (_AP_W-shiftAmt>0)?~0ULL<<(APINT_BITS_PER_WORD-_AP_W+shiftAmt):~0ULL; + return ap_private<_AP_W, true>((((int64_t)a.VAL) >> (shiftAmt)) | (a.VAL & sign_bit? sign_ext_mask : 0ULL)); + } + + template + INLINE ap_private<_AP_W, false> ashr(const ap_private<_AP_W, false, 1>& a) { + return ap_private<_AP_W, false>((a.VAL) >> (shiftAmt)); + } + + template + INLINE ap_private<_AP_W, _AP_S> lshr(const ap_private<_AP_W, _AP_S, 1>& a) { + static const uint64_t mask = ~0ULL<<_AP_W; + return ap_private<_AP_W, _AP_S>((a.VAL&mask) >> (shiftAmt)); + } + + template + INLINE ap_private<_AP_W-shiftAmt, _AP_S> shr(const ap_private<_AP_W, _AP_S>& a) { + return ap_private<_AP_W-shiftAmt, _AP_S>((a.VAL) >> (shiftAmt)); + } + + template + INLINE ap_private<_AP_W+shiftAmt, _AP_S> shl(const ap_private<_AP_W, _AP_S>& a) { + return ap_private<_AP_W+shiftAmt, _AP_S>((a.VAL) << (shiftAmt)); + } + + template + INLINE bool get(const ap_private<_AP_W, _AP_S, 1>& a) { + unsigned shift = (index%APINT_BITS_PER_WORD); + static const uint64_t mask=1ULL << (shift); + return ((mask & a.VAL) != 0); + } + + template + INLINE bool get(const ap_private<_AP_W, _AP_S>& a) { + static const uint64_t mask=1ULL << (index&0x3f); + return ((mask & a.pVal[(index)>>6]) != 0); + } + + template + INLINE void set(ap_private<_AP_W, _AP_S, 1>& a) { + const uint64_t mask = ~0ULL >> (lsb) << (APINT_BITS_PER_WORD-msb+lsb-1)>>(APINT_BITS_PER_WORD-msb-1); + a.VAL |= mask; + } + + template + INLINE void clear(ap_private<_AP_W, _AP_S, 1>& a) { + static const uint64_t mask = ~(~0ULL >> (lsb) <<(APINT_BITS_PER_WORD-msb+lsb-1) >> (APINT_BITS_PER_WORD-msb-1)); + a.VAL &= mask; + } + + template + INLINE void set(ap_private<_AP_W, _AP_S>& a) { + enum { APINT_BITS_PER_WORD=64, + lsb_word = lsb_index /APINT_BITS_PER_WORD, + msb_word = msb_index / APINT_BITS_PER_WORD, + msb = msb_index % APINT_BITS_PER_WORD, + lsb=lsb_index % APINT_BITS_PER_WORD}; + if (msb_word==lsb_word) { + const uint64_t mask = ~0ULL >> (lsb) << (APINT_BITS_PER_WORD-msb+lsb-1)>>(APINT_BITS_PER_WORD-msb-1); + a.pVal[msb_word] |= mask; + } else { + const uint64_t lsb_mask = ~0ULL >> (lsb) << (lsb); + const uint64_t msb_mask = ~0ULL << (APINT_BITS_PER_WORD-msb-1)>>(APINT_BITS_PER_WORD-msb-1); + a.pVal[lsb_word] |=lsb_mask; + for (int i=lsb_word+1; i + INLINE void clear(ap_private<_AP_W, _AP_S>& a) { + enum { APINT_BITS_PER_WORD=64, + lsb_word = lsb_index /APINT_BITS_PER_WORD, + msb_word = msb_index / APINT_BITS_PER_WORD, + msb = msb_index % APINT_BITS_PER_WORD, + lsb=lsb_index % APINT_BITS_PER_WORD}; + if (msb_word == lsb_word) { + const uint64_t mask = ~(~0ULL >> (lsb) << (APINT_BITS_PER_WORD-msb+lsb-1)>>(APINT_BITS_PER_WORD-msb-1)); + a.pVal[msb_word] &= mask; + } else { + const uint64_t lsb_mask = ~(~0ULL >> (lsb) << (lsb)); + const uint64_t msb_mask = ~(~0ULL << (APINT_BITS_PER_WORD-msb-1)>>(APINT_BITS_PER_WORD-msb-1)); + a.pVal[lsb_word] &=lsb_mask; + for (int i=lsb_word+1; i + INLINE void set(ap_private<_AP_W, _AP_S, 1>& a) { + static const uint64_t mask=1ULL << (index); + a.VAL |= mask; + a.clearUnusedBits(); + } + + template + INLINE void clear(ap_private<_AP_W, _AP_S, 1>& a) { + static const uint64_t mask=~(1ULL << (index)); + a.VAL &= mask; + a.clearUnusedBits(); + } + + template + INLINE void set(ap_private<_AP_W, _AP_S>& a) { + enum { APINT_BITS_PER_WORD=64, word = index/APINT_BITS_PER_WORD}; + static const uint64_t mask=1ULL << (index%APINT_BITS_PER_WORD); + a.pVal[word] |= mask; + a.clearUnusedBits(); + } + + template + INLINE void clear(ap_private<_AP_W, _AP_S>& a) { + enum { APINT_BITS_PER_WORD=64, word = index/APINT_BITS_PER_WORD}; + static const uint64_t mask=~(1ULL << (index%APINT_BITS_PER_WORD)); + a.pVal[word] &= mask; + a.clearUnusedBits(); + } + + template + INLINE bool isNegative(const ap_private<_AP_W, false>& a) { + return false; + } + + template + INLINE bool isNegative(const ap_private<_AP_W, true, 1>& a) { + static const uint64_t sign_mask = (1ULL << (_AP_W-1)); + return ((sign_mask & a.VAL) != 0); + } + + template + INLINE bool isNegative(const ap_private<_AP_W, true>& a) { + enum {APINT_BITS_PER_WORD=64,_AP_N=(_AP_W+APINT_BITS_PER_WORD-1)/APINT_BITS_PER_WORD}; + static const uint64_t sign_mask = (1ULL << (_AP_W%APINT_BITS_PER_WORD-1)); + return sign_mask & a.pVal[_AP_N-1]; + } +} // End of ap_private_ops namespace + +/// @brief Check if the specified ap_private has a N-bits integer value. +template +INLINE bool isIntN(uint32_t __N, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.isIntN(__N); +} + +/// @returns true if the argument ap_private value is a sequence of ones +/// starting at the least significant bit with the remainder zero. +template +INLINE bool isMask(uint32_t numBits, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.getBoolValue() && ((APIVal + ap_private<_AP_W, _AP_S, _AP_N>(numBits,1)) & APIVal) == 0; +} + +/// @returns true if the argument ap_private value contains a sequence of ones +/// with the remainder zero. +template +INLINE bool isShiftedMask(uint32_t numBits, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return isMask(numBits, (APIVal - ap_private<_AP_W, _AP_S, _AP_N>(numBits,1)) | APIVal); +} + +#if 0 +/// add_1 - This function adds a single "digit" integer, y, to the multiple +/// "digit" integer array, x[]. x[] is modified to reflect the addition and +/// 1 is returned if there is a carry out, otherwise 0 is returned. +/// @returns the carry of the addition. +static bool add_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) { + for (uint32_t i = 0; i < len; ++i) { + dest[i] = y + x[i]; + if (dest[i] < y) + y = 1; // Carry one to next digit. + else { + y = 0; // No need to carry so exit early + break; + } + } + return (y != 0); +} +#endif + +#if 0 +/// add - This function adds the integer array x to the integer array Y and +/// places the result in dest. +/// @returns the carry out from the addition +/// @brief General addition of 64-bit integer arrays +static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y, + uint32_t destlen, uint32_t xlen, uint32_t ylen, bool xsigned, bool ysigned) { + bool carry = false; + uint32_t len = AESL_std::min(xlen, ylen); + uint32_t i; + for (i = 0; i< len && i < destlen; ++i) { + uint64_t limit = AESL_std::min(x[i],y[i]); // must come first in case dest == x + dest[i] = x[i] + y[i] + carry; + carry = dest[i] < limit || (carry && dest[i] == limit); + } + if (xlen > ylen) { + const uint64_t yext = xsigned && int64_t(y[ylen-1])<0 ? -1 : 0; + for (i=ylen; i< xlen && i < destlen; i++) { + uint64_t limit = AESL_std::min(x[i], yext); + dest[i] = x[i] + yext + carry; + carry = (dest[i] < limit)||(carry && dest[i] == x[i]); + } + } else if (ylen> xlen) { + const uint64_t xext = ysigned && int64_t(x[xlen-1])<0 ? -1 : 0; + for (i=xlen; i< ylen && i < destlen; i++) { + uint64_t limit = AESL_std::min(xext, y[i]); + dest[i] = xext + y[i] + carry; + carry = (dest[i] < limit)||(carry && dest[i] == y[i]); + } + } + return carry; +} +#endif + +#if 0 +/// @returns returns the borrow out. +/// @brief Generalized subtraction of 64-bit integer arrays. +static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y, + uint32_t destlen, uint32_t xlen, uint32_t ylen, bool xsigned, bool ysigned) { + bool borrow = false; + uint32_t i; + uint32_t len = AESL_std::min(xlen, ylen); + for (i = 0; i < len && i < destlen; ++i) { + uint64_t x_tmp = borrow ? x[i] - 1 : x[i]; + borrow = y[i] > x_tmp || (borrow && x[i] == 0); + dest[i] = x_tmp - y[i]; + } + if (xlen > ylen) { + const uint64_t yext = ysigned && int64_t(y[ylen-1])<0 ? -1 : 0; + for (i=ylen; i< xlen && i < destlen; i++) { + uint64_t x_tmp = borrow ? x[i] - 1 : x[i]; + borrow = yext > x_tmp || (borrow && x[i] == 0); + dest[i] = x_tmp - yext; + } + } else if (ylen> xlen) { + const uint64_t xext = xsigned && int64_t(x[xlen-1])<0 ? -1 : 0; + for (i=xlen; i< ylen && i < destlen; i++) { + uint64_t x_tmp = borrow ? xext - 1 : xext; + borrow = y[i] > x_tmp || (borrow && xext==0); + dest[i] = x_tmp - y[i]; + } + } + return borrow; +} +#endif + +/// Subtracts the RHS ap_private from this ap_private +/// @returns this, after subtraction +/// @brief Subtraction assignment operator. + +#if 0 +/// Multiplies an integer array, x by a a uint64_t integer and places the result +/// into dest. +/// @returns the carry out of the multiplication. +/// @brief Multiply a multi-digit ap_private by a single digit (64-bit) integer. +static uint64_t mul_1(uint64_t dest[], const uint64_t x[], uint32_t len, uint64_t y) { + // Split y into high 32-bit part (hy) and low 32-bit part (ly) + uint64_t ly = y & 0xffffffffULL, hy = (y) >> 32; + uint64_t carry = 0; + static const uint64_t two_power_32 = 1ULL << 32; + // For each digit of x. + for (uint32_t i = 0; i < len; ++i) { + // Split x into high and low words + uint64_t lx = x[i] & 0xffffffffULL; + uint64_t hx = (x[i]) >> 32; + // hasCarry - A flag to indicate if there is a carry to the next digit. + // hasCarry == 0, no carry + // hasCarry == 1, has carry + // hasCarry == 2, no carry and the calculation result == 0. + uint8_t hasCarry = 0; + dest[i] = carry + lx * ly; + // Determine if the add above introduces carry. + hasCarry = (dest[i] < carry) ? 1 : 0; + carry = hx * ly + ((dest[i]) >> 32) + (hasCarry ? two_power_32 : 0); + // The upper limit of carry can be (2^32 - 1)(2^32 - 1) + + // (2^32 - 1) + 2^32 = 2^64. + hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0); + + carry += (lx * hy) & 0xffffffffULL; + dest[i] = ((carry) << 32) | (dest[i] & 0xffffffffULL); + carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? two_power_32 : 0) + + ((carry) >> 32) + ((lx * hy) >> 32) + hx * hy; + } + return carry; +} +#endif + +#if 0 +/// Multiplies integer array x by integer array y and stores the result into +/// the integer array dest. Note that dest's size must be >= xlen + ylen. +/// @brief Generalized multiplicate of integer arrays. +static void mul(uint64_t dest[], const uint64_t x[], uint32_t xlen, const uint64_t y[], + uint32_t ylen, uint32_t destlen) { + dest[xlen] = mul_1(dest, x, xlen, y[0]); + for (uint32_t i = 1; i < ylen; ++i) { + uint64_t ly = y[i] & 0xffffffffULL, hy = (y[i]) >> 32; + uint64_t carry = 0, lx = 0, hx = 0; + for (uint32_t j = 0; j < xlen; ++j) { + lx = x[j] & 0xffffffffULL; + hx = (x[j]) >> 32; + // hasCarry - A flag to indicate if has carry. + // hasCarry == 0, no carry + // hasCarry == 1, has carry + // hasCarry == 2, no carry and the calculation result == 0. + uint8_t hasCarry = 0; + uint64_t resul = carry + lx * ly; + hasCarry = (resul < carry) ? 1 : 0; + carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + ((resul) >> 32); + hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0); + carry += (lx * hy) & 0xffffffffULL; + resul = ((carry) << 32) | (resul & 0xffffffffULL); + dest[i+j] += resul; + carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+ + ((carry) >> 32) + (dest[i+j] < resul ? 1 : 0) + + ((lx * hy) >> 32) + hx * hy; + } + dest[i+xlen] = carry; + } +} +#endif + + + +template +uint32_t ap_private<_AP_W, _AP_S, _AP_N>::getBitsNeeded(const char* str, uint32_t slen, uint8_t radix) { + assert(str != 0 && "Invalid value string"); + assert(slen > 0 && "Invalid string length"); + + // Each computation below needs to know if its negative + uint32_t isNegative = str[0] == '-'; + if (isNegative) { + slen--; + str++; + } + // For radixes of power-of-two values, the bits required is accurately and + // easily computed + if (radix == 2) + return slen + isNegative; + if (radix == 8) + return slen * 3 + isNegative; + if (radix == 16) + return slen * 4 + isNegative; + + // Otherwise it must be radix == 10, the hard case + assert(radix == 10 && "Invalid radix"); + + // Convert to the actual binary value. + //ap_private<_AP_W, _AP_S, _AP_N> tmp(sufficient, str, slen, radix); + + // Compute how many bits are required. + //return isNegative + tmp.logBase2() + 1; + return isNegative + slen * 4; +} + +template +uint32_t ap_private<_AP_W, _AP_S, _AP_N>::countLeadingZeros() const { + enum { msw_bits = (BitWidth % APINT_BITS_PER_WORD)?(BitWidth % APINT_BITS_PER_WORD):APINT_BITS_PER_WORD, + excessBits = APINT_BITS_PER_WORD - msw_bits }; + uint32_t Count = CountLeadingZeros_64(pVal[_AP_N-1]); + if (Count>=excessBits) + Count -= excessBits; + if (!pVal[_AP_N-1]) { + for (uint32_t i = _AP_N-1 ; i ; --i) { + if (!pVal[i-1]) + Count += APINT_BITS_PER_WORD; + else { + Count += CountLeadingZeros_64(pVal[i-1]); + break; + } + } + } + return Count; +} + +static uint32_t countLeadingOnes_64(uint64_t __V, uint32_t skip) { + uint32_t Count = 0; + if (skip) + (__V) <<= (skip); + while (__V && (__V & (1ULL << 63))) { + Count++; + (__V) <<= 1; + } + return Count; +} + +template +uint32_t ap_private<_AP_W, _AP_S, _AP_N>::countLeadingOnes() const { + if (isSingleWord()) + return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth); + + uint32_t highWordBits = BitWidth % APINT_BITS_PER_WORD; + uint32_t shift = (highWordBits == 0 ? 0 : APINT_BITS_PER_WORD - highWordBits); + int i = _AP_N - 1; + uint32_t Count = countLeadingOnes_64(pVal[i], shift); + if (Count == highWordBits) { + for (i--; i >= 0; --i) { + if (pVal[i] == ~0ULL) + Count += APINT_BITS_PER_WORD; + else { + Count += countLeadingOnes_64(pVal[i], 0); + break; + } + } + } + return Count; +} + +template +INLINE uint32_t ap_private<_AP_W, _AP_S, _AP_N>::countTrailingZeros() const { + if (isSingleWord()) + return AESL_std::min(uint32_t(CountTrailingZeros_64(VAL)), BitWidth); + uint32_t Count = 0; + uint32_t i = 0; + for (; i < _AP_N && pVal[i] == 0; ++i) + Count += APINT_BITS_PER_WORD; + if (i < _AP_N) + Count += CountTrailingZeros_64(pVal[i]); + return AESL_std::min(Count, BitWidth); +} + +template +ap_private<_AP_W, _AP_S, _AP_N> ap_private<_AP_W, _AP_S, _AP_N>::byteSwap() const { + assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!"); + if (BitWidth == 16) + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ ByteSwap_16(uint16_t(VAL))); + else if (BitWidth == 32) + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ ByteSwap_32(uint32_t(VAL))); + else if (BitWidth == 48) { + uint32_t Tmp1 = uint32_t((VAL) >> 16); + Tmp1 = ByteSwap_32(Tmp1); + uint16_t Tmp2 = uint16_t(VAL); + Tmp2 = ByteSwap_16(Tmp2); + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ ((uint64_t(Tmp2)) << 32) | Tmp1); + } else if (BitWidth == 64) + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ ByteSwap_64(VAL)); + else { + ap_private<_AP_W, _AP_S, _AP_N> Result(0); + char *pByte = (char*)Result.pVal; + for (uint32_t i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) { + char Tmp = pByte[i]; + pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i]; + pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp; + } + return Result; + } +} + +template +ap_private<_AP_W, _AP_S, _AP_N> ap_private_ops::GreatestCommonDivisor(const ap_private<_AP_W, _AP_S, _AP_N>& API1, const ap_private<_AP_W, _AP_S, _AP_N>& API2) { + ap_private<_AP_W, _AP_S, _AP_N> __A = API1, __B = API2; + while (!!__B) { + ap_private<_AP_W, _AP_S, _AP_N> __T = __B; + __B = ap_private_ops::urem(__A, __B); + __A = __T; + } + return __A; +} + +template +ap_private<_AP_W, _AP_S, _AP_N> ap_private_ops::RoundDoubleToap_private(double Double, uint32_t width) { + union { + double __D; + uint64_t __I; + } __T; + __T.__D = Double; + + // Get the sign bit from the highest order bit + bool isNeg = (__T.__I) >> 63; + + // Get the 11-bit exponent and adjust for the 1023 bit bias + int64_t exp = (((__T.__I) >> 52) & 0x7ffULL) - 1023; + + // If the exponent is negative, the value is < 0 so just return 0. + if (exp < 0) + return ap_private<_AP_W, _AP_S, _AP_N>(width, 0u); + + // Extract the mantissa by clearing the top 12 bits (sign + exponent). + uint64_t mantissa = (__T.__I & (~0ULL >> 12)) | 1ULL << 52; + + // If the exponent doesn't shift all bits out of the mantissa + if (exp < 52) + return isNeg ? -ap_private<_AP_W, _AP_S, _AP_N>(width, (mantissa) >> (52 - exp)) : + ap_private<_AP_W, _AP_S, _AP_N>((mantissa) >> (52 - exp)); + + // If the client didn't provide enough bits for us to shift the mantissa into + // then the result is undefined, just return 0 + if (width <= exp - 52) + return ap_private<_AP_W, _AP_S, _AP_N>(width, 0); + + // Otherwise, we have to shift the mantissa bits up to the right location + ap_private<_AP_W, _AP_S, _AP_N> Tmp(width, mantissa); + Tmp = Tmp.shl(exp - 52); + return isNeg ? -Tmp : Tmp; +} + +/// RoundToDouble - This function convert this ap_private to a double. +/// The layout for double is as following (IEEE Standard 754): +/// -------------------------------------- +/// | Sign Exponent Fraction Bias | +/// |-------------------------------------- | +/// | 1[63] 11[62-52] 52[51-00] 1023 | +/// -------------------------------------- +template +double ap_private<_AP_W, _AP_S, _AP_N>::roundToDouble(bool isSigned) const { + + // Handle the simple case where the value is contained in one uint64_t. + if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) { + uint64_t val; + if (isSingleWord()) val = VAL; + else val = pVal[0]; + if (isSigned) { + int64_t sext = ((int64_t(val)) << (64-BitWidth)) >> (64-BitWidth); + return double(sext); + } else + return double(val); + } + + // Determine if the value is negative. + bool isNeg = isSigned ? (*this)[BitWidth-1] : false; + + // Construct the absolute value if we're negative. + ap_private<_AP_W, _AP_S, _AP_N> Tmp(isNeg ? -(*this) : (*this)); + + // Figure out how many bits we're using. + uint32_t n = Tmp.getActiveBits(); + + // The exponent (without bias normalization) is just the number of bits + // we are using. Note that the sign bit is gone since we constructed the + // absolute value. + uint64_t exp = n; + + // Return infinity for exponent overflow + if (exp > 1023) { + if (!isSigned || !isNeg) + return std::numeric_limits::infinity(); + else + return -std::numeric_limits::infinity(); + } + exp += 1023; // Increment for 1023 bias + + // Number of bits in mantissa is 52. To obtain the mantissa value, we must + // extract the high 52 bits from the correct words in pVal. + uint64_t mantissa; + unsigned hiWord = whichWord(n-1); + if (hiWord == 0) { + mantissa = Tmp.pVal[0]; + if (n > 52) + (mantissa) >>= (n - 52); // shift down, we want the top 52 bits. + } else { + assert(hiWord > 0 && "High word is negative?"); + uint64_t hibits = (Tmp.pVal[hiWord]) << (52 - n % APINT_BITS_PER_WORD); + uint64_t lobits = (Tmp.pVal[hiWord-1]) >> (11 + n % APINT_BITS_PER_WORD); + mantissa = hibits | lobits; + } + + // The leading bit of mantissa is implicit, so get rid of it. + uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0; + union { + double __D; + uint64_t __I; + } __T; + __T.__I = sign | ((exp) << 52) | mantissa; + return __T.__D; +} + +// Square Root - this method computes and returns the square root of "this". +// Three mechanisms are used for computation. For small values (<= 5 bits), +// a table lookup is done. This gets some performance for common cases. For +// values using less than 52 bits, the value is converted to double and then +// the libc sqrt function is called. The result is rounded and then converted +// back to a uint64_t which is then used to construct the result. Finally, +// the Babylonian method for computing square roots is used. +template +ap_private<_AP_W, _AP_S, _AP_N> ap_private<_AP_W, _AP_S, _AP_N>::sqrt() const { + + // Determine the magnitude of the value. + uint32_t magnitude = getActiveBits(); + + // Use a fast table for some small values. This also gets rid of some + // rounding errors in libc sqrt for small values. + if (magnitude <= 5) { + static const uint8_t results[32] = { + /* 0 */ 0, + /* 1- 2 */ 1, 1, + /* 3- 6 */ 2, 2, 2, 2, + /* 7-12 */ 3, 3, 3, 3, 3, 3, + /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4, + /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + /* 31 */ 6 + }; + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ results[ (isSingleWord() ? VAL : pVal[0]) ]); + } + + // If the magnitude of the value fits in less than 52 bits (the precision of + // an IEEE double precision floating point value), then we can use the + // libc sqrt function which will probably use a hardware sqrt computation. + // This should be faster than the algorithm below. + if (magnitude < 52) { +#ifdef _MSC_VER + // Amazingly, VC++ doesn't have round(). + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ + uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5); +#else + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ + uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0]))))); +#endif + } + + // Okay, all the short cuts are exhausted. We must compute it. The following + // is a classical Babylonian method for computing the square root. This code + // was adapted to APINt from a wikipedia article on such computations. + // See http://www.wikipedia.org/ and go to the page named + // Calculate_an_integer_square_root. + uint32_t nbits = BitWidth, i = 4; + ap_private<_AP_W, _AP_S, _AP_N> testy(16); + ap_private<_AP_W, _AP_S, _AP_N> x_old(/*BitWidth,*/ 1); + ap_private<_AP_W, _AP_S, _AP_N> x_new(0); + ap_private<_AP_W, _AP_S, _AP_N> two(/*BitWidth,*/ 2); + + // Select a good starting value using binary logarithms. + for (;; i += 2, testy = testy.shl(2)) + if (i >= nbits || this->ule(testy)) { + x_old = x_old.shl(i / 2); + break; + } + + // Use the Babylonian method to arrive at the integer square root: + for (;;) { + x_new = (this->udiv(x_old) + x_old).udiv(two); + if (x_old.ule(x_new)) + break; + x_old = x_new; + } + + // Make sure we return the closest approximation + // NOTE: The rounding calculation below is correct. It will produce an + // off-by-one discrepancy with results from pari/gp. That discrepancy has been + // determined to be a rounding issue with pari/gp as it begins to use a + // floating point representation after 192 bits. There are no discrepancies + // between this algorithm and pari/gp for bit widths < 192 bits. + ap_private<_AP_W, _AP_S, _AP_N> square(x_old * x_old); + ap_private<_AP_W, _AP_S, _AP_N> nextSquare((x_old + 1) * (x_old +1)); + if (this->ult(square)) + return x_old; + else if (this->ule(nextSquare)) { + ap_private<_AP_W, _AP_S, _AP_N> midpoint((nextSquare - square).udiv(two)); + ap_private<_AP_W, _AP_S, _AP_N> offset(*this - square); + if (offset.ult(midpoint)) + return x_old; + else + return x_old + 1; + } else + assert(0 && "Error in ap_private<_AP_W, _AP_S, _AP_N>::sqrt computation"); + return x_old + 1; +} + +/// Implementation of Knuth's Algorithm D (Division of nonnegative integers) +/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The +/// variables here have the same names as in the algorithm. Comments explain +/// the algorithm and any deviation from it. +static void KnuthDiv(uint32_t *u, uint32_t *v, uint32_t *q, uint32_t* r, + uint32_t m, uint32_t n) { + assert(u && "Must provide dividend"); + assert(v && "Must provide divisor"); + assert(q && "Must provide quotient"); + assert(u != v && u != q && v != q && "Must us different memory"); + assert(n>1 && "n must be > 1"); + + // Knuth uses the value b as the base of the number system. In our case b + // is 2^31 so we just set it to -1u. + uint64_t b = uint64_t(1) << 32; + + //DEBUG(cerr << "KnuthDiv: m=" << m << " n=" << n << '\n'); + //DEBUG(cerr << "KnuthDiv: original:"); + //DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]); + //DEBUG(cerr << " by"); + //DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]); + //DEBUG(cerr << '\n'); + // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of + // u and v by d. Note that we have taken Knuth's advice here to use a power + // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of + // 2 allows us to shift instead of multiply and it is easy to determine the + // shift amount from the leading zeros. We are basically normalizing the u + // and v so that its high bits are shifted to the top of v's range without + // overflow. Note that this can require an extra word in u so that u must + // be of length m+n+1. + uint32_t shift = CountLeadingZeros_32(v[n-1]); + uint32_t v_carry = 0; + uint32_t u_carry = 0; + if (shift) { + for (uint32_t i = 0; i < m+n; ++i) { + uint32_t u_tmp = (u[i]) >> (32 - shift); + u[i] = ((u[i]) << (shift)) | u_carry; + u_carry = u_tmp; + } + for (uint32_t i = 0; i < n; ++i) { + uint32_t v_tmp = (v[i]) >> (32 - shift); + v[i] = ((v[i]) << (shift)) | v_carry; + v_carry = v_tmp; + } + } + u[m+n] = u_carry; + //DEBUG(cerr << "KnuthDiv: normal:"); + //DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]); + //DEBUG(cerr << " by"); + //DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]); + //DEBUG(cerr << '\n'); + + // D2. [Initialize j.] Set j to m. This is the loop counter over the places. + int j = m; + do { + //DEBUG(cerr << "KnuthDiv: quotient digit #" << j << '\n'); + // D3. [Calculate q'.]. + // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q') + // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r') + // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease + // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test + // on v[n-2] determines at high speed most of the cases in which the trial + // value qp is one too large, and it eliminates all cases where qp is two + // too large. + uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]); + //DEBUG(cerr << "KnuthDiv: dividend == " << dividend << '\n'); + uint64_t qp = dividend / v[n-1]; + uint64_t rp = dividend % v[n-1]; + if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) { + qp--; + rp += v[n-1]; + if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2])) + qp--; + } + //DEBUG(cerr << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n'); + + // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with + // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation + // consists of a simple multiplication by a one-place number, combined with + // a subtraction. + bool isNeg = false; + for (uint32_t i = 0; i < n; ++i) { + uint64_t u_tmp = uint64_t(u[j+i]) | ((uint64_t(u[j+i+1])) << 32); + uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]); + bool borrow = subtrahend > u_tmp; + /*DEBUG(cerr << "KnuthDiv: u_tmp == " << u_tmp + << ", subtrahend == " << subtrahend + << ", borrow = " << borrow << '\n');*/ + + uint64_t result = u_tmp - subtrahend; + uint32_t k = j + i; + u[k++] = (uint32_t)(result & (b-1)); // subtract low word + u[k++] = (uint32_t)((result) >> 32); // subtract high word + while (borrow && k <= m+n) { // deal with borrow to the left + borrow = u[k] == 0; + u[k]--; + k++; + } + isNeg |= borrow; + /*DEBUG(cerr << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " << + u[j+i+1] << '\n');*/ + } + /*DEBUG(cerr << "KnuthDiv: after subtraction:"); + DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]); + DEBUG(cerr << '\n');*/ + // The digits (u[j+n]...u[j]) should be kept positive; if the result of + // this step is actually negative, (u[j+n]...u[j]) should be left as the + // true value plus b**(n+1), namely as the b's complement of + // the true value, and a "borrow" to the left should be remembered. + // + if (isNeg) { + bool carry = true; // true because b's complement is "complement + 1" + for (uint32_t i = 0; i <= m+n; ++i) { + u[i] = ~u[i] + carry; // b's complement + carry = carry && u[i] == 0; + } + } + /*DEBUG(cerr << "KnuthDiv: after complement:"); + DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]); + DEBUG(cerr << '\n');*/ + + // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was + // negative, go to step D6; otherwise go on to step D7. + q[j] = (uint32_t)qp; + if (isNeg) { + // D6. [Add back]. The probability that this step is necessary is very + // small, on the order of only 2/b. Make sure that test data accounts for + // this possibility. Decrease q[j] by 1 + q[j]--; + // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]). + // A carry will occur to the left of u[j+n], and it should be ignored + // since it cancels with the borrow that occurred in D4. + bool carry = false; + for (uint32_t i = 0; i < n; i++) { + uint32_t limit = AESL_std::min(u[j+i],v[i]); + u[j+i] += v[i] + carry; + carry = u[j+i] < limit || (carry && u[j+i] == limit); + } + u[j+n] += carry; + } + /*DEBUG(cerr << "KnuthDiv: after correction:"); + DEBUG(for (int i = m+n; i >=0; i--) cerr <<" " << u[i]); + DEBUG(cerr << "\nKnuthDiv: digit result = " << q[j] << '\n');*/ + + // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3. + } while (--j >= 0); + + /*DEBUG(cerr << "KnuthDiv: quotient:"); + DEBUG(for (int i = m; i >=0; i--) cerr <<" " << q[i]); + DEBUG(cerr << '\n');*/ + + // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired + // remainder may be obtained by dividing u[...] by d. If r is non-null we + // compute the remainder (urem uses this). + if (r) { + // The value d is expressed by the "shift" value above since we avoided + // multiplication by d by using a shift left. So, all we have to do is + // shift right here. In order to mak + if (shift) { + uint32_t carry = 0; + //DEBUG(cerr << "KnuthDiv: remainder:"); + for (int i = n-1; i >= 0; i--) { + r[i] = ((u[i]) >> (shift)) | carry; + carry = (u[i]) << (32 - shift); + //DEBUG(cerr << " " << r[i]); + } + } else { + for (int i = n-1; i >= 0; i--) { + r[i] = u[i]; + //DEBUG(cerr << " " << r[i]); + } + } + //DEBUG(cerr << '\n'); + } + //DEBUG(cerr << std::setbase(10) << '\n'); +} + +template +void divide(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t lhsWords, + const ap_private<_AP_W, _AP_S, _AP_N>& RHS, uint32_t rhsWords, + ap_private<_AP_W, _AP_S, _AP_N> *Quotient, ap_private<_AP_W, _AP_S, _AP_N> *Remainder) { + assert(lhsWords >= rhsWords && "Fractional result"); + enum {APINT_BITS_PER_WORD=64}; + // First, compose the values into an array of 32-bit words instead of + // 64-bit words. This is a necessity of both the "short division" algorithm + // and the the Knuth "classical algorithm" which requires there to be native + // operations for +, -, and * on an m bit value with an m*2 bit result. We + // can't use 64-bit operands here because we don't have native results of + // 128-bits. Furthremore, casting the 64-bit values to 32-bit values won't + // work on large-endian machines. + uint64_t mask = ~0ull >> (sizeof(uint32_t)*8); + uint32_t n = rhsWords * 2; + uint32_t m = (lhsWords * 2) - n; + + // Allocate space for the temporary values we need either on the stack, if + // it will fit, or on the heap if it won't. + uint32_t SPACE[128]; + uint32_t *__U = 0; + uint32_t *__V = 0; + uint32_t *__Q = 0; + uint32_t *__R = 0; + if ((Remainder?4:3)*n+2*m+1 <= 128) { + __U = &SPACE[0]; + __V = &SPACE[m+n+1]; + __Q = &SPACE[(m+n+1) + n]; + if (Remainder) + __R = &SPACE[(m+n+1) + n + (m+n)]; + } else { + __U = new uint32_t[m + n + 1]; + __V = new uint32_t[n]; + __Q = new uint32_t[m+n]; + if (Remainder) + __R = new uint32_t[n]; + } + + // Initialize the dividend + memset(__U, 0, (m+n+1)*sizeof(uint32_t)); + for (unsigned i = 0; i < lhsWords; ++i) { + uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]); + __U[i * 2] = (uint32_t)(tmp & mask); + __U[i * 2 + 1] = (tmp) >> (sizeof(uint32_t)*8); + } + __U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm. + + // Initialize the divisor + memset(__V, 0, (n)*sizeof(uint32_t)); + for (unsigned i = 0; i < rhsWords; ++i) { + uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]); + __V[i * 2] = (uint32_t)(tmp & mask); + __V[i * 2 + 1] = (tmp) >> (sizeof(uint32_t)*8); + } + + // initialize the quotient and remainder + memset(__Q, 0, (m+n) * sizeof(uint32_t)); + if (Remainder) + memset(__R, 0, n * sizeof(uint32_t)); + + // Now, adjust m and n for the Knuth division. n is the number of words in + // the divisor. m is the number of words by which the dividend exceeds the + // divisor (i.e. m+n is the length of the dividend). These sizes must not + // contain any zero words or the Knuth algorithm fails. + for (unsigned i = n; i > 0 && __V[i-1] == 0; i--) { + n--; + m++; + } + for (unsigned i = m+n; i > 0 && __U[i-1] == 0; i--) + m--; + + // If we're left with only a single word for the divisor, Knuth doesn't work + // so we implement the short division algorithm here. This is much simpler + // and faster because we are certain that we can divide a 64-bit quantity + // by a 32-bit quantity at hardware speed and short division is simply a + // series of such operations. This is just like doing short division but we + // are using base 2^32 instead of base 10. + assert(n != 0 && "Divide by zero?"); + if (n == 1) { + uint32_t divisor = __V[0]; + uint32_t remainder = 0; + for (int i = m+n-1; i >= 0; i--) { + uint64_t partial_dividend = (uint64_t(remainder)) << 32 | __U[i]; + if (partial_dividend == 0) { + __Q[i] = 0; + remainder = 0; + } else if (partial_dividend < divisor) { + __Q[i] = 0; + remainder = (uint32_t)partial_dividend; + } else if (partial_dividend == divisor) { + __Q[i] = 1; + remainder = 0; + } else { + __Q[i] = (uint32_t)(partial_dividend / divisor); + remainder = (uint32_t)(partial_dividend - (__Q[i] * divisor)); + } + } + if (__R) + __R[0] = remainder; + } else { + // Now we're ready to invoke the Knuth classical divide algorithm. In this + // case n > 1. + KnuthDiv(__U, __V, __Q, __R, m, n); + } + + // If the caller wants the quotient + if (Quotient) { + // Set up the Quotient value's memory. + if (Quotient->BitWidth != LHS.BitWidth) { + if (Quotient->isSingleWord()) + Quotient->VAL = 0; + } else + Quotient->clear(); + + // The quotient is in Q. Reconstitute the quotient into Quotient's low + // order words. + if (lhsWords == 1) { + uint64_t tmp = + uint64_t(__Q[0]) | ((uint64_t(__Q[1])) << (APINT_BITS_PER_WORD / 2)); + if (Quotient->isSingleWord()) + Quotient->VAL = tmp; + else + Quotient->pVal[0] = tmp; + } else { + assert(!Quotient->isSingleWord() && "Quotient ap_private not large enough"); + for (unsigned i = 0; i < lhsWords; ++i) + Quotient->pVal[i] = + uint64_t(__Q[i*2]) | ((uint64_t(__Q[i*2+1])) << (APINT_BITS_PER_WORD / 2)); + } + Quotient->clearUnusedBits(); + } + + // If the caller wants the remainder + if (Remainder) { + // Set up the Remainder value's memory. + if (Remainder->BitWidth != RHS.BitWidth) { + if (Remainder->isSingleWord()) + Remainder->VAL = 0; + } else + Remainder->clear(); + + // The remainder is in R. Reconstitute the remainder into Remainder's low + // order words. + if (rhsWords == 1) { + uint64_t tmp = + uint64_t(__R[0]) | ((uint64_t(__R[1])) << (APINT_BITS_PER_WORD / 2)); + if (Remainder->isSingleWord()) + Remainder->VAL = tmp; + else + Remainder->pVal[0] = tmp; + } else { + assert(!Remainder->isSingleWord() && "Remainder ap_private not large enough"); + for (unsigned i = 0; i < rhsWords; ++i) + Remainder->pVal[i] = + uint64_t(__R[i*2]) | ((uint64_t(__R[i*2+1])) << (APINT_BITS_PER_WORD / 2)); + } + Remainder->clearUnusedBits(); + } + + // Clean up the memory we allocated. + if (__U != &SPACE[0]) { + delete [] __U; + delete [] __V; + delete [] __Q; + delete [] __R; + } +} + + +template +void ap_private<_AP_W, _AP_S, _AP_N>::fromString(const char *str, uint32_t slen, uint8_t radix) { + enum { numbits=_AP_W}; + // Check our assumptions here + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + assert(str && "String is null?"); + bool isNeg = str[0] == '-'; + if (isNeg) + str++, slen--; + + //skip any leading zero + while(*str == '0' && *(str+1) != '\0') {str++; slen--;} + assert((slen <= numbits || radix != 2) && "Insufficient bit width"); + assert(((slen - 1)*3 <= numbits || radix != 8) && "Insufficient bit width"); + assert(((slen - 1)*4 <= numbits || radix != 16) && "Insufficient bit width"); + assert((((slen -1)*64)/22 <= numbits || radix != 10) && "Insufficient bit width"); + + memset(pVal, 0, _AP_N * sizeof(uint64_t)); + + // Figure out if we can shift instead of multiply + uint32_t shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0); + + // Set up an ap_private for the digit to add outside the loop so we don't + // constantly construct/destruct it. + uint64_t bigVal[_AP_N]; + memset(bigVal, 0, _AP_N * sizeof(uint64_t)); + ap_private<_AP_W, _AP_S, _AP_N> apdigit(getBitWidth(), bigVal); + ap_private<_AP_W, _AP_S, _AP_N> apradix(radix); + + // Enter digit traversal loop + for (unsigned i = 0; i < slen; i++) { + // Get a digit + uint32_t digit = 0; + char cdigit = str[i]; + if (radix == 16) { +#define isxdigit(c) (((c) >= '0' && (c) <= '9') || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) +#define isdigit(c) ((c) >= '0' && (c) <= '9') + if (!isxdigit(cdigit)) + assert(0 && "Invalid hex digit in string"); + if (isdigit(cdigit)) + digit = cdigit - '0'; + else if (cdigit >= 'a') + digit = cdigit - 'a' + 10; + else if (cdigit >= 'A') + digit = cdigit - 'A' + 10; + else + assert(0 && "huh? we shouldn't get here"); + } else if (isdigit(cdigit)) { + digit = cdigit - '0'; + } else { + assert(0 && "Invalid character in digit string"); + } +#undef isxdigit +#undef isdigit + // Shift or multiply the value by the radix + if (shift) + *this <<= shift; + else + *this *= apradix; + + // Add in the digit we just interpreted + if (apdigit.isSingleWord()) + apdigit.VAL = digit; + else + apdigit.pVal[0] = digit; + *this += apdigit; + } + // If its negative, put it in two's complement form + if (isNeg) { + (*this)--; + this->flip(); + } + clearUnusedBits(); +} + +template +std::string ap_private<_AP_W, _AP_S, _AP_N>::toString(uint8_t radix, bool wantSigned) const { + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + static const char *digits[] = { + "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F" + }; + std::string result; + uint32_t bits_used = getActiveBits(); + + if (radix != 10) { + // For the 2, 8 and 16 bit cases, we can just shift instead of divide + // because the number of bits per digit (1,3 and 4 respectively) divides + // equaly. We just shift until there value is zero. + + // First, check for a zero value and just short circuit the logic below. + if (*this == (uint64_t)(0)) + result = "0"; + else { + ap_private<_AP_W, false, _AP_N> tmp(*this); + size_t insert_at = 0; + if (wantSigned && isNegative()) { + // They want to print the signed version and it is a negative value + // Flip the bits and add one to turn it into the equivalent positive + // value and put a '-' in the result. + tmp.flip(); + tmp++; + tmp.clearUnusedBitsToZero(); + result = "-"; + insert_at = 1; + } + // Just shift tmp right for each digit width until it becomes zero + uint32_t shift = (radix == 16 ? 4 : (radix == 8 ? 3 : 1)); + uint64_t mask = radix - 1; + ap_private<_AP_W, false, _AP_N> zero(0); + while (tmp.ne(zero)) { + unsigned digit = (tmp.isSingleWord() ? tmp.VAL : tmp.pVal[0]) & mask; + result.insert(insert_at, digits[digit]); + tmp = tmp.lshr(shift); + } + } + return result; + } + + ap_private<_AP_W, false, _AP_N> tmp(*this); + ap_private<_AP_W, false, _AP_N> divisor(radix); + ap_private<_AP_W, false, _AP_N> zero(0); + size_t insert_at = 0; + if (wantSigned && isNegative()) { + // They want to print the signed version and it is a negative value + // Flip the bits and add one to turn it into the equivalent positive + // value and put a '-' in the result. + tmp.flip(); + tmp++; + tmp.clearUnusedBitsToZero(); + result = "-"; + insert_at = 1; + } + if (tmp == ap_private<_AP_W, false, _AP_N>(0)) + result = "0"; + else while (tmp.ne(zero)) { + ap_private<_AP_W, false, _AP_N> APdigit(0); + ap_private<_AP_W, false, _AP_N> tmp2(0); + divide(tmp, tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2, + &APdigit); + uint32_t digit = APdigit.getZExtValue(); + assert(digit < radix && "divide failed"); + result.insert(insert_at,digits[digit]); + tmp = tmp2; + } + + return result; +} + +// This implements a variety of operations on a representation of +// arbitrary precision, two's-complement, bignum integer values. + +/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe + and unrestricting assumption. */ + +/* Some handy functions local to this file. */ + +template +void divide(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t lhsWords, + uint64_t RHS, + ap_private<_AP_W, _AP_S, _AP_N> *Quotient, ap_private<_AP_W, _AP_S, _AP_N> *Remainder) { + uint32_t rhsWords=1; + assert(lhsWords >= rhsWords && "Fractional result"); + enum {APINT_BITS_PER_WORD=64}; + // First, compose the values into an array of 32-bit words instead of + // 64-bit words. This is a necessity of both the "short division" algorithm + // and the the Knuth "classical algorithm" which requires there to be native + // operations for +, -, and * on an m bit value with an m*2 bit result. We + // can't use 64-bit operands here because we don't have native results of + // 128-bits. Furthremore, casting the 64-bit values to 32-bit values won't + // work on large-endian machines. + uint64_t mask = ~0ull >> (sizeof(uint32_t)*8); + uint32_t n = 2; + uint32_t m = (lhsWords * 2) - n; + + // Allocate space for the temporary values we need either on the stack, if + // it will fit, or on the heap if it won't. + uint32_t SPACE[128]; + uint32_t *__U = 0; + uint32_t *__V = 0; + uint32_t *__Q = 0; + uint32_t *__R = 0; + if ((Remainder?4:3)*n+2*m+1 <= 128) { + __U = &SPACE[0]; + __V = &SPACE[m+n+1]; + __Q = &SPACE[(m+n+1) + n]; + if (Remainder) + __R = &SPACE[(m+n+1) + n + (m+n)]; + } else { + __U = new uint32_t[m + n + 1]; + __V = new uint32_t[n]; + __Q = new uint32_t[m+n]; + if (Remainder) + __R = new uint32_t[n]; + } + + // Initialize the dividend + memset(__U, 0, (m+n+1)*sizeof(uint32_t)); + for (unsigned i = 0; i < lhsWords; ++i) { + uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]); + __U[i * 2] = tmp & mask; + __U[i * 2 + 1] = (tmp) >> (sizeof(uint32_t)*8); + } + __U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm. + + // Initialize the divisor + memset(__V, 0, (n)*sizeof(uint32_t)); + __V[0] = RHS & mask; + __V[1] = (RHS) >> (sizeof(uint32_t)*8); + + // initialize the quotient and remainder + memset(__Q, 0, (m+n) * sizeof(uint32_t)); + if (Remainder) + memset(__R, 0, n * sizeof(uint32_t)); + + // Now, adjust m and n for the Knuth division. n is the number of words in + // the divisor. m is the number of words by which the dividend exceeds the + // divisor (i.e. m+n is the length of the dividend). These sizes must not + // contain any zero words or the Knuth algorithm fails. + for (unsigned i = n; i > 0 && __V[i-1] == 0; i--) { + n--; + m++; + } + for (unsigned i = m+n; i > 0 && __U[i-1] == 0; i--) + m--; + + // If we're left with only a single word for the divisor, Knuth doesn't work + // so we implement the short division algorithm here. This is much simpler + // and faster because we are certain that we can divide a 64-bit quantity + // by a 32-bit quantity at hardware speed and short division is simply a + // series of such operations. This is just like doing short division but we + // are using base 2^32 instead of base 10. + assert(n != 0 && "Divide by zero?"); + if (n == 1) { + uint32_t divisor = __V[0]; + uint32_t remainder = 0; + for (int i = m+n-1; i >= 0; i--) { + uint64_t partial_dividend = (uint64_t(remainder)) << 32 | __U[i]; + if (partial_dividend == 0) { + __Q[i] = 0; + remainder = 0; + } else if (partial_dividend < divisor) { + __Q[i] = 0; + remainder = partial_dividend; + } else if (partial_dividend == divisor) { + __Q[i] = 1; + remainder = 0; + } else { + __Q[i] = partial_dividend / divisor; + remainder = partial_dividend - (__Q[i] * divisor); + } + } + if (__R) + __R[0] = remainder; + } else { + // Now we're ready to invoke the Knuth classical divide algorithm. In this + // case n > 1. + KnuthDiv(__U, __V, __Q, __R, m, n); + } + + // If the caller wants the quotient + if (Quotient) { + // Set up the Quotient value's memory. + if (Quotient->BitWidth != LHS.BitWidth) { + if (Quotient->isSingleWord()) + Quotient->VAL = 0; + else + delete [] Quotient->pVal; + } else + Quotient->clear(); + + // The quotient is in Q. Reconstitute the quotient into Quotient's low + // order words. + if (lhsWords == 1) { + uint64_t tmp = + uint64_t(__Q[0]) | ((uint64_t(__Q[1])) << (APINT_BITS_PER_WORD / 2)); + if (Quotient->isSingleWord()) + Quotient->VAL = tmp; + else + Quotient->pVal[0] = tmp; + } else { + assert(!Quotient->isSingleWord() && "Quotient ap_private not large enough"); + for (unsigned i = 0; i < lhsWords; ++i) + Quotient->pVal[i] = + uint64_t(__Q[i*2]) | ((uint64_t(__Q[i*2+1])) << (APINT_BITS_PER_WORD / 2)); + } + Quotient->clearUnusedBits(); + } + + // If the caller wants the remainder + if (Remainder) { + // Set up the Remainder value's memory. + if (Remainder->BitWidth != 64 /* RHS.BitWidth */) { + if (Remainder->isSingleWord()) + Remainder->VAL = 0; + } else + Remainder->clear(); + + // The remainder is in __R. Reconstitute the remainder into Remainder's low + // order words. + if (rhsWords == 1) { + uint64_t tmp = + uint64_t(__R[0]) | ((uint64_t(__R[1])) << (APINT_BITS_PER_WORD / 2)); + if (Remainder->isSingleWord()) + Remainder->VAL = tmp; + else + Remainder->pVal[0] = tmp; + } else { + assert(!Remainder->isSingleWord() && "Remainder ap_private not large enough"); + for (unsigned i = 0; i < rhsWords; ++i) + Remainder->pVal[i] = + uint64_t(__R[i*2]) | ((uint64_t(__R[i*2+1])) << (APINT_BITS_PER_WORD / 2)); + } + Remainder->clearUnusedBits(); + } + + // Clean up the memory we allocated. + if (__U != &SPACE[0]) { + delete [] __U; + delete [] __V; + delete [] __Q; + delete [] __R; + } +} + +//When bitwidth < 64 +template class ap_private <_AP_W, _AP_S, 1> { +#ifdef _MSC_VER +#pragma warning( disable : 4521 4522 ) +#endif +public: + typedef typename retval<_AP_S>::Type ValType; + template + struct RType { + enum { + _AP_N =1, + mult_w = _AP_W+_AP_W2, + mult_s = _AP_S||_AP_S2, //?? why + plus_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2))+1, //shouldn't it be AP_MAX(_AP_W,_AP_W2)+!(_AP_S^_AP_S2)+1 ???? + plus_s = _AP_S||_AP_S2, + minus_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2))+1, + minus_s = true, + div_w = _AP_W+_AP_S2, + div_s = _AP_S||_AP_S2, + mod_w = AP_MIN(_AP_W,_AP_W2+(!_AP_S2&&_AP_S)), + mod_s = _AP_S, + logic_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2)), + logic_s = _AP_S||_AP_S2 + }; + typedef ap_private mult; + typedef ap_private plus; + typedef ap_private minus; + typedef ap_private logic; + typedef ap_private div; + typedef ap_private mod; + typedef ap_private<_AP_W, _AP_S> arg1; + typedef bool reduce; + }; + enum { APINT_BITS_PER_WORD = 64}; + enum { excess_bits = (_AP_W%APINT_BITS_PER_WORD) ? APINT_BITS_PER_WORD -(_AP_W%APINT_BITS_PER_WORD) : 0}; + static const uint64_t mask = ((uint64_t)~0ULL >> (excess_bits)); + static const uint64_t not_mask = ~mask; + static const uint64_t sign_bit_mask = 1ULL << (APINT_BITS_PER_WORD-1); + template struct sign_ext_mask { static const uint64_t mask=~0ULL<<_AP_W1;}; + + enum { BitWidth=_AP_W}; + uint64_t VAL; ///< Used to store the <= 64 bits integer value. + const uint64_t *const pVal; + + INLINE uint32_t getBitWidth() const { + return BitWidth; + } + + template + ap_private<_AP_W, _AP_S, 1>& operator=(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + VAL = RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template + ap_private<_AP_W, _AP_S, 1>& operator=(const volatile ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + VAL = RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template + ap_private<_AP_W, _AP_S, 1>& operator=(const ap_private<_AP_W1, _AP_S1, 1>& RHS) { + VAL = RHS.VAL; + clearUnusedBits(); + return *this; + } + + template + ap_private<_AP_W, _AP_S, 1>& operator=(const volatile ap_private<_AP_W1, _AP_S1, 1>& RHS) { + VAL = RHS.VAL; + clearUnusedBits(); + return *this; + } + + volatile ap_private& operator=(const ap_private& RHS) volatile { + // Don't do anything for X = X + VAL = RHS.VAL; // No need to check because no harm done by copying. + return *this; + } + ap_private& operator=(const ap_private& RHS) { + // Don't do anything for X = X + VAL = RHS.VAL; // No need to check because no harm done by copying. + return *this; + } + + volatile ap_private& operator=(const volatile ap_private& RHS) volatile { + // Don't do anything for X = X + VAL = RHS.VAL; // No need to check because no harm done by copying. + return *this; + } + ap_private& operator=(const volatile ap_private& RHS) { + // Don't do anything for X = X + VAL = RHS.VAL; // No need to check because no harm done by copying. + return *this; + } + + template + INLINE ap_private& operator = (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + *this = ap_private<_AP_W2, false>(op2); + return *this; + } + + explicit INLINE ap_private(uint64_t* val) : VAL(val[0]), pVal(&VAL){ + clearUnusedBits(); + } + + INLINE bool isSingleWord() const { return true; } + + INLINE void fromString(const char *strStart, uint32_t slen, + uint8_t radix, int offset=0) { + // Check our assumptions here + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + assert(strStart && "String is null?"); + strStart+=offset; + switch(radix) { + case 2: + // sscanf(strStart,"%b",&VAL); + VAL = *strStart =='1' ? ~0ULL : 0; + for (;*strStart; ++strStart) { + assert((*strStart=='0'|| *strStart=='1')&&("Wrong binary number") ); + VAL <<=1; + VAL |= (*strStart-'0'); + } + break; + case 8: +#if __WIN32__ + sscanf(strStart,"%I64o",&VAL); +#else + +#if defined __x86_64__ + sscanf(strStart,"%lo",&VAL); +#else + sscanf(strStart,"%llo",&VAL); +#endif + +#endif + break; + case 10: +#if __WIN32__ + sscanf(strStart,"%I64u",&VAL); +#else + +#if defined __x86_64__ + sscanf(strStart,"%lu",&VAL); +#else + sscanf(strStart,"%llu",&VAL); +#endif + +#endif + break; + case 16: +#if __WIN32__ + sscanf(strStart,"%I64x",&VAL); +#else + +#if defined __x86_64__ + sscanf(strStart,"%lx",&VAL); +#else + sscanf(strStart,"%llx",&VAL); +#endif + +#endif + break; + default: + assert(true && "Unknown radix"); + // error + } + clearUnusedBits(); + } + + INLINE ap_private() : pVal(&VAL){VAL = 0ULL;} + +#define CTOR(TYPE) \ + INLINE ap_private(TYPE v) : VAL((uint64_t)v), pVal(&VAL) { \ + clearUnusedBits(); \ + } + CTOR(int) + CTOR(bool) + CTOR(signed char) + CTOR(unsigned char) + CTOR(short) + CTOR(unsigned short) + CTOR(unsigned int) + CTOR(long) + CTOR(unsigned long) + CTOR(unsigned long long) + CTOR(long long) + CTOR(float) + CTOR(double) +#undef CTOR + ap_private(uint32_t numWords, const uint64_t bigVal[]): VAL(bigVal[0]), pVal(&VAL) {clearUnusedBits();} + + ap_private(const std::string& val, uint8_t radix=2, int base=0, int offset=0): VAL(0), pVal(&VAL) { + assert(!val.empty() && "String empty?"); + fromString(val.c_str()+base, val.size()-base, radix); + } + + ap_private(const char strStart[], uint32_t slen, uint8_t radix, int base=0, int offset=0) : VAL(0), pVal(&VAL) { + fromString(strStart+base, slen-base, radix, offset); + } + + ap_private(const ap_private& that) : VAL(that.VAL), pVal(&VAL) { + clearUnusedBits(); + } + + template + ap_private(const ap_private<_AP_W1, _AP_S1, 1>& that) : VAL(that.VAL), pVal(&VAL) { + clearUnusedBits(); + } + + template + ap_private(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) : VAL(that.pVal[0]), pVal(&VAL) { + clearUnusedBits(); + } + + template + ap_private(const volatile ap_private<_AP_W1, _AP_S1, _AP_N1>& that) : VAL(that.pVal[0]), pVal(&VAL) { + clearUnusedBits(); + } + +#if 0 +template + explicit ap_private(const ap_private<_AP_W1, true, 1+_AP_W1/64>& that) + : VAL((_AP_W1>_AP_W) ? that.VAL & mask : ((1ULL<<(_AP_W1-1)&that.pVal[0]) ? sign_ext_mask<_AP_W1>::mask | that.VAL : that.pVal[0])), pVal(&VAL) {} + +template + explicit ap_private(const ap_private<_AP_W1, false, (_AP_W1+63)/64>& that) + : VAL(that.VAL & mask), pVal(&VAL) {} +#endif + + explicit ap_private(const char* val) : pVal(&VAL) { + std::string str(val); + uint32_t strLen = str.length(); + const char *strp = str.c_str(); + uint32_t offset = 0; + uint32_t base = 0; + bool neg = false; + uint32_t radix = 10; + ap_parse_sign(strp, base, neg); + ap_parse_prefix(strp + base, offset, radix); + + if ((radix != 10 && neg) || + (strLen - base - offset <= 0) || + InvalidDigit(strp, strLen, base + offset, radix)) { + fprintf(stderr, "invalid character string %s !\n", val); + assert(0); + } + + ap_private<_AP_W, _AP_S> ap_private_val(str.c_str(), strLen, radix, base, offset); + if (neg) + ap_private_val = -ap_private_val; + operator = (ap_private_val); + } + + ap_private(const char* val, signed char rd): pVal(&VAL) { + std::string str(val); + uint32_t strLen = str.length(); + const char *strp = str.c_str(); + uint32_t offset = 0; + uint32_t base = 0; + uint32_t radix = rd; + bool neg = false; + ap_parse_sign(strp, base, neg); + ap_parse_prefix(strp + base, offset, radix); + + if ((radix != 10 && neg) || + (strLen - base - offset <= 0) || + InvalidDigit(strp, strLen, base + offset, radix)) { + fprintf(stderr, "invalid character string %s !\n", val); + assert(0); + } + + uint32_t bitsNeeded = ap_private<_AP_W, _AP_S>::getBitsNeeded(strp, strLen, radix); + ap_private<_AP_W, _AP_S> ap_private_val(strp , strLen, radix, base, offset); + //ap_private<_AP_W, _AP_S> ap_private_val(bitsNeeded, strp , strLen, radix, base, offset); + if (strp[0] == '-') + ap_private_val = -ap_private_val; + operator = (ap_private_val); + } + + INLINE bool isNegative() const { + static const uint64_t sign_mask = 1ULL << (_AP_W-1); + return _AP_S && (sign_mask & VAL); + } + + INLINE bool isPositive() const { + return !isNegative(); + } + + INLINE bool isStrictlyPositive() const { + return !isNegative() && VAL!=0; + } + + INLINE bool isAllOnesValue() const { + return (mask & VAL) == mask; + } + + template + INLINE bool operator==(const ap_private<_AP_W1, _AP_S1, 1>& RHS) const { + return (VAL == RHS.VAL); + } + + INLINE bool operator==(const ap_private<_AP_W, _AP_S>& RHS) const { return VAL == RHS.VAL; } + INLINE bool operator==(const ap_private<_AP_W, !_AP_S>& RHS) const { return getVal() == RHS.getVal(); } + INLINE bool operator==(uint64_t Val) const { return (VAL == Val); } + INLINE bool operator!=(uint64_t Val) const { return (VAL != Val); } + INLINE bool operator!=(const ap_private<_AP_W, _AP_S>& RHS) const { return VAL != RHS.VAL; } + INLINE bool operator!=(const ap_private<_AP_W, !_AP_S>& RHS) const { return getVal() != RHS.getVal(); } + const ap_private operator++() { ++VAL; clearUnusedBits(); return *this; } + const ap_private operator--(int) { + ap_private orig(*this); + --VAL; clearUnusedBits(); + return orig; + } + const ap_private operator--() { --VAL; clearUnusedBits(); return *this;} + INLINE bool operator !() const { return !VAL;} + + const ap_private operator++(int) { + ap_private orig(*this); + VAL++; clearUnusedBits(); + return orig; + } + + const ap_private operator~() {return ap_private(~VAL);} + INLINE typename RType<1,false>::minus operator-() const { + return ap_private<1,false>(0) - (*this); + } + + INLINE std::string toString(uint8_t radix, bool wantSigned) const ; + INLINE std::string toStringUnsigned(uint8_t radix = 10) const { + return toString(radix, false); + } + INLINE std::string toStringSigned(uint8_t radix = 10) const { + return toString(radix, true); + } + INLINE void clear() { + VAL=0; + } + INLINE ap_private& clear(uint32_t bitPosition) { VAL &= ~(1ULL<<(bitPosition)); clearUnusedBits(); return *this;} + + INLINE ap_private ashr(uint32_t shiftAmt) const { + enum {excess_bits = APINT_BITS_PER_WORD - BitWidth}; + if (_AP_S) + return ap_private((shiftAmt == BitWidth) ? 0 : ((int64_t)VAL) >> (shiftAmt)); + else + return ap_private((shiftAmt == BitWidth) ? 0 : (VAL) >> (shiftAmt)); + } + + INLINE ap_private lshr(uint32_t shiftAmt) const { + return ap_private((shiftAmt == BitWidth) ? ap_private(0) : ap_private((VAL&mask) >> (shiftAmt))); + } + + INLINE ap_private shl(uint32_t shiftAmt) const { + if (shiftAmt > BitWidth) { + if (!isNegative()) + return ap_private(0); + else return ap_private(-1); + } + if (shiftAmt == BitWidth) return ap_private(0); + else return ap_private((VAL) << (shiftAmt)); + //return ap_private((shiftAmt == BitWidth) ? ap_private(0ULL) : ap_private(VAL << shiftAmt)); + } + + INLINE int64_t getSExtValue() const { + return VAL; + } + + INLINE uint64_t getZExtValue() const { + return VAL & mask; + } + + template + INLINE ap_private(const ap_range_ref<_AP_W2,_AP_S2>& ref) : pVal(&VAL) { + *this=ref.get(); + } + + template + INLINE ap_private(const ap_bit_ref<_AP_W2,_AP_S2>& ref) : pVal(&VAL) { + *this = ((uint64_t)(bool)ref); + } + + template + INLINE ap_private(const ap_concat_ref<_AP_W2, _AP_T2,_AP_W3, _AP_T3>& ref) : pVal(&VAL) { + *this=ref.get(); + } + + template + INLINE ap_private(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2> &val) : pVal(&VAL) { + *this = ((val.operator ap_private<_AP_W2, false> ())); + } + + template + INLINE ap_private(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2> &val) : pVal(&VAL) { + *this = (uint64_t)(bool)val; + } + + INLINE void write(const ap_private<_AP_W, _AP_S>& op2) volatile { + *this = (op2); + } + + //Explicit conversions to C interger types + //----------------------------------------------------------- + ValType getVal() const { + return VAL; + } + operator ValType () const { + return getVal(); + } + INLINE int to_int() const { + // ap_private<64 /* _AP_W */, _AP_S> res(V); + return (int) getVal(); + } + + INLINE unsigned to_uint() const { + return (unsigned) getVal(); + } + + INLINE long to_long() const { + return (long) getVal(); + } + + INLINE unsigned long to_ulong() const { + return (unsigned long) getVal(); + } + + INLINE ap_slong to_int64() const { + return (ap_slong) getVal(); + } + + INLINE ap_ulong to_uint64() const { + return (ap_ulong) getVal(); + } + + INLINE double to_double() const { + if (isNegative()) + return roundToDouble(true); + else + return roundToDouble(false); + } + + INLINE bool isMinValue() const { return VAL == 0;} + template INLINE ap_private& operator&=(const ap_private<_AP_W1, _AP_S1>& RHS) { + VAL = VAL&RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template INLINE ap_private& operator|=(const ap_private<_AP_W1, _AP_S1>& RHS) { + VAL = VAL|RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template INLINE ap_private& operator^=(const ap_private<_AP_W1, _AP_S1>& RHS){ + VAL = VAL^RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template INLINE ap_private& operator*=(const ap_private<_AP_W1, _AP_S1>& RHS){ + VAL = VAL*RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template INLINE ap_private& operator+=(const ap_private<_AP_W1, _AP_S1>& RHS){ + VAL = VAL+RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template INLINE ap_private& operator-=(const ap_private<_AP_W1, _AP_S1>& RHS){ + VAL = VAL-RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + INLINE const ap_private& operator<<=(uint32_t shiftAmt) { VAL<<=shiftAmt; clearUnusedBits(); return *this; } + + template INLINE typename RType<_AP_W1, _AP_S1>::logic operator&(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1, _AP_S1>::logic_w <= 64) { + typename RType<_AP_W1, _AP_S1>::logic Ret(VAL & RHS.VAL); + return Ret; + } else { + typename RType<_AP_W1, _AP_S1>::logic Ret = *this; + return Ret & RHS; + } + } + + template INLINE typename RType<_AP_W1, _AP_S1>::logic operator^(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1, _AP_S1>::logic_w <= 64) { + typename RType<_AP_W1, _AP_S1>::logic Ret(VAL ^ RHS.VAL); + return Ret; + } else { + typename RType<_AP_W1, _AP_S1>::logic Ret = *this; + return Ret ^ RHS; + } + } + + template INLINE typename RType<_AP_W1, _AP_S1>::logic operator|(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1, _AP_S1>::logic_w <= 64) { + typename RType<_AP_W1, _AP_S1>::logic Ret(VAL | RHS.VAL); + return Ret; + } else { + typename RType<_AP_W1, _AP_S1>::logic Ret = *this; + return Ret | RHS; + } + } + + INLINE ap_private<_AP_W, _AP_S> And(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL & RHS.VAL); + } + + INLINE ap_private<_AP_W, _AP_S> Or(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL | RHS.VAL); + } + + INLINE ap_private<_AP_W, _AP_S> Xor(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL ^ RHS.VAL); + } +#if 1 + template + INLINE typename RType<_AP_W1, _AP_S1>::mult operator*(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1, _AP_S1>::mult_w <= 64) { + typename RType<_AP_W1, _AP_S1>::mult Result(VAL * RHS.VAL); + return Result; + } else { + typename RType<_AP_W1, _AP_S1>::mult Result = typename RType<_AP_W1, _AP_S1>::mult(*this); + Result *= RHS; + return Result; + } + } +#endif + INLINE ap_private<_AP_W, _AP_S> Mul(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL * RHS.VAL); + } + + INLINE ap_private<_AP_W, _AP_S> Add(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL + RHS.VAL); + } + + INLINE ap_private<_AP_W, _AP_S> Sub(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL - RHS.VAL); + } + +#if 1 + INLINE ap_private& operator&=(uint64_t RHS) { VAL &= RHS; clearUnusedBits(); return *this;} + INLINE ap_private& operator|=(uint64_t RHS) { VAL |= RHS; clearUnusedBits(); return *this;} + INLINE ap_private& operator^=(uint64_t RHS){ VAL ^= RHS; clearUnusedBits(); return *this;} + INLINE ap_private& operator*=(uint64_t RHS){ VAL *= RHS; clearUnusedBits(); return *this; } + INLINE ap_private& operator+=(uint64_t RHS){ VAL += RHS; clearUnusedBits(); return *this;} + INLINE ap_private& operator-=(uint64_t RHS){ VAL -= RHS; clearUnusedBits(); return *this; } + INLINE ap_private operator&(uint64_t RHS) const { return ap_private(VAL & RHS); } + INLINE ap_private operator|(uint64_t RHS) const { return ap_private(VAL | RHS); } + INLINE ap_private operator^(uint64_t RHS) const { return ap_private(VAL ^ RHS); } + INLINE ap_private operator*(uint64_t RHS) const { return ap_private(VAL * RHS); } + INLINE ap_private operator/(uint64_t RHS) const { return ap_private(VAL / RHS); } + INLINE ap_private operator+(uint64_t RHS) const { return ap_private(VAL + RHS); } + INLINE ap_private operator-(uint64_t RHS) const { return ap_private(VAL - RHS); } +#endif + INLINE bool isMinSignedValue() const { + static const uint64_t min_mask = ~(~0ULL << (_AP_W-1)); + return BitWidth == 1 ? VAL == 1 : + (ap_private_ops::isNegative<_AP_W>(*this) && ((min_mask & VAL)==0)); + } + +#if 1 + + template INLINE + typename RType<_AP_W1,_AP_S1>::plus operator+(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1,_AP_S1>::plus_w <=64) + return typename RType<_AP_W1,_AP_S1>::plus(RType<_AP_W1,_AP_S1>::plus_s ? int64_t(VAL+RHS.VAL):uint64_t(VAL+RHS.VAL)); + typename RType<_AP_W1,_AP_S1>::plus Result=RHS; + Result += VAL; + return Result; + } + + template INLINE + typename RType<_AP_W1,_AP_S1>::minus operator-(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1,_AP_S1>::minus_w <=64) + return typename RType<_AP_W1,_AP_S1>::minus(int64_t(VAL-RHS.VAL)); + typename RType<_AP_W1,_AP_S1>::minus Result=*this; + Result -= RHS; + return Result; + } +#endif // #if 1 + + INLINE ap_private& flip() { + VAL = (~0ULL^VAL)&mask; + clearUnusedBits(); + return *this; + } + + uint32_t countPopulation() const { return CountPopulation_64(VAL);} + uint32_t countLeadingZeros() const { + int remainder = BitWidth % APINT_BITS_PER_WORD; + int excessBits = (APINT_BITS_PER_WORD - remainder) % APINT_BITS_PER_WORD; + //enum { remainder = BitWidth % APINT_BITS_PER_WORD, excessBits = APINT_BITS_PER_WORD - remainder}; + uint32_t Count = CountLeadingZeros_64(VAL); + if (Count) + Count-=excessBits; + return AESL_std::min(Count, (uint32_t)_AP_W); + } + + /// HiBits - This function returns the high "numBits" bits of this ap_private. + ap_private<_AP_W, _AP_S, 1> getHiBits(uint32_t numBits) const { + ap_private<_AP_W, _AP_S, 1> ret(*this); + ret = (ret)>>(BitWidth - numBits); + return ret; + } + + /// LoBits - This function returns the low "numBits" bits of this ap_private. + ap_private<_AP_W, _AP_S, 1> getLoBits(uint32_t numBits) const { + ap_private<_AP_W, _AP_S, 1> ret((VAL) << (BitWidth - numBits)); + ret = (ret)>>(BitWidth - numBits); + return ret; + //return ap_private(numBits, (VAL << (BitWidth - numBits))>> (BitWidth - numBits)); + } + + ap_private<_AP_W, _AP_S,1>& set(uint32_t bitPosition) { + VAL |= (1ULL << (bitPosition)); + clearUnusedBits(); + return *this; // clearUnusedBits(); + } + + void set() { + VAL = ~0ULL; + clearUnusedBits(); + } + + template + INLINE void set(const ap_private<_AP_W3, false> & val) { + operator = (ap_private<_AP_W3, _AP_S>(val)); + } + + INLINE void set(const ap_private & val) { + operator = (val); + } + + bool operator[](uint32_t bitPosition) const { + return (((1ULL << (bitPosition)) & VAL) != 0); + } + + INLINE void clearUnusedBits(void) { + enum { excess_bits = (_AP_W%APINT_BITS_PER_WORD) ? APINT_BITS_PER_WORD -_AP_W%APINT_BITS_PER_WORD : 0}; + VAL = _AP_S ? ((((int64_t)VAL)<<(excess_bits))>> (excess_bits)) : (excess_bits ? ((VAL)<<(excess_bits))>>(excess_bits) : VAL); + } + + INLINE void clearUnusedBitsToZero(void) { + enum { excess_bits = (_AP_W%APINT_BITS_PER_WORD) ? APINT_BITS_PER_WORD -_AP_W%APINT_BITS_PER_WORD : 0}; + static uint64_t mask = ~0ULL >> (excess_bits); + VAL &= mask; + } + + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1> udiv(const ap_private<_AP_W, _AP_S1>& RHS) const { + return ap_private<_AP_W, _AP_S||_AP_S1>(VAL / RHS.VAL); + } + + INLINE ap_private udiv(uint64_t RHS) const { + return ap_private(VAL / RHS); + } + + /// Signed divide this ap_private by ap_private RHS. + /// @brief Signed division function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1> sdiv(const ap_private<_AP_W, _AP_S1> & RHS) const { + if (isNegative()) + if (RHS.isNegative()) + return (-(*this)).udiv(-RHS); + else + return -((-(*this)).udiv(RHS)); + else if (RHS.isNegative()) + return -(this->udiv(-RHS)); + return this->udiv(RHS); + } + + /// Signed divide this ap_private by ap_private RHS. + /// @brief Signed division function for ap_private. + INLINE ap_private sdiv(int64_t RHS) const { + if (isNegative()) + if (RHS<0) + return (-(*this)).udiv(-RHS); + else + return -((-(*this)).udiv(RHS)); + else if (RHS<0) + return -(this->udiv(-RHS)); + return this->udiv(RHS); + } + + template + INLINE ap_private urem(const ap_private<_AP_W, _AP_S2>& RHS) const { + assert(RHS.VAL != 0 && "Divide by 0"); + return ap_private(VAL%RHS.VAL); + } + + INLINE ap_private urem(uint64_t RHS) const { + assert(RHS != 0 && "Divide by 0"); + return ap_private(VAL%RHS); + } + + /// Signed remainder operation on ap_private. + /// @brief Function for signed remainder operation. + template + INLINE ap_private srem(const ap_private<_AP_W, _AP_S2>& RHS) const { + if (isNegative()) { + ap_private lhs = -(*this); + if (RHS.isNegative()) { + ap_private rhs = -RHS; + return -(lhs.urem(rhs)); + } else + return -(lhs.urem(RHS)); + } else if (RHS.isNegative()) { + ap_private rhs = -RHS; + return this->urem(rhs); + } + return this->urem(RHS); + } + + /// Signed remainder operation on ap_private. + /// @brief Function for signed remainder operation. + INLINE ap_private srem(int64_t RHS) const { + if (isNegative()) + if (RHS<0) + return -((-(*this)).urem(-RHS)); + else + return -((-(*this)).urem(RHS)); + else if (RHS<0) + return this->urem(-RHS); + return this->urem(RHS); + } + + INLINE static void udivrem(const ap_private &LHS, const ap_private &RHS, + ap_private &Quotient, ap_private &Remainder){ + assert(RHS!=0 && "Divide by 0"); + Quotient = LHS.VAl/RHS.VAl; + Remainder = LHS.VAL % RHS.VAL; + } + + INLINE static void udivrem(const ap_private &LHS, uint64_t RHS, + ap_private &Quotient, ap_private &Remainder){ + assert(RHS!=0 && "Divide by 0"); + Quotient = LHS.VAl/RHS; + Remainder = LHS.VAL % RHS; + } + + INLINE static void sdivrem(const ap_private &LHS, const ap_private &RHS, + ap_private &Quotient, ap_private &Remainder) { + if (LHS.isNegative()) { + if (RHS.isNegative()) + ap_private::udivrem(-LHS, -RHS, Quotient, Remainder); + else + ap_private::udivrem(-LHS, RHS, Quotient, Remainder); + Quotient = -Quotient; + Remainder = -Remainder; + } else if (RHS.isNegative()) { + ap_private::udivrem(LHS, -RHS, Quotient, Remainder); + Quotient = -Quotient; + } else { + ap_private::udivrem(LHS, RHS, Quotient, Remainder); + } + } + + INLINE static void sdivrem(const ap_private &LHS, int64_t RHS, + ap_private &Quotient, ap_private &Remainder) { + if (LHS.isNegative()) { + if (RHS<0) + ap_private::udivrem(-LHS, -RHS, Quotient, Remainder); + else + ap_private::udivrem(-LHS, RHS, Quotient, Remainder); + Quotient = -Quotient; + Remainder = -Remainder; + } else if (RHS<0) { + ap_private::udivrem(LHS, -RHS, Quotient, Remainder); + Quotient = -Quotient; + } else { + ap_private::udivrem(LHS, RHS, Quotient, Remainder); + } + } + + template INLINE bool eq(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return (*this) == RHS; + } + + template INLINE bool ne(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return !((*this) == RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// the validity of the less-than relationship. + /// @returns true if *this < RHS when both are considered unsigned. + /// @brief Unsigned less than comparison + template INLINE bool ult(const ap_private<_AP_W1, _AP_S1, 1>& RHS) const { + uint64_t lhsZext = ((uint64_t(VAL)) << (64-_AP_W)) >> (64-_AP_W); + uint64_t rhsZext = ((uint64_t(RHS.VAL)) << (64-_AP_W1)) >> (64-_AP_W1); + return lhsZext < rhsZext; + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// validity of the less-than relationship. + /// @returns true if *this < RHS when both are considered signed. + /// @brief Signed less than comparison + template INLINE bool slt(const ap_private<_AP_W1, _AP_S1, 1>& RHS) const { + int64_t lhsSext = ((int64_t(VAL)) << (64-_AP_W)) >> (64-_AP_W); + int64_t rhsSext = ((int64_t(RHS.VAL)) << (64-_AP_W1)) >> (64-_AP_W1); + return lhsSext < rhsSext; + } + + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// validity of the less-or-equal relationship. + /// @returns true if *this <= RHS when both are considered unsigned. + /// @brief Unsigned less or equal comparison + template INLINE bool ule(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return ult(RHS) || eq(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// validity of the less-or-equal relationship. + /// @returns true if *this <= RHS when both are considered signed. + /// @brief Signed less or equal comparison + template INLINE bool sle(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return slt(RHS) || eq(RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// the validity of the greater-than relationship. + /// @returns true if *this > RHS when both are considered unsigned. + /// @brief Unsigned greather than comparison + template INLINE bool ugt(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return !ult(RHS) && !eq(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// the validity of the greater-than relationship. + /// @returns true if *this > RHS when both are considered signed. + /// @brief Signed greather than comparison + template INLINE bool sgt(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return !slt(RHS) && !eq(RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// validity of the greater-or-equal relationship. + /// @returns true if *this >= RHS when both are considered unsigned. + /// @brief Unsigned greater or equal comparison + template INLINE bool uge(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return !ult(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// validity of the greater-or-equal relationship. + /// @returns true if *this >= RHS when both are considered signed. + /// @brief Signed greather or equal comparison + template INLINE bool sge(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return !slt(RHS); + } + + INLINE ap_private abs() const { + if (isNegative()) + return -(*this); + return *this; + } + + ap_private<_AP_W, false> get() const { + ap_private<_AP_W,false> ret(*this); + return ret; + } + + INLINE static uint32_t getBitsNeeded(const char* str, uint32_t slen, uint8_t radix) { + return _AP_W; + } + + INLINE uint32_t getActiveBits() const { + uint32_t bits=_AP_W - countLeadingZeros(); + return bits?bits:1; + } + + INLINE double roundToDouble(bool isSigned=false) const { + const static uint64_t mask = ~0ULL << (APINT_BITS_PER_WORD - _AP_W); + return double(VAL); + } + + INLINE unsigned length() const { return _AP_W; } + + /*Reverse the contents of ap_private instance. I.e. LSB becomes MSB and vise versa*/ + INLINE ap_private& reverse () { + for (int i = 0; i < _AP_W/2; ++i) { + bool tmp = operator[](i); + if (operator[](_AP_W - 1 - i)) + set(i); + else + clear(i); + if (tmp) + set(_AP_W - 1 - i); + else + clear(_AP_W - 1 - i); + } + clearUnusedBits(); + return *this; + } + + /*Return true if the value of ap_private instance is zero*/ + INLINE bool iszero () const { + return isMinValue(); + } + + /* x < 0 */ + INLINE bool sign () const { + if (isNegative()) + return true; + return false; + } + + /* x[i] = !x[i] */ + INLINE void invert (int i) { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + flip(i); + } + + /* x[i] */ + INLINE bool test (int i) const { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + return operator[](i); + } + + //This is used for sc_lv and sc_bv, which is implemented by sc_uint + //Rotate an ap_private object n places to the left + INLINE void lrotate(int n) { + assert( n >= 0 && "Attempting to shift negative index"); + assert( n < _AP_W && "Shift value larger than bit width"); + operator = (shl(n) | lshr(_AP_W - n)); + } + + //This is used for sc_lv and sc_bv, which is implemented by sc_uint + //Rotate an ap_private object n places to the right + INLINE void rrotate(int n) { + assert( n >= 0 && "Attempting to shift negative index"); + assert( n < _AP_W && "Shift value larger than bit width"); + operator = (lshr(n) | shl(_AP_W - n)); + } + + //Set the ith bit into v + INLINE void set (int i, bool v) { + assert( i >= 0 && "Attempting to write bit with negative index"); + assert( i < _AP_W && "Attempting to write bit beyond MSB"); + v ? set(i) : clear(i); + } + + //Set the ith bit into v + INLINE void set_bit (int i, bool v) { + assert( i >= 0 && "Attempting to write bit with negative index"); + assert( i < _AP_W && "Attempting to write bit beyond MSB"); + v ? set(i) : clear(i); + } + + //Get the value of ith bit + INLINE bool get_bit (int i) const { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + return operator [](i); + } + + //complements every bit + INLINE void b_not() { + flip(); + } + + //Binary Arithmetic + //----------------------------------------------------------- +#define OP_BIN_AP(Sym,Rty, Fun) \ + template \ + INLINE \ + typename RType<_AP_W2,_AP_S2>::Rty \ + operator Sym (const ap_private<_AP_W2,_AP_S2>& op) const { \ + typename RType<_AP_W2,_AP_S2>::Rty lhs(*this); \ + typename RType<_AP_W2,_AP_S2>::Rty rhs(op); \ + return lhs.Fun(rhs); \ + } \ + + ///Bitwise and, or, xor + //OP_BIN_AP(&,logic, And) + //OP_BIN_AP(|,logic, Or) + //OP_BIN_AP(^,logic, Xor) + +#undef OP_BIN_AP + template + INLINE typename RType<_AP_W2,_AP_S2>::div + operator / (const ap_private<_AP_W2,_AP_S2>&op) const { + ap_private lhs=ap_private(*this); + ap_private rhs=ap_private(op); + return typename RType<_AP_W2,_AP_S2>::div((_AP_S||_AP_S2)?lhs.sdiv(rhs):lhs.udiv(rhs)); + } + + + template + INLINE typename RType<_AP_W2,_AP_S2>::mod + operator % (const ap_private<_AP_W2,_AP_S2>&op) const { + ap_private lhs=*this; + ap_private rhs=op; + typename RType<_AP_W2,_AP_S2>::mod res = typename RType<_AP_W2,_AP_S2>::mod (_AP_S?lhs.srem(rhs):lhs.urem(rhs)); + return res; + } + + +#define OP_ASSIGN_AP_2(Sym) \ + template \ + INLINE ap_private<_AP_W, _AP_S>& operator Sym##=(const ap_private<_AP_W2,_AP_S2>& op) \ + { \ + *this=operator Sym (op); \ + return *this; \ + } \ + + OP_ASSIGN_AP_2(/) + OP_ASSIGN_AP_2(%) +#undef OP_ASSIGN_AP_2 + + ///Bitwise assign: and, or, xor + //------------------------------------------------------------- + // OP_ASSIGN_AP(&) + // OP_ASSIGN_AP(^) + // OP_ASSIGN_AP(|) +#undef OP_ASSIGN_AP +#if 1 + + template + INLINE ap_private<_AP_W, _AP_S> + operator << (const ap_private<_AP_W2, _AP_S2>& op2) const { + uint32_t sh=op2.to_uint(); + return *this << sh; + } + + INLINE ap_private<_AP_W, _AP_S> + operator << (uint32_t sh) const { + return shl(sh); + } + +#endif + + template + INLINE ap_private<_AP_W, _AP_S> + operator >> (const ap_private<_AP_W2, _AP_S2>& op2) const { + uint32_t sh = op2.to_uint(); + return *this >> sh; + } + + INLINE ap_private<_AP_W, _AP_S> + operator >>(uint32_t sh) const { + ap_private<_AP_W, _AP_S> r(*this); + bool overflow=(sh>=_AP_W); + bool neg_v=r.isNegative(); + if(_AP_S) { + if(overflow) + neg_v?r.set():r.clear(); + else + return r.ashr(sh); + } else { + if(overflow) + r.clear(); + else + return r.lshr(sh); + } + return r; + } + + ///Shift assign + //------------------------------------------------------------------ +#define OP_ASSIGN_AP_3_SINGLE(Sym) \ + template \ + INLINE ap_private<_AP_W, _AP_S>& operator Sym##=(const ap_private<_AP_W2,_AP_S2>& op) \ + { \ + *this=operator Sym (op.getVal()); \ + return *this; \ + } + OP_ASSIGN_AP_3_SINGLE(>>) +#undef OP_ASSIGN_AP_3_SINGLE + + ///Comparisons + //----------------------------------------------------------------- + template + INLINE bool operator != (const ap_private<_AP_W2, _AP_S2, 1>& op) const { + return !(*this==op); + } + + template + INLINE bool operator > (const ap_private<_AP_W2, _AP_S2, 1>& op) const { + return op < *this; + } + + template + INLINE bool operator <= (const ap_private<_AP_W2, _AP_S2, 1>& op) const { + return !(*this>op); + } + + template + INLINE bool operator < (const ap_private<_AP_W2, _AP_S2, 1>& op) const { + enum { _AP_MAX_W = AP_MAX(_AP_W+(_AP_S||_AP_S2),_AP_W2+(_AP_S||_AP_S2))}; + ap_private<_AP_MAX_W, _AP_S> lhs(*this); + ap_private<_AP_MAX_W, _AP_S2> rhs(op); + if (_AP_S == _AP_S2) + return _AP_S?lhs.slt(rhs):lhs.ult(rhs); + else if (_AP_W < 32 && _AP_W2 < 32) + return lhs.slt(rhs); + else + if (_AP_S) + if (_AP_W2 >= _AP_W) + return lhs.ult(rhs); + else + return lhs.slt(rhs); + else + if (_AP_W >= _AP_W2) + return lhs.ult(rhs); + else + return lhs.slt(rhs); + } + + template + INLINE bool operator >=(const ap_private<_AP_W2, _AP_S2, 1>& op) const { + return !(*this + INLINE bool operator == (const ap_private<_AP_W2, _AP_S2, _AP_N2>& op) const { + return op == *this; + } + + template + INLINE bool operator != (const ap_private<_AP_W2, _AP_S2, _AP_N2>& op) const { + return !(op==*this); + } + + template + INLINE bool operator > (const ap_private<_AP_W2, _AP_S2, _AP_N2>& op) const { + return op < (*this); + } + + template + INLINE bool operator <= (const ap_private<_AP_W2, _AP_S2, _AP_N2>& op) const { + return op >= *this; + } + + template + INLINE bool operator <(const ap_private<_AP_W2, _AP_S2, _AP_N2>& op) const { + return op > *this; + } + + template + INLINE bool operator >=(const ap_private<_AP_W2,_AP_S2,_AP_N2>& op) const { + return op <= *this; + } + ///Bit and Part Select + //-------------------------------------------------------------- + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (int Hi, int Lo) const { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(const_cast*>(this), Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + range (int Hi, int Lo) const { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>((const_cast*> (this)), Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + range (int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + range (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + range (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(const_cast(this), Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + return this->range(Hi, Lo); + } + + + INLINE ap_bit_ref<_AP_W,_AP_S> operator [] (uint32_t index) { + assert(index >= 0&&"Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S> (*this, (int)index); + } + + template + INLINE ap_bit_ref<_AP_W,_AP_S> operator [] (const ap_private<_AP_W2,_AP_S2> &index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index.to_int() ); + } + + template + INLINE bool operator [] (const ap_private<_AP_W2,_AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br =operator [] (index); + return br.to_bool(); + } + + INLINE ap_bit_ref<_AP_W,_AP_S> bit (int index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index ); + } + + template + INLINE ap_bit_ref<_AP_W,_AP_S> bit (const ap_private<_AP_W2,_AP_S2> &index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W &&"Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index.to_int() ); + } + + INLINE bool bit (int index) const { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br(const_cast*>(this), index); + return br.to_bool(); + } + + template + INLINE bool bit (const ap_private<_AP_W2,_AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br = bit(index); + return br.to_bool(); + } + + template + INLINE ap_concat_ref<_AP_W,ap_private<_AP_W, _AP_S>,_AP_W2,ap_private<_AP_W2,_AP_S2> > concat(const ap_private<_AP_W2,_AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_private<_AP_W2,_AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W,ap_private<_AP_W, _AP_S>,_AP_W2,ap_private<_AP_W2,_AP_S2> > concat(ap_private<_AP_W2,_AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_private<_AP_W2,_AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (const ap_private<_AP_W2, _AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(const_cast& >(*this), const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (const ap_private<_AP_W2, _AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(*this, const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(const_cast& >(*this), a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (const ap_range_ref<_AP_W2, _AP_S2> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (ap_range_ref<_AP_W2, _AP_S2> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (const ap_bit_ref<_AP_W2, _AP_S2> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (ap_bit_ref<_AP_W2, _AP_S2> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) const { + return ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, a2); + } + + template + INLINE ap_private + operator & (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this & a2.get(); + } + + template + INLINE ap_private + operator | (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this | a2.get(); + } + + template + INLINE ap_private + operator ^ (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this ^ a2.get(); + } + + + //Reduce operation + //----------------------------------------------------------- + INLINE bool and_reduce() const { + return (VAL & mask) == mask; + } + + INLINE bool nand_reduce() const { + return (VAL & mask) != mask; + } + + INLINE bool or_reduce() const { + return (bool)VAL; + } + + INLINE bool nor_reduce() const { + return VAL==0; + } + + INLINE bool xor_reduce() const { + unsigned int i=countPopulation(); + return (i%2)?true:false; + } + + INLINE bool xnor_reduce() const { + unsigned int i=countPopulation(); + return (i%2)?false:true; + } + + INLINE std::string to_string(uint8_t radix=2, bool sign=false) const { + return toString(radix, radix==10?_AP_S:sign); + } +}; +template +std::string ap_private<_AP_W, _AP_S, 1>::toString(uint8_t radix, bool wantSigned) const { + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + static const char *digits[] = { + "0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f" + }; + std::string result; + if (radix != 10) { + // For the 2, 8 and 16 bit cases, we can just shift instead of divide + // because the number of bits per digit (1,3 and 4 respectively) divides + // equaly. We just shift until there value is zero. + + // First, check for a zero value and just short circuit the logic below. + if (*this == (uint64_t)(0)) + result = "0"; + else { + ap_private<_AP_W, false, 1> tmp(*this); + size_t insert_at = 0; + if (wantSigned && isNegative()) { + // They want to print the signed version and it is a negative value + // Flip the bits and add one to turn it into the equivalent positive + // value and put a '-' in the result. + tmp.flip(); + tmp++; + result = "-"; + insert_at = 1; + } + // Just shift tmp right for each digit width until it becomes zero + uint32_t shift = (radix == 16 ? 4 : (radix == 8 ? 3 : 1)); + uint64_t mask = radix - 1; + ap_private<_AP_W, false, 1> zero(0); + while (tmp.ne(zero)) { + unsigned digit = (unsigned)(tmp.VAL & mask); + result.insert(insert_at, digits[digit]); + tmp = tmp.lshr(shift); + } + } + return result; + } + + ap_private<_AP_W, false, 1> tmp(*this); + ap_private<6, false, 1> divisor(radix); + ap_private<_AP_W, _AP_S, 1> zero(0); + size_t insert_at = 0; + if (wantSigned && isNegative()) { + // They want to print the signed version and it is a negative value + // Flip the bits and add one to turn it into the equivalent positive + // value and put a '-' in the result. + tmp.flip(); + tmp++; + result = "-"; + insert_at = 1; + } + if (tmp == ap_private<_AP_W, false, 1>(0ULL)) + result = "0"; + else while (tmp.ne(zero)) { + ap_private<_AP_W, false, 1> APdigit = tmp%divisor; + ap_private<_AP_W, false, 1> tmp2 = tmp/divisor; + uint32_t digit = (uint32_t)(APdigit.getZExtValue()); + assert(digit < radix && "divide failed"); + result.insert(insert_at,digits[digit]); + tmp = tmp2; + } + return result; + +} + +#endif /* #ifndef LLVM_SUPPORT_MATHEXTRAS_H */ \ No newline at end of file diff --git a/hls_2018/router_02_boardstr/main.cpp b/hls_2018/router_02_boardstr/main.cpp new file mode 100755 index 0000000..2de79fc --- /dev/null +++ b/hls_2018/router_02_boardstr/main.cpp @@ -0,0 +1,99 @@ +/** + * main.cpp + * + * for Vivado HLS + */ + +#ifdef SOFTWARE +#include "ap_int.h" +#else +#include +#endif + +#ifdef CALCTIME +#include +#include +#endif + +#include "router.hpp" + +#define PRINT_SOLUTION + + +int main(int argc, char *argv[]) { + using namespace std; + + // Test data // + // NL_Q00.txt + //char boardstr[BOARDSTR_SIZE] = "X10Y05Z3L0000107041L0004107002L0102102021L0900100003"; + // NL_Q06.txt + char boardstr[BOARDSTR_SIZE] = "X10Y18Z2L0900109002L0901105012L0902103052L0903103062L0904100102L0905106012L0906109022L0717109102L0808109112L0017209172L0401200072L0912208152L0009201092L0709209092L0901206052L0309204092L0701209072L0101201022L0011202152L0016202162"; + // NL_Q08.txt + //char boardstr[BOARDSTR_SIZE] = "X17Y20Z2L0000103022L1603115052L0916107032L0302108012L1104111042L1002100002L0919116162L1616113182L1001115012L0500201182L1603213152L0600210022"; + char boardstr_high[BOARDSTR_SIZE] = {}; + + // Read boardstr from command line + if (1 < argc) { + // From stdin + if(argv[1][0]!='X') + { + char* c_p=fgets(boardstr, BOARDSTR_SIZE, stdin); + int length=strlen(c_p); + boardstr[length-1]=0; + } + else + { + strcpy(boardstr, argv[1]); + } + } + + // Seed value + int seed = 12345; + if (2 < argc) { + seed = atoi(argv[2]); + } + +#ifdef PRINT_SOLUTION + int size_x = (boardstr[1] - '0') * 10 + (boardstr[2] - '0'); + int size_y = (boardstr[4] - '0') * 10 + (boardstr[5] - '0'); + int size_z = (boardstr[7] - '0'); +#endif + + // Solver + ap_int<32> status; + clock_t clock_start, clock_done; + clock_start = clock(); + bool result = pynqrouter(boardstr, boardstr_high, seed, &status); + clock_done = clock(); + if (result) { + cout << endl << "Test Passed!" << endl; + } else { + cout << endl << "Test Failed!" << endl; + } + cout << "status = " << (int)status << endl; + cout << "elapsed = " << ((double)(clock_done - clock_start) / CLOCKS_PER_SEC) << endl << endl; + +#ifdef PRINT_SOLUTION + cout << "SOLUTION" << endl; + cout << "========" << endl; + cout << "SIZE " << size_x << "X" << size_y << "X" << size_z << endl; + for (int z = 0; z < size_z; z++) { + cout << "LAYER " << (z + 1) << endl; + for (int y = 0; y < size_y; y++) { + for (int x = 0; x < size_x; x++) { + if (x != 0) { + cout << ","; + } + int i = ((x * MAX_WIDTH + y) << BITWIDTH_Z) | z; + unsigned int num = (unsigned char)(boardstr[i]) + ((unsigned char)(boardstr_high[i]) << 8); + cout << setfill('0') << setw(3) << right << num; + //cout << num; + } + cout << endl; + } + } +#endif + + return 0; +} + diff --git a/hls_2018/router_02_boardstr/router.cpp b/hls_2018/router_02_boardstr/router.cpp new file mode 100755 index 0000000..d40f356 --- /dev/null +++ b/hls_2018/router_02_boardstr/router.cpp @@ -0,0 +1,609 @@ +/** + * router.cpp + * + * for Vivado HLS + */ + +#ifdef SOFTWARE +#include "ap_int.h" +#else +#include +#endif + +#include "./router.hpp" + +// Set weight +ap_uint<8> new_weight(ap_uint<16> x) { +#pragma HLS INLINE + // K. Terada: y = 1~32 (8bit) + ap_uint<8> y; + y = ((x & 255) >> 3) + 1; + return y; +} + + +// Global values +static ap_uint<7> size_x; // X +static ap_uint<7> size_y; // Y +static ap_uint<4> size_z; // Z + +static ap_uint line_num = 0; // #Lines + +#ifdef DEBUG_PRINT +int max_queue_length; // Max length of priority queue +int max_search_count; // Max count of queue pop +int max_buffer_length; // Max length of line buffer +#endif + + +bool pynqrouter(char boardstr[BOARDSTR_SIZE], char boardstr_high[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *status) { +#pragma HLS INTERFACE s_axilite port=boardstr bundle=AXI4LS +#pragma HLS INTERFACE s_axilite port=boardstr_high bundle=AXI4LS +#pragma HLS INTERFACE s_axilite port=seed bundle=AXI4LS +#pragma HLS INTERFACE s_axilite port=status bundle=AXI4LS +#pragma HLS INTERFACE s_axilite port=return bundle=AXI4LS + + // status(0:Solved, 1:Not solved) + *status = -1; + + // For all lines + ap_uint paths[MAX_BUFFER]; // Line buffer + + // For each line + // Note: Should not partition completely + bool adjacents[MAX_LINES]; // Line has adjacent terminals? + ap_uint starts[MAX_LINES]; // Start list + ap_uint goals[MAX_LINES]; // Goal list + ap_uint s_idx[MAX_LINES]; // Start point on line buffer + + ap_uint<8> weights[MAX_CELLS]; // Weight of each cell + // Note: Should not partition weight array + // since each element will be accessed in "random" order + + + // ================================ + // (Step.0) Initialization (BEGIN) + // ================================ + + // Note: Loop counter -> need an extra bit (for condition determination) + + INIT_WEIGHTS: + for (ap_uint i = 0; i < (ap_uint)(MAX_CELLS); i++) { +#pragma HLS UNROLL factor=2 + weights[i] = 1; + } + + /// Parse /// + size_x = (boardstr[1] - '0') * 10 + (boardstr[2] - '0'); + size_y = (boardstr[4] - '0') * 10 + (boardstr[5] - '0'); + size_z = (boardstr[7] - '0'); + + INIT_BOARDS: + for (ap_uint idx = 8; idx < (ap_uint)(BOARDSTR_SIZE); idx+=11) { + + // NULL-terminated + if (boardstr[idx] == 0) break; + + // Start & Goal of each line + ap_uint<7> s_x = (boardstr[idx+1] - '0') * 10 + (boardstr[idx+2] - '0'); + ap_uint<7> s_y = (boardstr[idx+3] - '0') * 10 + (boardstr[idx+4] - '0'); + ap_uint<3> s_z = (boardstr[idx+5] - '0') - 1; + ap_uint<7> g_x = (boardstr[idx+6] - '0') * 10 + (boardstr[idx+7] - '0'); + ap_uint<7> g_y = (boardstr[idx+8] - '0') * 10 + (boardstr[idx+9] - '0'); + ap_uint<3> g_z = (boardstr[idx+10] - '0') - 1; + + ap_uint start_id = (((ap_uint)s_x * MAX_WIDTH + (ap_uint)s_y) << BITWIDTH_Z) | (ap_uint)s_z; + ap_uint goal_id = (((ap_uint)g_x * MAX_WIDTH + (ap_uint)g_y) << BITWIDTH_Z) | (ap_uint)g_z; + starts[line_num] = start_id; + goals[line_num] = goal_id; + weights[start_id] = MAX_WEIGHT; + weights[goal_id] = MAX_WEIGHT; + + // Line has adjacent terminals? + adjacents[line_num] = false; + ap_int<8> dx = (ap_int<8>)g_x - (ap_int<8>)s_x; // Min: -71, Max: 71 (Signed 8bit) + ap_int<8> dy = (ap_int<8>)g_y - (ap_int<8>)s_y; // Min: -71, Max: 71 (Signed 8bit) + ap_int<4> dz = (ap_int<4>)g_z - (ap_int<4>)s_z; // Min: -7, Max: 7 (Signed 4bit) + if ((dx == 0 && dy == 0 && (dz == 1 || dz == -1)) || (dx == 0 && (dy == 1 || dy == -1) && dz == 0) || ((dx == 1 || dx == -1) && dy == 0 && dz == 0)) { + adjacents[line_num] = true; + } + + line_num++; + } + + // ================================ + // (Step.0) Initialization (END) + // ================================ + +#ifdef DEBUG_PRINT + max_queue_length = 0; + max_search_count = 0; + max_buffer_length = 0; +#endif + + ap_uint pointer = 0; // Pointer for line buffer + + // ================================ + // (Step.1) Initial Routing (BEGIN) + // ================================ + +#ifdef DEBUG_PRINT + cout << "Initial Routing ..." << endl; +#endif + + FIRST_ROUTING: + for (ap_uint i = 0; i < (ap_uint)(line_num); i++) { +#pragma HLS LOOP_TRIPCOUNT min=2 max=999 + + s_idx[i] = pointer; + + if (adjacents[i] == true) continue; // Skip routing + +#ifdef DEBUG_PRINT + //cout << "LINE #" << (int)(i + 1) << endl; +#endif + // Routing + ap_uint dummy = MAX_BUFFER-1; + pointer = search(s_idx[i], &dummy, paths, starts[i], goals[i], weights); + } + + // ================================ + // (Step.1) Initial Routing (END) + // ================================ + + + // Memories for Overlap Check + ap_uint<1> overlap_checks[MAX_CELLS]; +#pragma HLS ARRAY_PARTITION variable=overlap_checks cyclic factor=16 dim=1 + bool has_overlap = false; + + // ================================ + // (Step.2) Rip-up Routing (BEGIN) + // ================================ + +#ifdef DEBUG_PRINT + cout << "Rip-up Routing ..." << endl; +#endif + + ap_uint target = line_num - 1, next_target; + + ROUTING: + for (ap_uint<16> round = 0; round < 32768 /* = (2048 * 16) */; round++) { +#pragma HLS LOOP_TRIPCOUNT min=1 max=32768 + + // Target line + target = round % line_num; + next_target = target + 1; + if (next_target == line_num) next_target = 0; + +#ifdef DEBUG_PRINT + //cout << "(round " << round << ") LINE #" << (int)(target + 1); + //cout << " -> " << pointer << endl; +#endif +#ifdef DEBUG_PRINT + int buffer_length = pointer - s_idx[target]; + if (max_buffer_length < buffer_length) { max_buffer_length = buffer_length; } +#endif + + // Skip routing + if (adjacents[target] == true) { + s_idx[target] = pointer; continue; + } + + + // (Step.2-1) Reset weights of target line + WEIGHT_RESET: + for (ap_uint j = s_idx[target]; j != s_idx[next_target]; j++) { +#pragma HLS UNROLL factor=2 +#pragma HLS LOOP_TRIPCOUNT min=1 max=256 + weights[paths[j]] = 1; + } + + // (Step.2-2) Set weights of non-target lines and terminals + ap_uint<8> current_round_weight = new_weight(round); + WEIGHT_PATH: + for (ap_uint j = s_idx[next_target]; j != pointer; j++) { +#pragma HLS UNROLL factor=2 +#pragma HLS LOOP_TRIPCOUNT min=1 max=8192 + weights[paths[j]] = current_round_weight; + } + WEIGHT_TERMINAL: + for (ap_uint i = 0; i < (ap_uint)(line_num); i++) { +#pragma HLS UNROLL factor=2 +#pragma HLS LOOP_TRIPCOUNT min=2 max=999 + weights[starts[i]] = MAX_WEIGHT; + weights[goals[i]] = MAX_WEIGHT; + } + // Reset weight of start terminal of target line (bug avoiding) + // Restore original settings in (*) + weights[starts[target]] = 1; + + // (Step.2-3) Routing + s_idx[target] = pointer; + ap_uint n_idx = s_idx[next_target]; // For overflow check + pointer = search(s_idx[target], &n_idx, paths, starts[target], goals[target], weights); + //pointer = search(s_idx[target], paths, starts[target], goals[target], weights); + //cout << n_idx << ", " << s_idx[next_target] << endl; + + // (*) + weights[starts[target]] = MAX_WEIGHT; + +#ifdef DEBUG_PRINT + bool ng = false; + for (ap_uint i = 0; i < (ap_uint)(line_num); i++) { + if (weights[starts[i]] != 255 || weights[goals[i]] != 255) { + cout << i << " "; ng = true; + } + } + if(ng) { cout << endl; } +#endif + + // (Step.2-4) Overlap check + has_overlap = false; + if (n_idx != s_idx[next_target]) break; // Overflow check + OVERLAP_RESET: + for (ap_uint i = 0; i < (ap_uint)(MAX_CELLS); i++) { +#pragma HLS UNROLL factor=32 + overlap_checks[i] = 0; + } + OVERLAP_CHECK_LINE: + for (ap_uint i = 0; i < (ap_uint)(line_num); i++) { +#pragma HLS UNROLL factor=2 +#pragma HLS LOOP_TRIPCOUNT min=2 max=999 + overlap_checks[starts[i]] = 1; + overlap_checks[goals[i]] = 1; + } + OVERLAP_CHECK_PATH: + for (ap_uint j = s_idx[next_target]; j != pointer; j++) { +#pragma HLS UNROLL factor=2 +#pragma HLS LOOP_TRIPCOUNT min=1 max=8192 + ap_uint cell_id = paths[j]; + if (overlap_checks[cell_id]) { + has_overlap = true; break; + } + overlap_checks[cell_id] = 1; + } +#ifdef DEBUG_PRINT + if(!has_overlap){ cout << "ROUND: " << round << endl; } +#endif + if (!has_overlap) break; // Finish routing? + } + +#ifdef DEBUG_PRINT + cout << "MAX PQ LENGTH: " << max_queue_length << endl; + cout << "MAX SEARCH COUNT: " << max_search_count << endl; + cout << "MAX BUFFER: " << max_buffer_length << endl; +#endif + + // Not solved + if (has_overlap) { + *status = 1; return false; + } + + // ================================ + // (Step.2) Rip-up Routing (END) + // ================================ + + + // ================================ + // (Step.3) Output (BEGIN) + // ================================ + +#ifdef DEBUG_PRINT + cout << "Output ..." << endl; +#endif + + // Init: Blank = 0 + OUTPUT_INIT: + for (ap_uint i = 0; i < (ap_uint)(MAX_CELLS); i++) { + boardstr[i] = 0; + boardstr_high[i] = 0; + } + // Line + OUTPUT_LINE: + for (ap_uint i = 0; i < (ap_uint)(line_num); i++) { +#pragma HLS LOOP_TRIPCOUNT min=2 max=999 + boardstr[starts[i]] = (i + 1); + boardstr[goals[i]] = (i + 1); + boardstr_high[starts[i]] = (i + 1) >> 8; + boardstr_high[goals[i]] = (i + 1) >> 8; + +/** + cout << "#" << i; + ap_uint<13> start_xy = (ap_uint<13>)(starts[i] >> BITWIDTH_Z); + ap_uint<7> start_x = (ap_uint<7>)(start_xy / MAX_WIDTH); + ap_uint<7> start_y = (ap_uint<7>)(start_xy - start_x * MAX_WIDTH); + ap_uint<3> start_z = (ap_uint<3>)(starts[i] & BITMASK_Z); + ap_uint<13> goal_xy = (ap_uint<13>)(goals[i] >> BITWIDTH_Z); + ap_uint<7> goal_x = (ap_uint<7>)(goal_xy / MAX_WIDTH); + ap_uint<7> goal_y = (ap_uint<7>)(goal_xy - goal_x * MAX_WIDTH); + ap_uint<3> goal_z = (ap_uint<3>)(goals[i] & BITMASK_Z); + cout << "(" << start_x << "," << start_y << "," << start_z << ")->"; + cout << "(" << goal_x << "," << goal_y << "," << goal_z << ")" << endl; +**/ + + ap_uint p1; // p1: s_idx of target + ap_uint p2; // p2: s_idx of next target + p1 = s_idx[i]; + if (i == (ap_uint)(line_num-1)) { + p2 = s_idx[0]; + } + else { + p2 = s_idx[i+1]; + } + if (i == target) { + p2 = pointer; + } + OUTPUT_LINE_PATH: + for (ap_uint j = p1; j != p2; j++) { +#pragma HLS LOOP_TRIPCOUNT min=1 max=256 + boardstr[paths[j]] = (i + 1); + boardstr_high[paths[j]] = (i + 1) >> 8; + +/** + ap_uint<13> trgt_xy = (ap_uint<13>)(paths[j] >> BITWIDTH_Z); + ap_uint<7> trgt_x = (ap_uint<7>)(trgt_xy / MAX_WIDTH); + ap_uint<7> trgt_y = (ap_uint<7>)(trgt_xy - trgt_x * MAX_WIDTH); + ap_uint<3> trgt_z = (ap_uint<3>)(paths[j] & BITMASK_Z); + cout << "(" << trgt_x << "," << trgt_y << "," << trgt_z << ")"; +**/ + + } +/** + cout << endl; +**/ + } + + // ================================ + // (Step.3) Output (END) + // ================================ + + *status = 0; return true; +} + + +// ================================ // +// For Routing +// ================================ // + +// Max: 71, Min: 0 (7bit) +ap_uint<7> abs_uint7(ap_uint<7> a, ap_uint<7> b) { +#pragma HLS INLINE + if (a < b) { return b - a; } + else { return a - b; } +} +// Max: 7, Min: 0 (3bit) +ap_uint<3> abs_uint3(ap_uint<3> a, ap_uint<3> b) { +#pragma HLS INLINE + if (a < b) { return b - a; } + else { return a - b; } +} + +// Reference codes: +// http://lethe2211.hatenablog.com/entry/2014/12/30/011030 +// http://www.redblobgames.com/pathfinding/a-star/implementation.html +// Need to modify "array partition factor" +ap_uint search(ap_uint idx, ap_uint *n_idx, ap_uint paths[MAX_BUFFER], ap_uint start, ap_uint goal, ap_uint<8> w[MAX_CELLS]) { + + ap_uint dist[MAX_CELLS]; +#pragma HLS ARRAY_PARTITION variable=dist cyclic factor=64 dim=1 + ap_uint prev[MAX_CELLS]; + + SEARCH_INIT_DIST: + for (ap_uint i = 0; i < (ap_uint)(MAX_CELLS); i++) { +#pragma HLS UNROLL factor=128 + dist[i] = 65535; // = (2^16 - 1) + } + + // Priority queue (Circular list) + ap_uint top = 1, bottom = 0; + bool is_empty = true; + ap_uint<32> pq_nodes[MAX_PQ]; +#pragma HLS ARRAY_PARTITION variable=pq_nodes cyclic factor=32 dim=1 +/** Set!: factor=PP **/ + +#ifdef DEBUG_PRINT + int queue_length = 0; + int search_count = 0; +#endif + + // Point of goal terminal + ap_uint<13> goal_xy = (ap_uint<13>)(goal >> BITWIDTH_Z); + ap_uint<7> goal_x = (ap_uint<7>)(goal_xy / MAX_WIDTH); + ap_uint<7> goal_y = (ap_uint<7>)(goal_xy - goal_x * MAX_WIDTH); + ap_uint<3> goal_z = (ap_uint<3>)(goal & BITMASK_Z); + + dist[start] = 0; + pq_push(pq_nodes, 0, start, &top, &bottom, &is_empty); // push start terminal + + SEARCH_PQ: + while (!is_empty) { +#pragma HLS LOOP_TRIPCOUNT min=1 max=1000 +#pragma HLS LOOP_FLATTEN off + + ap_uint<16> prev_cost; + ap_uint<16> src; // target cell + pq_pop(pq_nodes, &prev_cost, &src, &top, &bottom, &is_empty); +#ifdef DEBUG_PRINT + search_count++; +#endif + + + // End routing + if (src == goal) break; + + + // Target cell + ap_uint<16> dist_src = dist[src]; + ap_uint<8> cost = w[src]; + // Point of target cell + ap_uint<13> src_xy = (ap_uint<13>)(src >> BITWIDTH_Z); + ap_uint<7> src_x = (ap_uint<7>)(src_xy / MAX_WIDTH); + ap_uint<7> src_y = (ap_uint<7>)(src_xy - src_x * MAX_WIDTH); + ap_uint<3> src_z = (ap_uint<3>)(src & BITMASK_Z); + + // Search adjacent cells + SEARCH_ADJACENTS: + for (ap_uint<3> a = 0; a < 6; a++) { + ap_int<8> dest_x = (ap_int<8>)src_x; // Min: -1, Max: 72 (Signed 8bit) + ap_int<8> dest_y = (ap_int<8>)src_y; // Min: -1, Max: 72 (Signed 8bit) + ap_int<5> dest_z = (ap_int<5>)src_z; // Min: -1, Max: 8 (Signed 5bit) + if (a == 0) { dest_x -= 1; } + if (a == 1) { dest_x += 1; } + if (a == 2) { dest_y -= 1; } + if (a == 3) { dest_y += 1; } + if (a == 4) { dest_z -= 1; } + if (a == 5) { dest_z += 1; } + + // Inside the board ? // + if (0 <= dest_x && dest_x < (ap_int<8>)size_x && 0 <= dest_y && dest_y < (ap_int<8>)size_y && 0 <= dest_z && dest_z < (ap_int<5>)size_z) { + // Adjacent cell + ap_uint<16> dest = (((ap_uint<16>)dest_x * MAX_WIDTH + (ap_uint<16>)dest_y) << BITWIDTH_Z) | (ap_uint<16>)dest_z; + ap_uint<16> dist_new = dist_src + cost; + + if (dist[dest] > dist_new) { + dist[dest] = dist_new; // Update dist + prev[dest] = src; // Recode previous cell + dist_new += abs_uint7(dest_x, goal_x) + abs_uint7(dest_y, goal_y) + abs_uint3(dest_z, goal_z); // A* heuristic + pq_push(pq_nodes, dist_new, dest, &top, &bottom, &is_empty); // push adjacent cell + } + } + } +#ifdef DEBUG_PRINT + if (queue_length < (bottom-top+1)) { queue_length = (bottom-top+1); } +#endif + } + + // Output target path + // Note: Do not include start & goal terminals + ap_uint<16> t = prev[goal]; + + // Backtracking + ap_uint p = idx; // buffer-idx + SEARCH_BACKTRACK: + while (t != start) { +#pragma HLS LOOP_TRIPCOUNT min=1 max=256 + // overflow check + if (p == (*n_idx)) { + (*n_idx)++; break; + } + paths[p] = t; + p++; + t = prev[t]; + } + +#ifdef DEBUG_PRINT + if (max_queue_length < queue_length) { max_queue_length = queue_length; } + if (max_search_count < search_count) { max_search_count = search_count; } +#endif + + return p; +} + +// Queue push (Enqueue) +// Need to modify "trip count" (5) +void pq_push(ap_uint<32> pq_nodes[MAX_PQ], ap_uint<16> priority, ap_uint<16> data, ap_uint *top, ap_uint *bottom, bool *is_empty) { +#pragma HLS INLINE + + (*bottom)++; + if ((*bottom) == (*top) && !(*is_empty)) { (*bottom)--; } // Queue is full -> Last element is automatically removed + + // Binary search for circular list + ap_uint t = (*top); + ap_uint b = (*bottom); + ap_uint h = ((ap_uint)(b - t) / 2) + t; + // Note: "h = (t + b) / 2" causes a bug! + PQ_PUSH_BINARY: + while (t != b) { +#pragma HLS LOOP_TRIPCOUNT min=0 max=13 +/** Set!: min=0 max=PQ_BIT **/ + if ((ap_uint<16>)(pq_nodes[h] & PQ_PRIORITY_MASK) >= priority) { + b = h; + } + else { + t = h + 1; + } + h = ((ap_uint)(b - t) / 2) + t; + } + + // Parallel shifting (PP parallel) + ap_uint shift_count = (*bottom) - t; // # of shifting + + ap_uint bottom_H = (*bottom) / PP; // High-order bits of (*bottom) + ap_uint bottom_L = (*bottom) % PP; // Low-order bits of (*bottom) + ap_uint p0 = (*bottom), p1; + if (shift_count > (ap_uint)(bottom_L)) { + // bottom_L bit shift + PQ_PUSH_SHIFT_H_1: + for (ap_uint k = 0; k < (ap_uint)(bottom_L); k++) { +#pragma HLS LOOP_TRIPCOUNT min=0 max=31 +/** Set!: min=0 max=PP-1 **/ + p0 = p0 - 1; // source + p1 = p0 + 1; // destination + pq_nodes[p1] = pq_nodes[p0]; + } + shift_count = shift_count - bottom_L; + } + else { + // shift_count bit shift + PQ_PUSH_SHIFT_H_2: + for (ap_uint k = 0; k < (ap_uint)(shift_count); k++) { +#pragma HLS LOOP_TRIPCOUNT min=0 max=31 +/** Set!: min=0 max=PP-1 **/ + p0 = p0 - 1; // source + p1 = p0 + 1; // destination + pq_nodes[p1] = pq_nodes[p0]; + } + pq_nodes[p0] = ((ap_uint<32>)data << PQ_PRIORITY_WIDTH) | (ap_uint<32>)priority; + *is_empty = false; return; + } + + ap_uint shift_count_i = shift_count >> LOG_PP; + ap_uint shift_count_j = shift_count - (shift_count_i << LOG_PP); + // Note: Bit adjustment is necessary + // when the values of PP & LOG_PP have been changed. + + ap_uint p[PP+1]; +#pragma HLS ARRAY_PARTITION variable=p complete dim=1 + p[0] = bottom_H * PP; + ap_uint<32> tmp[PP]; +#pragma HLS ARRAY_PARTITION variable=tmp complete dim=1 + PQ_PUSH_SHIFT_I: + for (ap_uint i = 0; i < (ap_uint)(shift_count_i); i++) { +#pragma HLS LOOP_TRIPCOUNT min=0 max=255 +/** Set!: min=0 max=(MAX_PQ)/(PP)-1 **/ + p[0] = p[0] - PP; + for (ap_uint k = 1; k <= (ap_uint)(PP); k++) { +#pragma HLS UNROLL + p[k] = p[0] + k; + } + for (ap_uint k = 1; k <= (ap_uint)(PP); k++) { +#pragma HLS UNROLL + tmp[k-1] = pq_nodes[p[k-1]]; + } + for (ap_uint k = 1; k <= (ap_uint)(PP); k++) { +#pragma HLS UNROLL + pq_nodes[p[k]] = tmp[k-1]; + } + } + PQ_PUSH_SHIFT_J: + for (ap_uint j = 0; j < (ap_uint)(shift_count_j); j++) { +#pragma HLS LOOP_TRIPCOUNT min=0 max=31 +/** Set!: min=0 max=PP-1 **/ + p[0] = p[0] - 1; + p[1] = p[0] + 1; + pq_nodes[p[1]] = pq_nodes[p[0]]; + } + pq_nodes[p[0]] = ((ap_uint<32>)data << PQ_PRIORITY_WIDTH) | (ap_uint<32>)priority; + *is_empty = false; +} + +// Queue pop (Dequeue) +void pq_pop(ap_uint<32> pq_nodes[MAX_PQ], ap_uint<16> *ret_priority, ap_uint<16> *ret_data, ap_uint *top, ap_uint *bottom, bool *is_empty) { +#pragma HLS INLINE + + *ret_priority = (ap_uint<16>)(pq_nodes[(*top)] & PQ_PRIORITY_MASK); + *ret_data = (ap_uint<16>)(pq_nodes[(*top)] >> PQ_PRIORITY_WIDTH); + (*top)++; + if (((*bottom)-(*top)+1) == 0) { *is_empty = true; } +} diff --git a/hls_2018/router_02_boardstr/router.hpp b/hls_2018/router_02_boardstr/router.hpp new file mode 100755 index 0000000..a029ae8 --- /dev/null +++ b/hls_2018/router_02_boardstr/router.hpp @@ -0,0 +1,59 @@ +/** + * router.hpp + * + * for Vivado HLS + */ + +#ifndef __ROUTER_HPP__ +#define __ROUTER_HPP__ + +#ifdef SOFTWARE +#include "ap_int.h" +#else +#include +#endif + +//#define DEBUG_PRINT // for debug + +#ifdef DEBUG_PRINT +using namespace std; +#endif + +// Parameters +#define MAX_WIDTH 72 // Max of X, Y +#define BITWIDTH_XY 13 +#define BITMASK_XY 65528 // 1111 1111 1111 1000 +#define MAX_LAYER 8 // Max of Z +#define BITWIDTH_Z 3 +#define BITMASK_Z 7 // 0000 0000 0000 0111 + +#define MAX_CELLS 41472 // Max #cells (16bit) +#define MAX_LINES 1024 // Max #lines (10bit) +#define MAX_PQ 8192 // Queue size (13bit) +#define MAX_BUFFER 16384 // Line buffer size (14bit) +#define CELL_BIT 16 +#define LINE_BIT 10 +#define PQ_BIT 13 +#define BUFF_BIT 14 + +#define PQ_PRIORITY_WIDTH 16 +#define PQ_PRIORITY_MASK 65535 // 0000 0000 0000 0000 1111 1111 1111 1111 +#define PQ_DATA_WIDTH 16 +#define PQ_DATA_MASK 4294901760 // 1111 1111 1111 1111 0000 0000 0000 0000 + +#define MAX_WEIGHT 255 // Max weight +#define BOARDSTR_SIZE 41472 // Size of I/O + +#define PP 32 // Parameter for Parallel shifting in queue push +#define LOG_PP 5 // LOG_PP is log2(PP) + +ap_uint<8> new_weight(ap_uint<16> x); +bool pynqrouter(char boardstr[BOARDSTR_SIZE], char boardstr_high[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *status); + +ap_uint<7> abs_uint7(ap_uint<7> a, ap_uint<7> b); +ap_uint<3> abs_uint3(ap_uint<3> a, ap_uint<3> b); +ap_uint search(ap_uint idx, ap_uint *n_idx, ap_uint paths[MAX_BUFFER], ap_uint start, ap_uint goal, ap_uint<8> w[MAX_WEIGHT]); +void pq_push(ap_uint<32> pq_nodes[MAX_PQ], ap_uint<16> priority, ap_uint<16> data, ap_uint *top, ap_uint *bottom, bool *is_empty); +void pq_pop(ap_uint<32> pq_nodes[MAX_PQ], ap_uint<16> *ret_priority, ap_uint<16> *ret_data, ap_uint *top, ap_uint *bottom, bool *is_empty); + +#endif /* __ROUTER_HPP__ */ diff --git a/hls_2018/router_04_boardstr/bitstream/router_design.bit b/hls_2018/router_04_boardstr/bitstream/router_design.bit new file mode 100755 index 0000000000000000000000000000000000000000..ff18863db2877ef2c92e741df2f47c44f41c3498 GIT binary patch literal 5568793 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%0D)cAR-2Tr$7r*sJoaOY)PyamL?rSLi9kiBgPu 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�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

Zd^1RI-*Nk#YsWN}Y~4%==r7?2f=N|y}H zYJBAb%Ul7T<Uh$Y`=MIp{z4SP&O>yN74<0dVl{bb{ENr$0CzT~83rP#cd--W1#W6{4 z`D%g@X1rl50nFWhvH!2|B+xf4#Wx3Y`RoiLgaOSQb~eFv2QnABdZp&6C}Z4_*`_}y zl<5G3M%8vll}OpGaDXrdFud{L%~|`#lhdU{7A(O| zn$0z_gAF$i$>T!fkD+37lcYllIkV9=H5&4K{9&E>3J`w&26hp`=G}5$RjcgW42dc| z4_t-iL`@y2flUg!_$HqM3KF)Y=>TLnC^^nDs_~EiOQbSWGrnnl%T;iUKZbc*dXwuGnWSq{(Xu*_1;Y)4_J zwv1u1%p_AgygUhJ{erJv^D)flUw|}ggT(w*x)%@rEYWon{A^A|9uqKlNC6TIk}ixd zfW&F@;zpQsY`w-z&P9cPu_V7*f|OyJ;>TE7S#izq280MO+>%UtIusOe%g~-moHJL0 zONY4vtQ^oxcM<<&Y?FgzsAfbCK9jDY} zlVl}j%B!V_ttxCsVWXwf>Ic|>^jo9^+8qA)?w5|p7G(o|$82H>VGdf&;cC_kbggoG z7jZ!ox5!!A!nHU3`x}X#_DNe)SbGVE$6GALngl%od;yayrzP#uUYKLB(>mH_1XBu> z1Zt45$w_D)gDz|;RJA8%%DjvP-_d>%=f^EOV981b`PjD8&GM3Zf+cFQUt)huyqSc_ z*eq{SnxgU-n;*uM{dfPwTn|_TNAb^lvXqu%z3GT!JZ`)$N1~Y;YzYT7<{V&76KLC= zLf6>3Rsov}R+@W6TR$mzR3dFVJd)fn7XY#r#BZ7;Ji`vXP_u~k>ehVBRb1g^sBJCR zJk;nFJAMJzTh5gAIX6r5e`~{TcY9f1Lc%V{BtQtUoZ!rHx zR;4UQ1ztx;#$ysnvNv{Qr!S%U>OU;wrrpP_5jRE@*9`uA78Gy?%9h|X#qUL8j>_FD zV~L<;kz%V}FfG9&pI2K3C4zE00?Pt*0~7Zcr&+>}Qx?)JBG9ncAeF1e1+LB(gyiSmfc>kz5Et zz%zKn(l-kqI>FD*Y%5$8QZbOQ(SeHl{0au`#RH#xgE}4=P5^q=LeS+i+eCuxqQ+t( zAvd$Ej%F)-DP)3^$bLo5J+s72045%1Oxyt16iy16BY~p?E)p6zK=1?p`hy&5tQ~YQ zl#)kW#II#BCxWdEj-h|!>+Ihi$TVNA!&5Hoc_xW#0upk~NlQpU zFGdddMljJBY&a^kG?KYBEvO-ibq63b5&=ps~{6`4AK96u<>4^*Ze|YJNxeP z3M6zmrw=k55jX(JxM0yn3(kftX17A*jR{ylYzsrR8$=@rpP+8^oNU!6G^?8*Qi|#t zk3A-ZIcI||81k81ecqVb=pc`rQi6-qT*!$c- zvuyY|lCmZjQCZ&sFy)Qq#ppW9i|3Rn3D==+KZWH2m}Xz9fGK2Q=1b(onT)wqXTnsj zG?5M(n?7*)OYv*aYsD=tvzmHEDLFG&+wqVn;+$jFPRqAj6;}jLyKyxuCfD&@W}5U0 z30Ak6oyxao3sK{W1sQJFVcVs~v;F>tx{br|aMF(LET$tgmg#s>b4xwoj%h_Y*qW@y z8@HbEAMx&1+$)M9OxH@=3pHSB7bXV%c72$Xd#*ektQd(&bvlU1jbeu84TF(wEGC3x zgUm&sfy0Oe;}KhGS7p9}6pX%KNWzefRKcIZk2#rOgkU$5P;ww1WFrKo^Ist(qNG)j zss_v=UaG1S#wY*&xv0Gp*K-rtj0@k0pKnB=v5FZQ0l*x;1%z7$P`qK7LObhPP`|OY zC0~u^e%6h{GAyHblLm1Skz$>Q%&0tP@C=y5J)=OVrY=#WVEa}whB2w zfj^Dd6+5chL9_x^224^HC6&}gU#e%l;L{64&)CEjxhu=IF_aC}o(s~FGKAMHEy9gt z-#uWia51JrOJZRUwk!D4__JUH?q6`P1^0X_iRijt#AW1o>@LJPzKop~fi~){CZY1!+LGNg@M-}bA#%HTKE;?WD^>~8UGqfdZ zo&>B3PO=9Vj|74ZF8~R%~)(vKZ=^EavQG+iK7_0{+xJv*6nnMDfaljHq0`I%x z_|srHpc(eDgugUsu`W|khN-Ye$<-m{HEcMc>d9?No<>|lT1YlY7~gK6`&b!FX)8|_ z*194^SA6nT%;mdhn8^>{5#K^@fbm4UFb$In5?vJ*UbEnT`v|_lKN-Z}A&hA&B3p&6 z7K}F#szJn`H>+r@u)ed+k^!vUz)^t#N5N?zVpjwh*`l=l?rKQ^n_k2c(>0+@TTb2< z((X(*#pOuFAxD<>V1$B}+t#3#ME1*X+x#q|BlkKH((}L|H*KE)SPioPXer>FTUQu@ zD#c1y3|Cip(22#&qMRD@#Q! zfZ#SNL9;_B$ug@TS+yD?2mblIlb(vNo1MWGMH&j3Oeq|taX}PhkIZgp<1LqQ` z&03P%+PG3Au1JfUs3}6CX&jwfhjc}d$RtDsl<6#;2B+&yAcpD_-uL>SC;G_UA_&5i z#J`zp+teo7!gl!miE_x(61BGqBJ3#VCNB=_o3*Jr%N5NS->nf6$|lf(0uk>i(DIO6 zA(batKr>#LgDQsB++w{nhtsrN|NAff>O9_=^Ks^F#bJQofq7c(UfZ>Z2h#>$9p~eo zfJ%y*@qs90KY)=PAykzH>IH>m01Pv2NPYM_%#7qF%9bs(V?AC_LDhhv0Gx$?L z`I2RAOVUUifz^VD6&A$mI5aNeR{i&HKNmluc;xPgvU?4!5z%M zVP_)NFxn0(X-t#`%^e_m3UUAlIQ9xxH3M>~DbM$|NVBvnl^Q%livDq;b~^BS9`$$*9j_PWCtCoM_|uq9G_u*4P>qAt zCA_^Tac-?bNUWo1)D)SR&zvxevS0#mkp!P$PQV!nbe|v%emsm4dl}3M8K!#OSfVP! zBc`Nr*1-#&(?nZSsUlATH0>HtKke?9&S72n+bma^;^1MLt>XmfFr*Z6yIA2To%SLo zBEuqB&+zL*0gC^CX_Ns>z<@~QKtj=shP)+ohZS?IfNIv|i;eEs(qt|oaHAk+14`)1 zqBX+^_eygFmV;MYtbm;X7(}XAkN*n6z^w#;ZT0fc{M7|SzaiIK@PcKW3}N0wht!Oj zpeggXYq##@?g3--tkY5)`nKBSqOLs(x{JK_4uL|@R~`+N6bEBZeYwg^+#*%kmJ3S< zD_k`~^Bc#4wn>rXGKk`cd8i1_w#`e$%g6&Gg ze2F?2>{GXJ!}d+Hhy*Z~%k$mAN?3<8oPG48v$#4fznimu6)xc7oy2&vJPu?EDbntt zLmUAtsM-;RI0wLX= z(4y2eeC{CXp|q$*)uc&LP18JWCS;=x zEj9f*s?6y|bq*(=iu7|xYdn-&+4DTGH9spVQA=N+geU)b*nmv*Q@ja)87JT(Fg@?< z6--6gk31NUv@0bO;x{W9nW&kZgjsp)w035g%Ie#?q=rmB(@|ZIJt<$PxI@{hwU6|{ zNaO4$;#rG}A7neV!*a=WtHPD8!`PVZ<_kxv+oq;*$VQDASQkH1rRsIK2!r`W)o^pw z_Jr_xW0at-dkiXiPAI%7%u0}Gjkty2HKG9jrCrbd0MQ@g4>>d|I}c(dE}4D)939}P7%%XeGrN#w zUN-`8AlkYGtCdgUrO;Y&82Fz7dwcP)r5cms7PKpoaVLs7eZy^c-U1ha1zd>{?dChF zwB48>0ZUYUPN+r*bL?C61&cUDDseC2rI@IQhGYmB4&errzkSh5agKQ5@3XAN-z<(5 zjjeb|T2-pmDUfSMPKcaM11a{kYtbB>16EgDF9HLG8%jPVIA>};7$NJB$7ZPv>nKai z;sY8OGmOd`hv1?KG`~C2LxO=~5SbtD#!Ez{(WnHs*GC+iGuJRzq}Wn1mc$lnob#Xg z*K41G$KjvPa&>h4U+F-Yh3h1yl#C)X&Bjw&&#C1 z*gza@Mb=+7hY+-pD+8fCsL_g$@ovF9HpWR++4;@0FJEJ<5<$8aF(l7%opCR1OL{oV z_w^mY%i5Z!1>HkTS%Vo@21JEjeU4F-oLu-fDZoPeNZQs61 z=Gizx43Yy|yZjo~T5xe%8h%Q%!`e!=Ue{9i zQ%hN}67%zE`WcdQj()JfIk$iuW#JGL)*jB1i|Q}`!YlB*^MYw zwvfs>);70z8$Rco9@%jV=iJlt%FEG%u$PW=_VT0&c}iW->^M&;qFKD_C7J~M z9sdk-#zN;gf5D&pIM(J5-Nptmb|vStvpaSytnFKy-cLI~tjyoL0GFGSoRhx#*dvE9 z&L4hw2PBZwBqZ30o3`U=Y-*)3k#EncIhjm7logkj(gb&Xi*6w!eO60Bb)$G(Kq9$UN1 z%OK}~+g|miewyW7$zLfIUiTO=KdY`U>3JIU%0PmK39t6 zw~3caFZH@y)(Tq|qzWbMIv~h7#OBg&H)WYg9pgNyq%qeU#eOjYt;XKHY0Xe8bnG>8 z|M?h8fBoq%#&z5my-76p$vDTe(fBp`eKq8KZH>n{W_7@V&@Hw@#`(g6zH0JVLT6qU z?9ubm`?K^m^}@F2>m9NyhkRy2Z86R}$houAd~YsskdGzf+~$1y=NIn8eIi+()4qub zjPuJ`)8?G+nmk1Na4ZERYmfan#2z~I@YA|A&5i|@VPHDX zK>IMyGtPc170syNJfHhG_eX6^=9X;RMOAcbwKa*z+Dz=@y>7wRx4&(1(Yny;^0wk~ zo=`lNbmTqvcv`kh=7E@Fb8ad1qWL`JJl14F+i@O@ z1L=R9fAiH}dot1MF7Z}3ZQ{9wYdPcGjn=ibudl7i8+IoqvTJkg4W&z`$;2e%O?m5m zoTt4FsD{g_36I z%4R?EV1ds>%7PC)_eC!!`lnmj9#YQh3rr|?xk;-|n{cIMdU{jtwS-698gMOK6(}pJ z^|xb3pWSja$-9VbA}c~x8% zJmulLaZd9Q#rAO3ZHLYI_Hb~PasF^Y&dJ>#SjU_Xawg-eA0D>vf8-I5_giXBA0c{| z=A82!zOr)7{)q{HwVX#edtmQ;Z6_c2D*k$bje9WL?|wJ2J9{XZXA)|USfhgT_f@Nm zmEX$BAsM{Z!{&1>gKL@V43WFSE6S0~D57zed7PKkhBbOOj*?G%II(vKS9JX`177Eu z!}q1tD-)SC*8QE6wEjk|#W^o?oPWLYg?ABs?*VDIoZ;AU?xturVe>3sob&Fl;+L6a zKdZ6La&f+enQVcdZ}E24*3OlzpNsjN@6vjD?CY{? zuD{=aQEq$leZ_t~&M^%JHs6xijmLaK?G5|H>iO>=`qg{A_A%PGe{#~-@FbC-=VCsO zBk+7K>wBx1osLI{^L#rpP!>$+nRgQ17_Q}FoF7VTudTV9<5;@cq6yPsJkFbl#|0s7 zah(5t8+ZQ1sYmfXF754LobQXqd7SfTPxI1T9>3#UE<^jK9>l3*X)ukwrs#Qz4xJo) zW`}}fv2g~9GtdC*LNY<1PT`OjXuTqr=+j?-HHWOi#fHX~9SZPOY;DoPYu)&zdE1qakq(nQ&~LVx^K1q%r}3O=o@c`W_3~-((1aygkjErT1{ad zui@@pGOsi4!F^vresSVy$5UCgM>fqjgBMF{*ab%){6AzrAWxIC250bFu}iHY`vymi z1G7hvdG|z0E$eiV_ddRnyr<-yFY9RC>P9?s>y%*SY$l$i{|0Y`lK!mYEtW_zU=^>- z;j%VkuvJu1D4On+7y~NR@S{3BF>pMB9p!F78MF|;CM*HI|G9tkIsCRou9!6H__z#A z_M?elQ5*t~x5+dKSnBalfBk~IuAN&&0Z(qgg^@EtY zseUasydxp^`1blrjVddfWIq5o1zX8*9UF)qhp;Q%ELBz$UwGL+9wmCz0kOxw#ozv9 zpnk8~Wlr648eXudG27r(z**4zTPyTTmVVsSwX}rWSE<=|29?pYOJDR~XR$t)3xi9T z(lw5hReiXADpu-ZU-MQvyea2fW;O2#$0aB<`Jijrhk=(lu0HtCRk)vh&1=MbrM5-U zPK_K_CKZmOQ;HO375jRp89(@4BwVQVpH`BQkP}}NY6~<`G(pPdxZ&ysZ<_>e3MSD+ zE$HXjgucN2=DM>npMQmJMFt^=Il69`DHk&F5I*|235=V3ERW6SNwHetdlH*$Zb*W* zQB8LeoasbJWF9*E*YUfS-+L^lnZK972{d?5ob>P!H;DLDAoIxwne**n;H`+GTt_f{ z_)h8CA*y))26~z`8y;-y#7k^0#zoiAKmE(qKS1>7zbn~Y5~9YND>Y^oEEV~?q}sTQ z+6<#hM5^bFZIatlV5LuU#c{MVtRhuuzCmbNC6Jb_-1HommaiBM0GWz(?DAq>71!L5N(pt?q?1) zR`x@Vn#7pf9#jx{^=~bIkLcIW^91gTJ^0i3Q~Xy$H&is^_o50=DW?i-E6rsDzEdO8 z#zaG)rYSz1P~JotUdVduicDvUd^)d9!`5hibtUVL3&umeh5vmsKC4% zt4_!ggPap8E>tmV5F8g6imn{z3cH5KVYY0yTuKR+uKUy#*Aks|rKr~%j?Oa5V5KhP zou*b11e-~ZfVETG3f>dd3REj*sXS9)t%zPAF63w+NrrJM;>1-ewN7}eN5779|6`|% ztie{}{lgW!3e7>CZx6|XY?wq0_kj_P4?rrI@i!8*jz+f)HLI`qFxM8cT7HgbQmmc* z##?aD0&7J8XA~QQSq3jeJj^v5AvMi$PsBf)6NVg7HFL7wKxze9@m8|^@(O$vkTc$9 zZAKERq`s5g?0pegKt)Z&LF z;-)2{RqdOeO?DzI-jBDQTH*tjzS(=+-w2F~z zgoy8qX*L0BjmQ8On3AE+qG_mVt{dL;0PxTOgh@^XtVoetBztF*Sp^D@AS)q=HKIYm zf9B!z9Iyv}!4VT&E&SwFXl|o3rBwIOBUh|o5_#TB9T(^R4 zIkK>tjz&EC;t11nK!c`o=ou1P*aP@o&X+I|p@~7?9bi@xY7Vw)X^QROG@OlTOG>sN z20JX^KPu&M_r1NKAo93)^#(Zu{p`z_F&(&y3?1h8>EboS=imy=v`bu30(O zw!5MRW+7|Q)8jIcX{ft?;^0?^ei`2pVW?m-r%m!r&`qdnbO7nYz-Eb5w7Z5+DH0jX zJoDiB&?~%;bOX8@;T&1<*JV$|KDCj6K?<`ayf}llIKcAJq{j*LNpymsc<`BUb!!!` zcD8jK9G7M<`TvQIzMlyP*cCQ7{XC#a^ZRoZid|ONNWoi;1w6KfszS^t~J8;=$LQUc>!ZG3<-S>-Et{*P!+DkWw;ldd6N@q z>^a7r=y`je|0bdj$h|oYzB8fuo&F-8qm%Jc!LaTCd~#jrp#{@vT`!iVwyYV;&C_g- zzD8=5ABj_uNozpvudsq#cM@x^UtC&volK-x@zoke_V5PM*01CsG|IBVw#FJ-stWIK z`NYq^p6E}%Ds^|_8s#Es;B|=ux$rx`;2|-&jh`4vaZpE>3IA8q+p;9YapRfJl zGjR;PFrLq~>nQ$+HlCxiHrY%HbQLC5AhA>;*>oENVQ4R#YKIjKyR-&7F($PVywP79P1PS`mJjBM~nMlSp zJLJN#bR;5Zj#n>(GUC>5IP(=>Cc5(?XTdvwlmt^Dr9CZDgY<5vk&PuS<%B}Rg3@{* zzO$|GcmP_8Y8jN(ZY|T&Kw!S?BL{%j?hFKr;d2}Xk`-C^diSxl(on8FBGX%H3o~-Z7vH}JZ_#}~ z1QfcH?Hkvto%`xsQXCC#<0rzBJY>72lu2@5wT9o!{ir_7;N5l74b%h zt31)WPrV2|dc!B2c=Jwbats9$EH-NhR|lD)AnB$_&5_caD46EUq4W6YyB|c6pq!b; z^%S1iPq6e*jOn6!=5+NXM341{LOY)4rO4jIOpSG0X)>1zr=UAhGR>9NHk;);q!b6E zgM|bOBt{CzDVeqvos7-eXg@W*FD*_LVg2N0~I1{ z_SBgPhXoxi1SgDw>wri*iN|3H!OAvm+X^&k^g__RD7DbBxBRR?iG%B|m%aF1xW+Z- z43}uRMO%7j70(bo*eumpf&XZvCK4CVUxJ_V<1bA7It*KpJ~ z#oK*7Q!bH7j<*?}tP@=XnLx6VQ&~b>Z@sg`lDRlH#pH1MG;1xYtYHvB?lQcN9iIE@ zzn&&~=X+B68ntA<cp(n zQ58}|Pb50WW&xc`rzCwCDdPH6q@R*8(M1rf*`;EygCe;3#lw&N6w$Ns-W(#u8!3z+ z{?Re=RYy$~cvLu5PglZYdTDZrHS4{&|1HPlc+^=Ml9@b4UTiU|)>WOI&VF&`Ui_Zu z$DLx5KgNuu@>4XqP(;ra9z3z=;3l36V@a$hOgWt5K z{~dgWx=z)}b@JQJt;rGCM%S-kZt;Dkazp|N9b-a8kW4kjY{g3n_E+(dx3tn~NVVdn zjCL%T(sGqpxq5vSkLm8&BP^4WcC88D1WYlx65DBF4u+rxW7b+7R(n>CZ9_Y*UuyrY@-GHqJO#=x+Ediyp|Xx+s=mw#G_vhFmFpOH*RhTj#u*rA zV4Q(*2F4i}XJDLxaR$a27-wLdfpG@L85n0^oPlu$#u*rAV4Q(*2F4i}XJDLxaR$a2 z7-wLdff36sZS4sFDSh=jXFJN6UZ^Ken@oA8ycF^n@X>KPdI zalUb8xy~br$BflV&)^FSo!eRu$vFNI!dLOe&?wwBd}|?rN5=Dcl8lnD2OeNU56PA> z{3iMgTiWdc-qtmS(lam}e^miF=a()7*u?Li-_YP^G!8N!H$vZhOQljQQ=~fx`usdU zC3@LU*|c)ZPs55liH+6_D*0_`O=oUmXK*pwM{!Vx677nhKicr2~nWBtd z#r?!wae3S>&jK@c~tZb-^6Md~Z z_dkgi{whhSe5le^c|y07i%$6Mv8DqAK^wR^!oT!8+cT4g;q5Ux$xsLrLTomEoZ)|tu)B=v#QZu$+P?|TO~ z*=8zQsbFSDP4$+J$WCttj$5srzcz6a(R*%^2FkZ9bDP@B6m4=XtphPx6s&{u9G8;| z6L`n}*)L&MUTl?Khk2N)a-5b+YCj%yxeoiacFT)?@7eg){8G4Wk(r9y%n%vrZlY1$ z2$v;WlG8q#jh3w5b-~Aop8D~4A?^dy;HN>Qt9dn(M;t6IacQxf_nxZGA}GpbK0Wwl zcD_hL_rfT@IC<^O_^#rEeh2j|Sh29=5nmdQ*m5~t?Wks0N;Zu21^DEIgzn?dGgh## z=BN}UF3)Q3wD0cT^#r27`)sZS4p!%K`XZXXv`1gry!!eXq93}ATcWegVS-)NjXM`ZICF3jS96(gexs{g=q=Ay2Qh7is<^QO1r zc{$|WLp2!?z#2g^$$3KRza!k9W4!nB%E)BiSnAhNWZs%m!D16Da4hnM55Dlh=zA8m z3>(!Pk_ee*(Tz)q8lf{$R>v#pM|Ap@z*Xiq+ic3wbqwVlsB(Uqd1Tt&MwzvyP~b(T``O!e@rtE_0L^x*wk=_j=BWyMs!II-oU3=9}eSzqM`yzRdPAQM&m9VHmH+j64v~(z{ zrEC#XCk&WVp=PoCO!U*oF6Mj_wK%&hsY5&g(HIHx5gaZa__q2*qF4Qq<;K!gtlPu9 zVVfa76_XQC4sB{^et;q^I$qJ~mtADzY2*x3@#*%9w*G^hSPr!odPOpCUETh_h~~tO zA>$HdrMIJ~lM$%=&?6OP}2d{=Q#rHrNlE zwa}cvYeG72XOn8z1l_TQ>R3_)O$%|A@Z9|32tJt!-(p2{XuFs9SLxc5zqz02?qAL7 zqOKxZgomyO2;^csQe#wQ>Zs~w(f}!O8q$fgPP>dovpr)~W$Ol>jz~abua4tMw_m^a z3;1&Dp;)0gFixq)sZ%0l64YTuY4@I*6iOr1mBApwi}MXBo(m0I2BEGPNw7t!CUc&V zI&T!DlX=t{F!u5!#O;48!CS+d0LqOj9Vh`Y4)YVVt6r}kypQM~?zC0$W2|VsZW39> z#hH*C4oZDF!L5mCYXoP3G-9g-M~EQqv``p9a~Po4gqLhMd3NBLgveOb84)KKwM}(H zHm#XkYm%%K?CVw#T;~--^V1i-`}=W47k?I_FAI87rp&a`+RPBsDk@#=qh@k+O;rXd z2CFcuHB>E%x?@pQqhi6-JyGhYDefk03=<6RE97LjOHA|xCwk7xK%rW#*0ofH z#Al?IOmns#?G7CGya@Hb@ouCeZ1<#%8k>9&jW9TFMReDNr+FLrcUN!(%#DrpjHTEN-`P z2Qoz&OV8P&#mHiVO;kwZ!?#Qjs8Pk@e7$9kN$|&(kuv1R@<5VIeEiLK|0eu=Sv384 z&{C_pC%RUN4$^6GLbFvTX2>um8*EV2^t1)=(nC5ZikxU7?uvk|RlnxY^ z{);n?)=}Z(kOc6?q}7<@Wg@1CrzLx<{n9=A@lB}LV!fCH>?O$|I*WU*4M3_punv+o z7HOLzMr(R$nJRP>TC9Rdf;o~7EFeGfooC|Q|Bt_8X};yD+?rTE4-ZZ=%(jXd`PS9; z$@9^-w&S_VBgLg0UW?g|qqt1_R@r^hiQ3{tr}9WX@7#o_6SObP+ffBpQvF&Wb9|B) zDtw}|aB+*)6%FGSDg$B_cT@YFfJ5p`YCyp!X6y2^7LyRhSPvOU4tlxDnZBMh?}gaz z?_=3yPD(JUWWTGJ*iWPqEZ66{k1*Xfz=F72kZWD<|6bu`2Od01wEg{g#t-BXd!m`1 zv^K6%@g&zt%(IP)IsN?^$vDay^ZlC0& zgA!6^GHMoUN73yBhQRNj5k4b>kLL6@&&=Z4xu5RUQ}Gy1IN8?dUY!-_C7ucdq7%Ec zL?*KA4w@G3vzGX}Vg3bpR`I7kQDo2*F}k6*Pf9n|a%7YCG&5T{Z>864sXZm`v>Fw8 z-bJU*11;#B)UeUce?OI-bTX+c{2 zcpjL80>91V4wmQ5O06im6|*&Oica4CyLcDZ=Ks@Lu1l`A^2VtZnOvD0$L57x6~i_xxF&K@*61KYO{^p zVLD8-{J4B6o71AGis<>aPGoBO(Dt^On^rNmB=7n&dAZ4q=R6V63j3f*J=aNr)o#h@ z{kXk$xAN^Rwv(9NV~!9VDNGmiTk#6a%f9Y*_#V^?tQM1p;iK4l#L*F6h?-B`^){ln ze>fH}afQ!Lb(*m8YUzD9Cq9!yE0NTlc{4|=_&w1Q2aq`u@e@QPKq*E_h-2fJ*fvSa zM8~4{pO+n5Va|s*kru^Z(!(k<=xip6bS<}=t+!NPHpn^Wy<4bf_ls@~lqRowwv@?v z&vrUdG(o7ovJGQ=?_wZ~Cer#K+S#)~!)y7pQbcE-=^eJ+;UV2Ov~|*jhpDE8Xcx-e zisnu}-5R0#qkicWJUjQMX2o*sH``qgN|~K3@tb~HQ9pL{dLp%_R~yBxDds5WY-9E6 z@S-_tuyUcrn|sZ9Cwi?~Z<^(D&B6uW;WX?=qpdmm@u1j~RK!S>3p z4doYyBN#kFZgsHOs4e2p&Dr<-Z`26Kac#T|7=*-sqXWwZvGU)@!sx9QYZ}R(9lf~2 z5E;SH<=MHBU!V8zMW4`V!$)vuj%e#>#XS5hjXg#guvc|fBFYG$H&5ak*Pc;a zSCdDnMBumpZLdLd+_=p@QZNFedK}_71LF*gU^T>Ct)a+5i0gX7bLcl__ebN?GW&T!t4jg#wZujcK@z$)KqxncXr#G4!F z=ht${8uj9!;pczEbMEIIgUorHlels5dD?st-mzfc^%vqCUi?qHre9y2 z-_Zi({9lOP?Q%Z+*mqn$e4p#>5jp=f(d*VN=TEz4y)!U;|Hscb-!lB<_2}^+)iKTw zUYS-OUi_aq*`!^MYvT+IAOrWBH++idbd2>FOk5c#{+zOY%T&it=tl&Mnq0v<7Vr#u z1nDmiMvU^&`kwM_Zgh)B4*dJtt@K~sj5zI27Jv-%S5cZq{Y!@uMh(jN#BL;X@Ke1qH_Qw^`7c3yZa(WT{>YV%@C}VFuj(7HV%tt;xM8l_0c6+>jnnEHJ-M=oY#*)4Xlu@U zGbOfR@lIr#wUW!2IlSYWG^wt{`n;;TYGrBD0iP2I=&t;yh1X-3G3gMxt37MQ{5sK- z>?*lC)qH7{Pj03fOR5g>T%b9K4k<3y4yD_PEgSx>LVZ2PO1sdGTmH(?r@ox%t4HGo zs<<*}T)WvN>&IjX+}TSiR%q{*>DLf_DEVeLqZXGzhfbe zRK=AJaNSboXQuSoM2~gH(3YZQHln4Yu9-?6{KM7)j=%h|Y5~Jr#uW-XktxO*REzJ> z8IdU1WF|yaAO^CFA}#PI%a2oZ(tD>9s==iIeqR)Wku5eEFP_XLSSGHw#ar0Q(`9kv z7%A0MB~PMEysVx~2o9G99aiZ=;(I|-!^Okzk|3?EmR zoF$VY_FC!Lii$kOctmc4-hA+VXvz(^Z&4C-+y5oGZ91%!Wp@yE8uGYew?l3ak(@9# zYx2$3qS;ArxIApUh`LYF?5=qz&2RRa(xxGe`eFL=?JKG5YXNYS>emr{{~r{^Vu~2$ z(bLPkQtXyHXqpn-<>NrvCN&!8@qMB!xx~60R0n%xZC)Cc7=PMS8NI11H{my2KYel9 z@?5$a*E(_<<+&)^fj-29#qH=3H$CdbYIojs=Q7bgNv@Cz2CRw{FzzIE3f8w`&!~Icd7AZz3HB;&(dr=y{w~l^2Zy$?Dk)B@h(ktD%LK!kaq~k z72IG%-9DbF_96q4s2#i#-8glHH@|+7_y~^w5(hAh6nQ7hRVyXJD=!R zwxtYN=Y6a}WxB9)M*Eqg4?is*FiSPbR!Yd2iOnj~akWGI)bs8*i|8+Yu>3zKx-EVD}kwwOT>W_u;#(0|zy54?}QZ*hk2@)R@v095uhT zo9F|7)|FC;!u=hMN(`hsQ`(8Ec4~RkLVervwM0*Spq=iB@y$Tv)%{to^ZRm&?}zqh z{CL&wGv_!5#bvG8zO59eS7wh9okEIRHRg;nFwVd@1LF)F2N|gJdw8lSqD|AsK_-UR zguX9NvVoc&Uch5d;|z3}fxgE$R_3#_a5`Ipr7mM1VR6-W?A1y9sIY%CeaA6E2KxNI zkD;x15}o{+^=h$MFUMoQBb5Q&ceMP&xzSy>_^&>XQi(3Z6?l6Qem&yG^Gtm~-$QO} zV4Q(*2F4l4$v|Hd(>f`~%~+=p`f?k`KgP!y7-wLdf$}oorzW;I9DHrf^y!OUPxQ-d z1TdVK?blVUFIwx@uLM5SP4&{g-QnAzrf(xX8<3p$ti3LZYyHQ(gXrOPiCvubAOFx} zACL2)r<_*t6jq;bSD*T0^>GFUo`DPdKK|9Qr|5ylc|18N;R{-3UDqvrc7|Wwu1~qP z){9>>d0nrc_Y!lg(`T3UslKq#r-8A0*BK~brQWsA6J7!5Ha&o7?O4Z?q8?(7RN{GN znE3wv>}{df`TXNV2c;FmjJYgdQTm69?vV56Lx*~E%5&1%$d2>g+T6d^{{3uYq1P)H zVVw6L$%$iOhs?=6uUjz2M|qh0S&I9+9NdTHDvVb+h>U ze}58ha5?OLA6ib#WwpICJDit6z-D|aD}hVDmEZ|BQ82gc_=!ZO8GHZAu|=ZyKew54 zqEpgq?@M#eq)xsM-&H)AA&#r#3=B5|M%-PPaypl}W`3h^pMz;44MwVI z-LwSJg&)2H>z3CQz0)!)egf6gSIN^gA}l-r^*#9s$x3IWs>hBI9W@#1xY{lQic{9x zdns?NJWh=lElmk-a6(hm%x{RMsKKvh(J7gvlGaV=f_>_e{eN!gXP%fLkE^6w=75vh zpxrHHikMZJ#(aL}PVlQmGA9~6FAjgUl?*uL2%x%BAkLd3nY#}mcWip_oe(iZwtywg~N41D9lGWOgHxgZR zZ?oD7Ov%h6oQd!ub(a>|3)+n5q6{uqo}`F==vhVl6PK>rG@UzUcV@NF2R?z_!{;Gy3+{403x+#d(R81WgH z@(7m=BegK=)Jb#FLtVHXZVsLHA1}vu75}nB@e^1qIbJGc;Vp8?ls~n!OVX7u{_}q$ zy4zlwY$tr8@J((*(^RQxl_SZAS2@Jy@Pt%-m-=z6&mSn_k33y<--0+{37%kV(blHB zHx3PTCY^&z3yq$XPaGv9BiL&wXQW9l7v&SLMjl))3elCvJkW;jPg(pG7oyi3o#;Dtn2 z9BMCFu0;BXRIcrktZCRW&X&qgake8MJ==QC!uF2+*wlX}`pOSF+v6ge0e?i)X-3UX zEwgEAsAZ%BU64EHZo+Q`E_yxe`pZytFVUVpZS)tx0JL*<`kuVBvcowm z?37mC8k-FEp6gdy$(&$3-L}0fVY9u|RyIdK&s~X}KlH8~)|lkJy49SBs@8U`I2Cvu ztXI73O^=@aXQJ=?l&=r1Y_-=8Er_;`roBW>`GcvaaG7cZMt)~g&3zAi>|vtUoE}>m zeZ1CZ6I7FaHsgl2v&?Ff;A%4|EAwZ|cm4v=i$0g7mtNOJ7Q5Ifi%gVFS2+eXrKwWu zY+Prp&0aBk*7&{9*{p=RWH!{Akljs`P6(3~!kl%^(>swpab&{WlpG^{JH>j9N$HkK`@AhgjO;6YC#Go9p%5#T7C7SE%Ac#~4cAOa$DnYZD z5yG=Cd%_2a&i|6*W)Bq|9*MneYtz>XOBU0GTrf;4W&y7koqSWZd@@r_F{^XV?9Gq9 zg6QS%?_8rZN!6KHUs6p2Bv_Nd8EQQv8k#wiNZ1qLCU{D9lxgYmvX{(%2{3`fnXjvSkGe?(o7+zUxrEycr;E%!tEZ* z8ymefKlnz7%kNwI2ckP)7HEus&fZY8fV_BGi0dp*IYO6qvSxazr(C8g&DQMPQcL$@ zm|dFXJD^N#I`j&nc{~q2s^G_+FQpwvx^GQNKd764F`}ryY+GY{Z@clm_%`uxr%dNm z@*~O-WRfYM=aK7Wv?4i_HM!`*JldGw%v@@-uEEU=XOLShdM{9 znNtcymttj5MyiGRFTvxLo99-E4(0yJw@dR~jHoUx2l4c*8ps1ijJ2QR+;L+6wH#W^ z2mW`PZ&)U}>7op|Wi@BX+ETuVS&E%O^mLoUs?uSlYT_jjaUW$xw zP&&`5&4b#_wISwee$RA}uq%J#yE8<;|BPU&C6e!^rOIeAkulzJOkUJFkJt0B;3k7O(E%uz`g z8xF&c&&fW>h0D6i2AS!NEW5CNXv;ac*7B0ndrAw1PY6aQySCxxUT#Tz| zojB^$8`Q8J_TaDmW!WB#(y}}UfbDSw z)iPQWa^et^H5vr6j5hV_>$C^s{Q5RxCp5d)+!iHm+0+fL%#>}m$ldWlS7=6GyOQcl z`}j!Wa9dHQWrK0PJV>u2xD%<64@1aL1nFAD=p4P7>X^$H7dzJ|PjW>1!nhWzbjy2> z{@5PHIUgTG(+M5d#u*rAV4Q(*2F4i}XJDLxaR$a27-wLdfpG@L85n0^oPiTI1O98u zqg2M7HA->&SmXG|_&5XO42&~SRtEeWGfHLL_EC!4#~Q~!#>W{LXJDLx@-h(5GNXdW ztsj+`<2d8^$M`q{;|z>5FwVd@1LF*gGceA;I0H!r{Hk$K<-*$9TG_S{{WhW%X++t! zhhZJVAJ=)`(=dF9b^WE=pFZ(&HJlu%Q z$779Np3TXdZo@l@Ug2I1QGU#W$V1vD=i-)cf9v159016RCLUkvdhwwbFTa}TBP0I1 z-2IQ-|MdanJD8j(HRm+F?+Zka3}Ou$A|5<)`M+F)Bi-Pj-EBhX?XXs}iGJ zH&cu9nw2`{-|}F2@6E^X1+?B@7*Jj)Jz6qePkE%wvayGZqH;~Y_WLLI-b#yqT4tQX zx0QY2M~M+^<0+t4>UrojKlW#zHFW8lN{n)-rp$m}jQ1W^sI0f|s?K_@`IhL-dci?^i6#$6)OYcBp6~Lv(VfO_=!nKj3@N ze>2MGp+>%j$kXlsz~F_SFk9+Q^wv+$!0cy6c-=C9L}yLva&wL@EVU1_;SRcv;0H9q zZRCoN7Bq*VJed9ZH{X?9%Pr6D@nWf>4Vt1#JESD3BA#o;ooAG-bOTZz7bX>nv>V6n@> zVpWx%m@BLAdOy+41K2Z554DBC8r8J0OK(S2ZNf2H$qd#afUa1ledV2)&wuoH2%|j% zrN^JKUrtpKY2;)eVEhtV$7kt%JG*1g)Xi864QxIfNG@Wd$iM&xhs&>KkDaYud^fR1 z0le~W|Kue^Z+hJT<1X;r8#x=xFTIegkxy#VC+BST1B%F*)UQDEWGd) z*e`w*-#;5eZU*d`3)U{>!SdtY3S-CBw-vgYTia&xh)C2`5KOQ@>JpiF&u!?*-x%d< zxzb`B=mbg~kOXV;T^nb-q++7NV|=LJ$#v-|H#;SzquGp{;ly_nkH zjgq@xa!3*V!g(DB)Rmy!^|a_T?}q7CbYNJP;mvaHdTukL42pu0t^;lDc;DnC=9Quy zsI~4!;;Qn`i3XOGQzmz!7f(5J`1vbmHt>l-&N2V`T4}BEdlqcNLrHLK=eJ<&)>HyO zSbyj=h#&`KQNpgFF@YK`#|kTKWTFc~fy@Y~)=uhrCEEcGl?YUXr%+>Su}!8ZOYVD{wv+YZ%yag%!!0%$Y8k|2>V;M0z=8Bl zQ$jqqhmuXt-Y|#8tSo2L?XBGmaRXOvZgK-m`by>U3yGW_H6zniY+fY>dz{SP_o9!% z>Z|`#q32#1ab)>6w92PZg&5u<^34bCCi=uFErmjsTS}Q`uH7fKFv9*BEiRDFWLH(q`WZ?vk)bzNRUpBe z?K4$PTm^3Di0)i8Bgq}10u8m7ocG=TkLWL7m(UPdXWbQ4Vnjui7>~$|np9n-YJF5R zRr=8Os)>!tbh7;PR3&1*=5@Mp{F5_RyqM^`tAp;Kk*GhL;%@J|d8Bu2M76h`mZ(yV zxD&Cbq@1KGX_d}uM~~M2nCNkbJCly3QnPH#INorKl3J;a{pzDv@EfiNKQfp^nHFZJ zq7mOhtUarF?5B02<42lNR5NKt*ZOJo=GxAs2jSwsJ++xr1_h=WO2}^OfyQZXmwJh0 zLu{7m&Sj!IO{-v9GFvIG8?Vfv`MlJKQ6;qLOTYifb!W_1$xh)&tmrs!#Juc2pvnn1dAhAt0A2g~>$~RunP_L5`$U;5$X$CGib9ll zRgOblj+v~L3(V>j!~gBMCfgkMtIljtJ=Lwno>W^al{Tk%H;wtf{aK7M|-QYc<%fk+>to<}6Zk0pZP^82Ao^%q?ZNFVwQ1S64#$yLD-NcOU@u=@q z_u4&b^y_J5(hwcp+oSiA)lA`1p`D{L=GkH&+lpB|aNhN^8qc>}`^6qqdsb0a)1YvR zYD?JYTUAnkSDsb9f@sSHC7J8OjHFw4p}?Ze@`lOTQ69}W%-uGRi zs|WZ^rTidk)p%0Rm&s6drar>eM%Rrmr?KL8oqU(mf?lm`+NaJT8sxXbiX!854`9bF za<_r#+h_G0(S`oUzQc{oba@Ch5}w@-H_}qQ)tAjOt|Z`ZJ;1Do({=axz6+PWO7!xF zh8;-Fh(|0iI-6fM$O%L#X*%}YkL@9PXy`e&!OPsz(FC)_Dwt9lz0O9i-@80XbPVT3 z!-YCu%B|~;^39Q9hX8agFX9_^GlA>N!(X!5i`v8YyAisfI$4{=FVHd8hYp=h>5iAs61T{mwGi=O#))j7MZD zqQ^2>yyJ;KtGEH{yU%G{iSbtIccwaTrtb1xnyPct8(4DdTlqM49lzLe*uZl{7n4hV zc>Zh3qg0|LNV;7=lo2=57$C+25l9g|mgyAF?};&WoPlu$#u?}@1D(!68%b{S!u&-< zZ^3Uw%baC9ZQGXNwq*a}wyA@gDGQ;L=OGk>0?vX!m@1;e~v{WQ@li0(~uDF}oPQ^!{SrNO8vF zeCXY^jBhKLp?kF+KXY<-j#syLCqI@RXTW9v>vK%z3qxO@8*z`Hk97z}O#%E6L^{=EQhbuG@NdeKwXJXJDLxaRxfe zK(}+zMv#wNwh`j#HikI}iA1m+QYt^kw%9V85|Z z;q~zNT6&B(Uk~p#hVpuEh?aH`JzSQ%;%l=pC&tV2JX&_fIUjz19XC05zkeBi2D|lm z<(7j)SB^}$-8OG5KiCYI!J046`ZE7EwD}roc@BnWiGPFvaBDDI*^t{~i;8IPwhbBE zaT?UEblYvW(n+@-r_I}t%`$iwm!Z1Zkii|NLGhhA+?!L_xapAVV;E=#G|l2`x%evs zbfJ-$6XS&nJuv$IaZ(RHds3O;_p|eFp+_Ios5D`+ihKUm@w_rB{WXqroPlu$#u*rA zV4Q(*2F4jE%77|j^iKbO?7a(|Wk*#ny!M{m!|ut1K0Qou;C>-BohE5Qkd^_$HAt!_ zozQ{g(m+NL!E_J=dH5lS;p)An`lJI*4A6nZ4-~GQ5HLnG5f#0Hq=^9|MnMqe8X`|o z(H};62_p0T|EsF@Obk(Z$s#U8VyY}PkZH&QQQMSQyf1kEvb6Q?d zWRrF!7rJzJ2fKRzcC8#`<}rMqN3!nsi3V&h&S`r^+USm{R(t%B_3i(+qN zaFe}lY%?dn;SAifxcRDWuBI^W3he%XY|r#JH|2QGAHv=ZTU(*)u3!U~GEI|}ZrXh{ z*j;zk15oxX^P7q{+?V%>Hs(seXHhjf+cE`YFokrdDc2i_9xUa_cVBYkT zT3$6%B73%cJzsxe>LKC!dE3C#V{;Z6;hHqBPX{z|HkMb9{2Q~-pw*h;kDxCuoNf@= zA*7Dx_YA4qA^!Gp!@rBW$Dr$@w?kMl^pmY^Z9=T3Y<0&FC>iTxuYAY9{-Vg4Kd`>! zR!a;wwNl%o{+1YWG$C?7fb`sx@SXWXr`}htn#PK3jao0&Sp5q@F_R5j=(5iNzIE2T z`6K5Yxme_+t^PLgaD%w3rT^b1WSO1ay8Hg?#mcTHun|6thPB*9_1z|7o6NV$PR)%& zPrK-Ui=2KRy^F?{Z`AIX3E(t9Nge2r<M)Qekr(93Zu-KKe`BRHPW42Qk5{QP?J(5l~aG~&2PcCEUzFfbXg$-`8vS&ZYaCjiBop$`fgcJ zd^pNH2sN!8;d{D`W+E{YIjFdel;DIGO+jo%I@?o|4~0rsd5U&m&0dU4r@1H;=q?PP zGybgocZj+7TZe)Qnkc^IdC?(^a_oR&5_eVSx+v=tdNqB0O-Q(^RN-uu*caEjn;o!G z@qyy?=DXI}mSkypH;(@<|OOs8llN4jcel_A_HPpPO;4LyY|69p4;W@UdV zu?%TNrV}-;STQ?Bu$Sy?r3pUi_+GBg!>Z*@ttxL2{3(aqCyD$?JIGeos>W97F?skY zS9PTtJX>XW+;o#lO80QDTJu4&jpw07plZ$+)Ut{S25y3x6og`j6a+|mmI)H&G1?n3 z6k8C0g9;Fj=ETV*sCCY4;2dLy+ysEP#x zA**uw;s)HFHdWJ2tWJnrwW@{wiEem1MPS|Udp#pmrlM7Pr`k4^9qe{bh0RxHdYb6X zX;Sgh>0JwVirn?Rr9{5MgSJtonJQAHSMj=$l2c-oU}^5U z)?bQz66ZxF*b=Q^&D4s(4ngY+{3e}hJf>~Zro8pQD87?}pKDlZIe#6x-=7TshoJ`I2btBc+cGVOt z4R`SDYkB*a$=lAe*th&&+gC%hyt&v$D?M`CgT5olv$~<>y`q7kIx=#f+y@qVB zx8qN@h~aGad!YyS+YahswX>@Dp!$8}IEie@Z*9VSZ9ax5)M%lajaRXMriFOV&X@k) zXV~Dq+SesZuC?JfkLYZX-M*D>ifJ##B`!Iyc22Y@gM%vDK?Q@{;KM2%(((Y}TicB% zojQruJo(AJD(+cZ({yVxVw;FtNsASDPj#I4bb2f6-MFpu#^+}+HSyO0$I9>C_1X>( zi(;YDQ=$;v8OX&WSX_?W_iM`*wf-RNIJJeXxmDyoOE9MfhhkuejDF^pcZvMy|LUV$ zk*-M%ORp)%NOcg0E*j}tzP(?j%Tza|OXR*GO#aYgv9A0O?$0%XX{2reaqvUpx|LaO zTab7tkVx2h`Rr^qi_@abgka!S)+!lTE5xj(yz}Dt|0j>EWG=2#+ASz4*pOGVCR&xh z{kUNjH+;B_gU`Er{f5g@X1l6jJsRX2s-`}aDA9y7l-SMiq3F1I;9nze5beb*o2-VCeFp6FsbemrkFo3ea?D-Xhy!6n`^;^`!hNsPK7&6UI0JwEU`ytztJh%a#Z8w6 zTGKaOOKD)^^%>o+trPOHqOHd^?)ujIa@^wa2po^V@dzA`!0`wikHGN=9FM^92po^V z@dzA`!0`wikHGN=9FM^92po^V@dzA`!0`wikH9gDfXjJba@lRkouFgZiu+x~2sgeW zdcSk~{_8NtIl`SgcmHj|{n7LL^*BHIXaYEAZ0r)|NpjicNpfiHa-#B#2^+2k?B|K$vVpSj*W$1C< z?ia^@3*RQb-`;&cS)+6G=p~o6|3{X5o|`zQEu zj;}+6an6_@0&J!=+dj^hW-k@_TDBP#WU=bJ^CI<2NdA#xJ?*POsa>0R;w$=O8kDs&l%-Ju-ImsDqSWh0dzr zNmA1NTgT!`MWfBQ!x&Ez{`HpWr8@}ywSW5lFXMX4@6-Bv@_x28``M%`8qa2Vr|o^( z<^5!uY<9&lOv<6}NR z<$Xnt;5@VxIBVT{OW9_Oqig%t^9Q{7QXJ#|@CTafu2YBhV%@gKabB-y1En#3O)LV& z`6fZfd1WWGNpl_Q&v^6qVQtBu&_Ql2?!6z{VoEI9y@8xwcG_n_pgXt)LN^YZ#a^N0+_Qy zDGVw6_D{VYUOwx>LDY(k!63rx$T;N>RBc~N+~iJSam>S;!udtkxygR(Q~PsX_UC`;jj!AKQswa^0}M5c$T zl3UBn>Te~P>Avj=U%g)BNq^l>Ci2{nBgaO?-g!2FOmA&)G85S+ z=}1o&VmanRI_=erBoooVmglFue(py^-tg)53~%)$Fpf3OtXJ*2{3U#6Z{h$Wzof_G z7M|2e_laFsv7f*^ndwqLk2Ub0@id|Gq%libDk#b z!q|;Kw;2APZ@uH~B7gRw^~}2U1cu}rJ!IP@&)78K%!BJhn84*|RJ@Yp>&%7{J?Noh!NOOc zk;-%;x~vda7|QX`S&3?HqRT?vU77Qg=iYtClW^|5DxusZw`GJ%>$~e3bY<_>Jghz8 z(h4VCy2^W9sS<>G$x95J8aJ@$x`OZh-B+K<0W_dPy~RvJRq?E+i5JDAOe_zdw{l6u z+^LEfqBx{Fe|3@LwYxJ-zZzUI_LB84Pr81V`tVM8^yg0zxp1}+F$K0B(mVd^X@Z~O zuR9(CD0YY>re$FV|DAGZ7qK>>7|9)40~g)El0yjI^uw>gdOq=(AykGC^-*=Ik^8LF z?mxmirM;dh)I*1{<83xAtEmnFixDr0;Rq+BW$Zm+fYf!!go-+-n<=(mHvLqQ_wu;E z-QYG?K@asX+cJya=WyHT5ToSUFo)bS>MRtydcCJZoGl&TI?96=yEHHS>zCjf*Bg6& zD`#-irQ{GJW3JFDJu9$AJ4!4>FqG3h8X>)TQMKlesujtCIUo`z%Yfp8i@o_7Z$!Iq zTpCi%#o0|@>5064;lMXV{&btJ zxAdwP^qJsb|5d%#3N3WVr&=DL%#9aaK(;h(T-( z7`Hp3(xKX)+aX*n)?Boa<9ihgPHO@*E%5^aKzJQlOQr4Kh4iVkYN)*#S8(xK8tkCv(ox7I|h zO4RTmjI6F^R4N8p$6y?Y>x}A}`C373CWySPk%uYt)x0>p3{SEiK7Sa4O|tb!G)Xkj zs!G=LtE2{vE>dP3&O+^+QBE%Z4UHjc@s}+jiF2%O7y(tNQv(s1r@NBSAG4k8E<#n{ z%+s!Zk;vzp_bpyCdR|ALR zcYEaFWwCJ z2LfPdh#4jx(ukOd^vtR2eWL?Cp|GeD^%6*3gf2sllmve!V@9VjP)j`}BnAQ=3Ql*2 z`(uGoIlbrSHH>5)@hKXHr)VlQ#6w6`sDf*S6NrIP;@jTy4y@;|eq$*CI%KrZDdO-4 zu$uNrXtU;2DHr;@uv2n6uyx$-kS>au&Gt)Tv7|HXj5!Q_P_n|DDMV#gK-qQ;L&*x* zYKTgm;ZQ_h3j4IU2gowPX8R&Vk*d2vDghtA?pUS4krdgE&%)j&spYRW~g91*?jv zW}yYduNM$8`1Mxya$Hw@=@LpFyh}c+4gtnrbRlAvlIoZtrqC5L=jlG9xd{?{QC7YE zLdlS)P>>>_$a`@zS;J%hwva0juTaDdbWn_ESE+@9EwBpW)J(x@7m>~?LQSZzo}5m} zyU+jK6}-RYJq=o!0kP=w=q(5i!7u4GO)EB(4f9a1;#Cc$dspyiN*x-*5iMb%uFEGD zwwy^aT;Brt3MtZZoRJooh>>`^7Z|}f(g2Q$VFGZeMOpz@!95ygI5VRcE@6qFbguEC zViU{4tSdKiUh&kxVz*AQ@glG7LO~5odoTsqMW~I%OcN@=E6sZ?P_&Bp(!3=xi{^twCF{-cLe^G_4xvyC z{n5;PGEK@vh9 z>g-6BGamMe8%2I)q^Fcq#j19|tE6bIO5-5*%H(2<=g}0UO1w&s@?Ij!P(Ol;NSU)D ztT^S63{zMjYnTiMiRqBDzFc;tPRkCVu3{)ob=&M<7OLFhYJ9MH@jP}>(X?_V6r^>LE%r|9n|jdMH({%_++BHp5BqbywbuF* zyDKi;eym4HWf9{V{_HD8J5@jk@fyU{j!Nb_%KeJNoBy+2Z@Eb1$UFO4ZQ^y-iGJU3>5IGLg+)*~T{)R_AUJhN6=O}^7+)E+n={r2>qi2Ud4 zYYJ7XRlFv&*@D}wfuO(UBkMA&NY=4eL|4?pH&CrTHBd(Y73nD#rF>o)4%GOIyPkWo z$Vl9`^pLG6)g=ZhIhFDYtyjqKE1&{sTo(tWpwv{`vYzBPh*UIH!OkTIT3O=6Bxb(_ zdw=G@;Nx9Uv=}#o#RwOMRWqm++OWDMu=Liyw<0Ii-WldAsZ|x7jrs6(hikWj+6Zc> zdhySb`=l%4GOXEHlRBK>)e768XgbQZer)Q~PI;7V18qx4=Y91@@!r-04cE9@vY$2B z#%h|W9im>y_nr0U?0T_P#Z2#(_cGo~!-w3cSxs=d9QKYV)_SOyiBh+U&4)tsDo~Z| zhg;v_Wz`@3wTGW1ax1PaDkLRG%eJE&#Cr5Z+*$vxyc}B*L0Pdp^){WMwJIhY)_e@+ltzHiVni~hadc&e-^pqw)JF-YNOyLs<+-o zt0R2Ta%0{KH+WEOS`|QW8Q*vVAwi^DSb^q|bLmfIHxVr{9}db!7g&LGTe97xX3ERj z5B^8|-v1FzTsCG~fc@2SOyf~*fNC_hHJvJEW+R#n>`B{$2pg+5kDTm;N$-#3>Par zJ*yBdM{o?*tOfSESx2omz3k`SCvr88qaHfgaDPKkcg?7ca)jdkJOeWjl$I8-M7VAp z%ZtgACcSY25us6k?!*8o04Z$@SSc0NK#-sJrq)mG`XVBCedZ**z53jN-fJ<4y+)a$ z{ooGL>Z*J&h(|L(&AT{nvM_i+cyaw8t*;d8{i)P^IA#Fz4rp+qoQ2`wZm0uugsS{R z*@K>0NlPOjnhK+ae&7QyK3C*tUtA^nff7vjsiCUV2aguUArtXl;zk)h?U3mTw>A)? zJX>tXm^h62v{kBC&}fZ!ScV3#!wT1HfHz%>z4f#*{fc?_Jt8OnSV5_YV>zgm3#s9d za#aa>h#$jLu^mto?wdyYK0-DWp|*nI?kbwVBLJO_cr_={RtXK|4)%tMc2KR~yzv7+ zEb^$v_qU*loViV4n}~H9wCiAEF>qQ|30-ngtd=8i5Og(~7M#)NEF=$ma?1`e%JQkA z8%XR1bb6?Cn7UQ|_)3w7>@B1#A?Oe-L$1E;RYGL~M4~~! z6W#ckK=RWZq24`y(8`qu7SJbiPM7?g*UwR_u^i#72AKy`1l)yEpKPX!R|ctz)j=p5 z*1=F;uKn$=;;pvN`*^`C#H~7NwG4b{s4OU)EVeYji%;>Ee4s`y0y0|_ExH13xF`gj z!b_LZLVT0RN;1!*h9vu!^|^mO_}^ouQmhA5JU1$mu>Up--en6jzagKwS>#)I2YMA; zwIC=(g0`^69Hd}WsE8Bq|0lb%@>#2XHk@ZVK2vIl`{C`WOlh{Yr>%rJ4KVKcIV}c_ zfY&oqFE*Eo=DKG7#;DUjb}9DepZbFVwatKXbumT)cX4VkQM9K<_65^L;~I@Wyfa+& z3grx<4$=-uW=CWf`2`n@?oLu-cM^wk%)2E@O1*-TJ{b1FOCS9aocqUjL-`5^sdg~) zUdoBsE_poI3i^5wUCI1_M%D?r(+KD~j<<8+{0I`&1*LOhbQ-9XUBFpu#H&5HxmX9| z;=b_j@afZy&z~CzHP_NijW+8!tq@F+!~zL@pjJtiyUHqF(=vIU;>^~z?Snu!nXk!< zK&iM2<0-KdeW@dLm2wrYkRz&g`WlOpUHOmxw?AJHdC!Zw7$CT+_e}yr(a^O8m;wXh zs)f#CjhP^z9gqZdbPy`g3*8Qp&~aYV?a=F2G@Z;Mw62r0q4GEW_0@|aKlRM@lu>PM z+;v8(pT2X-E#|wSCEt!}NAxp+d;7bf-xYGK-+-3P8H{ioX6Jn|$GH?LF)|_67WI<1 zIdD30e*XL@?Rcx?uuwz_qZLl13EiN&#%lWv&M>*Fx z!qJ;;<#1GRUKE3rRM2`sg%z6H+-fdz13|6gs>VOfJoz%*iT>9rtqFHc#DQrRzk5dW ztKh`e!%<~+Vfljv(w^y1rN??tn#UDBZE?0U%~#|zN(&i=DTlygJ1#< zAi61$P=SV{kD;Dpqo(7ya8zJiZ}D4nW13p7Ku($A(z!1vWoIO3U-I~W7J2QjZofAf ztFW=2MMS1)eUALj+-3=P_&g(Y9lW<_*>G83GhmksR=sCB)Q(+o_ecNbT_Qh+-&$-R zFuFOSfoQo{i;2j9d74i^pZ6r10=aus&3L1>X42DYq+?yUVgF|rME)tB6K#t-4pz_K ztYw6n3pH(3!J%OI8%AA~_-GM2g(s&axDwqN*w?Om(u+hs@s4fv#=v^cADeUyQci)v zz)_43$rvI9So~}S7lmhVN6sY1k#3k+{OKa&fb1}M@GGzW0g(s&_O`lZVBOZkiw!iv zX*xi%lo!i%-H;#PYG_aE3A1>X{(_ph4(S^27!_X9e%8}4&cC{?)hDz*g}Piwy>Eg01u}@iz)rCKB9P+AUARp`Og@5p|M~U2W`F8rDA>U*Lt72hhuIr@I zdb|8FpG#y7TOlWU8Gy0YF}@YG!`2qUnb#b?O5~Tf^%zQb$FrH*h&z{0d=3SM&(2|i zsmBn6!!$E%EbYC)$ZoY-N_9Pjr2J!(P%P5x)t^ph zFfiHDU3yhG;d(Wvl*NW_bXD0Mg8$ozzx6GVf4FJe-LV}5bjS*`@o+HkJMlt0o8&KO zj4$tb6Q==&csa_=#t$Jy9b1j0|9k8&MZS&qac>_uHSG+tG8jr5JV~AKhNxdSDr$IM z8#dEPC2{q^*XAsGp@0q7SXkI{8X#(#%nlwbPRF5{PIo)Y+o(BC!gaELJ%xeV8xn_x_Tn{$iYGXXCDb~N1k&XLna zZpIMVUhq-bcpa@%PB}&7?6Z4V(3tOe=aFTE9Dh3-jy`)2p3A*T*OqPdRHL%-8hp$T z9qP2;*P7dIWB%=tiMQhURyDgHtmCe?0**TpSd>@>3 z7W374JW4O)JAQ4s>#HBd{fbXu@3Ot%qq5mL4xQ6%!CSv~55s+E#~(xQ`r!|KL*%W0 z(%hDr!R@l0%Z_H(N;;lH&?)dfmu6KO|&l7#=!&?!Nem1sioI70+xt=>zzvrFY zr6>R5a8~43p|g&X9#WFk%$ z&OtR+mmGanhaF0ZXpd&NJ_`J(?E0t@H96}L&rNq0jDO${4&(O;17B;}sP|`I-lTat z_NfDcMsDorkxQE7<1F%9-sE3OnX`_T_)fw8=@f{2AUU{;}i?{t+?sm3+*WR%)j&s(* zD>7qanO^hS&N??``-vaHT7K%TP1!ic%IB<=zXo-MSs)D3{fbzYkYf z4krJJOSq%FM!;3vAb3MQ3o~@{5`)uIyitIT!e$V*CMDY~H zDW56(WG7;KEOb~5nJ(Ic0V|2#DNNbGq%@GjnthJ_J4Q}p#6Uek^;gVKFW4vn3Ddb3Sb1nBmmzkQL5Rt{;*y}roa zqmo5@C*}`WxbB%EzlrBWo8gurueLT@sZx)O4SNN*s@;Uoj>>n+l?8irtT#Iu#^y(_ z!@K^z-pj|Wjt?S&ao(%8jnOY!k-Mrf=U!$f!`Quiugonyz3lPE=uI?fYsdNH;YmB+ zwIFRV?*)#_=$GPp@7pTD zxCouYq9cyW=)B(Bam9C&m29#44L4nd>n-l)o@V1$w0a5*&M2;#Z=p@eoWo`Kr|&kI zTwvh~-U^+MI3t4pI~0E5KYsP?tCBvYw|gN{y#R zyy@f1-uau)ck(ox|2F`_9li)n=s&4Sw0>KkR7{as3G@khx~*ok6|% zMRV9Ie)wv5(>0(Sh;BWi&n1XTC-ze_2Mt!9P~9D=Z!FlpLK5)I2dZB{Bhgj zR++?r-s|}C?6pxt^ZH%WMSm@nTK# z%5`Vhl3fom_(Z9?%P(bQ4Z=HwH1S`)^xGm2eL`<{x|aFgqU&(BW5TyqC3#@#bmM{# z-NFOB46XWM%XNG@7VIzF`wHw6zwr+}>-O)TaXtA%FpTfMEggfS20e+*uE=NA6THhs z@I@}Cg&mqq?ah8xSPwXm8*0XIg62=@hwse{?3Hmk9ZT_Q*_4;KH{twH@9aO zx-fHk9yFzIVe~uFt?k(L+!%uY+CLh*QRMw!Y*g7|udxIe5sRvTZ58;@+}e}jIEw$U zd=*}b_8OQs;_8){dU2aeowcDHNa?A!;x}^_-+|*$Cj<#UXo^Co)KFyv2!=8y&MS5= z0O0k4Zed8eAf2TqV5ng8&{Wr^#$e%{y!*>vT*I#s&L~{pytl(z*i=ijGJ|y1I95k$jrpqEjP5<4Ql?b2U|bANwr)tRcRxR_zUtCG5lRps?? zS~B=^`0EDOP3lis1v|AZj2n4?7?Yj~S9LJ~Ve`<@>`fUgZ9U=pfBtbIPt_%`%VbMO z3#U*ql)7a463Tjfj2)y~e!X38m<;uvs3`ZYRPk!khZV(wNfXOHC$(DH=-Iz4^5oyB3c0cnB`c(oS+nEG&2mvCaF^XO;{n@x zNh;P6rI>pfQ^#UR6-AQQ%XSYa=tA})g6)uLhZ6A^ksSe!UgZCJ^-D!Af9>ENg%CAG zY8@l0f=#qWCdv+Ghe}m&p@7^O;H&rpWNXEYv`WyVGD$i9wWt%J6e-jyq%O2#r_S@n zI!)GPDr?2a<5%w#`H2e)fr{abM7%q%LIR<1yHFV%fo?Fy3?&WbY4X-pfz=C zqdFpZ*+8v&h}aH7P&3lnhm~cYH?l%O!>(CjPo?M$Y+?eW5vk|Y z=>e6_>>&|`1?uy%rY09hOPwm&FJJtAoDK<~t$E;@ zS}ZNvSolM!D^I!&_vL=?rl`@8TW16+MO6jcdCU}qIubndL|f;nJ=4t6m&S$mls$8} zFc8#GE*d?7!rrioV4sNAEl6TO3{VK#NU7&VH&n=lD3Ag#`3)pxmh=)+Mm<^h?yG)A zO0_jvjKZN!dVTjhO_R(G~cB(}gaN&M-Jg_Q)IvS!@@e6L79l_srO2l=YW0`FP@AZYQ|0jo{K z4w+D#X(rRGt+OtA-(MZUyP>YDQ;U*=e2VrssemnUk5&kQm6jqN(`$)hun?o!XmBe- zK2L%NGwE~dmogMAMz!(8CC#je!(SbyvfS#oMI4Oc|E%mA&BsU2)GwgNBb*MsmK?6f zziz0pL}xpdY@;OnjhB9sW&sU}+Pm&QzlPsfe7W5vhgio7!|7<3NGE~vR+VZT?}G`} zxR>A{^WRG7UM+0Y4X&3hC@?M`1+2i7k=&s}B;8~1v!Wbhe+hhpzr2k|n3Q;myVH2k zi+zKny~hBDfR;c9{MFk?F`9Hf4lzM@Ba;|_`v?OW^0c=4(pwqIgq}5uGmTMtA=Vla1^uLplJaZ^2B;GSd8&_wL@DPBQ z5#@*Fogzpa0*ZFTnL-&t=GaMqkU1@c#K06$$0UFgc~dP^AbjP=zWF}fT6ujTgEJu1 z9l`0$GKp4VjJFw?AunRnL9Z3@F((*tpoJBfXIf<#`C)_(P-c}Hq_YmW#AXO~g5xGQ zkl%&xtU<)`z38*hVZDjQmX7-Ag#H@k`a7>KR6bY@eVpQf(a6n)Bp4QLfy(sqr1-K%Cam-hTWrg9UA~7OR9wmo# z%tcQJ%X)Sk0e%w#ng_10SQGTi%CrUmMTy~j#uGE2@oW@qmnDJV$uSKUVo_z7%!td> z5zlGR?ILC3w5|}sXcD;#I3rd8tGKu0@gQKuD62DZo)BgR3QzjN_dY}9C3xN<01X)5 zJ#4lI!)%QS*`Pb(0W>~ZZ>XH{$62@WAyp|grR)$c_1QbljvNS#O4&|Xs@u|6-}@X9 z1ky3eiCQKAt*(^!SW>VJL@fRSxHZ~PV>(K;HZC%O&&*dcAJo_?OL71ka%yU2fAk-3 zToHNx-;%D&Fy16aOdTT;Ql&qEz$}1?2y!*3i4tvKWorScX2AjLX|||NzrCW&unj1m z$qLURVMoX&h5oYgW^piLQSY;m&su{txLuz2<6O&V^S~;e4GtsEQN9k&h1P(alI5^C z8SJTvD}nh0OA%7YI4#gDFgC)4DwHnm(8?D->DS@v!u6y=X<5XmG>R(E5CY-qtCpAr z2}9g5Q82a4tE(2|J-|-r5zxoOsYuyJ6hg`CKq(+W8JQE~%2L3heugq17S*#B@2-~s z!xGaZN|O-4M5H5EdSHgELn0KFnKttpsVBXB{8exkdvt(NP2H3PT#pzQEChf|gMUDh zP=#Ix8MHc>$k1j6hhR1BN-7dvJQ6yhR;?Trbh0ZZj2}c5N%LP(e)@xvRORPRzwNWcdXyd#6g|O(W^~*`AiD}xn^pSoct^l#z_@NR zmLo$U<{T~k!PeN(WmBULQRr6Wh)~F1cIUsh@eOXAN|azqlvp7g=*&DCIDyVhS$~Kv z30(+bhrg2AU%Q!WN-}qc&KIl0-&1O}GP&9%*PgEsF)MI-K%n{c)jW^FP;5Q=}97AKdq1WO5L_s>Su?ZB-m6 zmn+Zupvb2_S); zb*gvn#DL2^9u1UFmKlnU;w{*0Z?a&*}jz14Vi`!}V$zuHq}8whFikUbR(` zs*)?xRkW0bcZK}N{%qwsk++Ap%lS)7L5niBYM}>R4OdRHD=JFO=1GB+4>s_wr^YNL zVr@n6Kq>rGev#M$6LB6dnrEeDCs7~FB#_e!1sFEGa!|-r)I%TDD88U>1LYuT)~qQt zy2`dhJCwFe9`@;raQ*z_uOUt-jd$Jpi`Q_x;NWSu%YF&TEd2={mGzcSM>MvgqZ7qFb%;gDZ#>^8N)af*s3(O&)xsL7b5+^NDr=HOrRD0{p!W- zpku&AN(dr{p9c&f{I^)+4~G#+y7f$rZW@H6iNGqdEKBJpuLtX>9=AYzSiB0#zMEJ% z3q!y@NiBORsjWtZfqu~sP4%+$q|$&B-}SyrMgIGz3qw@|a)`(Nfn7yKwxW-s|L@@H?NmZ{p zdG+$z=U(_uJg<03ox0Vffg9>0SgAe)H_&T#G@hwL{BdVaZk6O2_%`%-nwar})+Rjq z@`86Vqt;rq;MF_ph(<{_DvZPu;dM${+2x5|utd9xLIw-1aF-89MfVbaE9OHgc023;OT(&S)heX4=&Xlt!5 zy}q`z=r=e<#L|v#^fW2=pOpxO=r@dFN9_`V2@+gMCDx=HeD#9mr@x)8%Hvr6JFof< zUfni6MZr!xStNL4NF$+a8TERAtJA3)y<+YxQfDDGM?u~r^Rdm!YJ|sG0ChEHF8H9o z@h1oG`ZegrGYr}?iaUSk%kyQwA1-^uUh+d95P8PcrBrH4*CI8w0n@j08Sgx@fdN&I>eNnk35O~M>w+I|MIa`; zIWW-~VOVN`gxC>*fK0I^_+lQ22Od(r0ej|zSiuf_5A4GN+M;4WCuu;dLc$y@rbgXD zg)C`8gfQfOVofgmPL&5l}sud>e zpJu>b+{ghu$&wvdg#UlZB_YdNPVKYd>Fw|XV8LY$@GY|*w>dZjp8~1YOoqsk*EK*b z{;FWX_2q>sxq@4nt(1sl_8IVs*d3d0|Y$vExzaUiUOyKfkLGR+g4l z(XI(Jz99I`~@OUe{-i@@OcOA6-FQ;-<^0SuEE z5v`d7f+-RefJ~=(m7r7;r)2h$2=q{SAwTkOKl^!+m;VUa1(5|7jpj~M4U!U&c;B=X zn4MW7he1*aO@Kqm=#w$HWsy2HF`<^o;gu34(GWCzEP<^Af{p{q1ST>CgJ+fxnkCSw zo;VT{nKpW^Q+5_dQ3Ml_V6!aNG47!HgX_=k!Tpg>T!-uDkGd(ct5$5egG&Ox%2rY& zR9Y8AxkP)a$^=1X2Llc?ND%7*t_MAkr^F(1J~nVNV{8%p)-tGweFRVgL`O?Xb`?yOQc)o~dcnV+fn&}8sESl^jGl@{l~drZz)A#dH|b;?xNVB0j1C}^ z12e$zA9&NLF&O}-DHFEe5m9g<_gRX|?Wo2uNfU}q8H1e&6_4bO{%91gh! z+sD&6bu3Zxl4m;pipv3az8<0g7ygL%g6Np%*Gr^1&*(})?-s60K_tK>4}SMS-1o=& zQb3{XN|IF+oPt)l%2bFA(k=(*a!mcDa1k9ZK_-ciFJ_tpQ|qKE$Aazx9wlON;)Wd0 z`!DBa1tQunOdzejc|P-jp*F4t)*4EX&i%~8-}oAQL*&0!6kTu`%b_1W;GxmwlR%6E zg!%x*!^m_Dj$six&}@rX;Msv)&LJl_{4GPpDuyz|jBh`y;-7*dp%jT|!?R?Dx0Q=i z9%yE)5&w4{pqcWKhkkca6fF`TNHT3f3y7gc!SCSOj&ilgolLeM z=_HR1_MlwD(f%NnNcH+kRro%{eH3aHa*)fCeD7y2yaVGL=l{*nD+OnpL>nP7k&GDJ<&L$bG~~yXtt;eDLUvd0&AK?9uA52jreULm_<;q&jT1H^|4Qi zrz_T(_|4|U5J|JvDt~R3@_Y+7771;m*|A7moPm|f;SHzdkN?KsIoyNB(C7w+!77

^?Wj8%J4_&cL*d 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 z zRH8~Ec4K2mvIS#+!ruwTB7@7hhrrIpvOTR+F;BI+B{+)$?zDoXJ&`^ELa4>Ln?35HU=jf;}TV<_~0ZSRiPg^aY^9v9s7>g6Tm6U+VdKm-otj)*~H zU>N1AEf6^{k3aqsyrrEGMUpX=EDioU!=q?)J&*>b!P$mYYk1P=o5v5daLpdh#xw6d z4z;WrL*g@!ubUyCaUbjPAz-XPiH9R~nV4IUCW|=KNyj;Ea2Pm70NAnWNTm$vx;Z^1KWcRbx0k1(Fa~7^6uxba$^&5{Jq2I6qiu^n-69c^|EJxvl=6LYTDky zd@^10!TdyB9_)kzMHGTY=-(z995Kc+v$Tm%!h!ac)TR;qJ_F`y@=DF1;4;twdvI75 zSUOQvZqvt@Rq7T%2Y|-9lyd?J%1oWnv7Xqm#&t!>w9p~9T@FttA!=4gEAjTS)zZNZ zfppC48Vb+=f{H6tP~v7X(dqAf!Mk54^7l8Igj0xP^SdElvdQ3~4R`p*X$8-RK+fvI zS)Zv`5$rA)!H$!nX2kx9*p%GWi}HAbJ1)$i|{ zL#vEpX&0+W1CgfJ8_fDEHWpzjO({C)#KWhQ20+Csn=)o0=3`)T-NP zk%49(52y)?1{Q9|Qmq5TBw||AgM3g+A}BR{YZ8V+<7pCZscyp*(T;E|)Y3M>YKc&C zb@^c-x4h`u7vg@!3kNG}B)dWE!0fPiEY{HB)YKZm@khLFT+J{f1iwpzao37@U^X%F zMhFgoY8S9ba_pQ~jf){h4grsp;DEQmr$VbWB-Qjj`6RwwuA!-kz4)c?oW#4h&rIbl zc{7@7maDNE2|kyM3G6p+!bs zFSamx;Lzy42nf9Wr!JqN^K{ofBPF=bdJbhoE1t) zlUz-}7maYvQFF|W*|8bh=kYN1QK|qQ4cigF)rtvH#5^slc=WfW%|KZxgy;lpB8yg0 z23UdTKNGPOMuk2#Lkx{y;uq@SmfyoLYFT)*RcKh(7wo)kzVf^@44v9M4Nt%Va{l5v zpgI4@OpqQ0XIpJEe@wiUnA;TZ_nnm*{Lryi;B@|v=3_BFCmc%@%4?3{sAg;xE>-Eq z%Q%iqs^5q7tVF5|LXLv48ANd%77b~sB{Uz)y3gzK>p(NJP6Gxi%Dl26?tvAa=Mw}D_wH83nCB3Tq9=HH^qTir~3Ld-=XcizKsZsI~-Tz1rN(%7>76C5)383 zVju!>P}-?ti@@=@p{t@&5-nbR8GIN!e~T@67p{r)aiEyzHlF${^~uE|TjZ_gh}mN$ zeh6etwrDq);8?@Q@XSfDjNt@29EgE2HV6UG^IZb9;wkVluQI3ae}Gm-_cS+xKLEzF zeceFZAcZ28>wH^Al&HJ7))O*f4dFTm)1o~;P%JDfE`bJ)VF#43*4*Cx7WTVkhqPY;# z*(!4#76vzZ&u)R{E@uHf0BPTqi9MfZuAiRDnPVM&5J|}3b>{lGp=cZv1Qy_mzkAt} zMc%T-V35ijq&z+?sAOuLLk9$2-Pg`Z~GQo{Oof=H0 zn~;ww&_i<$nr}5{(YQDQFgdNB5x#ZuU?~{fOW9smicz3egC=>D4blK&FC{#(VwUdA zVX>KmDW5cIy@+@_jYKNXdCJqiF7oew8mQnX+zx`VcKWa@trayZZcnj1k_+RPqxX8MB|9_%%hXuvCt$e!9^n&j>HGVh0LV$ z4E70b3d#MKed&)y{v_U)n|qM(IKm_|FXfa<0}d*gNFq51y0}`wB8{;j%m@}@4&3b^ z_h`u!z9BZvTFMdQv@Ezog1EDk7+tdzRXa752?a2*&{)1VB|KQd5BD z(;$D~-5+^A?u9;^ytv3r5;x$uP)AeN9_LvJ-Bn+C&t@XBC_6|HfC3!;FpE0aQT(CM zgx((hMw7fKD!0Z}F1p4WH!au*cg~fA<~*g~nS)&&aN~usQ3GWG_?`)ylj=5i8o?-nMA?umck>lxFGNaXVrc1(hCk71kJkY0)nTBu_Sx)zQ^?DQ{c;;}$V-3l5l_iV~ zR!9t0hwgUL%f>;DC-!i%I4HOkm)!wjcl|iJVa8+Y2;Y!RIP?W_XrEulMH0+KWC#)l z1s&sAR~vjNn|4FEqkB2q`D-m>2{q+6g3HdNR6l&ORt;C~tXiK?NB@=xoD>06HhR==Lx239W#P z0md^R6iPpAG*;_xgq)Xh9&KEoQJn4@AJokRvR z25VPdf|y@@Lo9}j72qO^3#F*UR^<+D@ZQ@En{$C3Qg7Kxn=}x&;aK|-O^3`;!J;{d zfrqF&Ps-Nqrz1InO9;m*l(R&~GL4~uV**y}oFAQf5Vyf$MI$&nNYMQf%2ux>wFyWC z9)^eMw35IGgvfMO3Ta?i+A^G|5B$jUFt_~u^{L#+A+M3ZZa_sAvMdoTM9w6thGykJ zHMEmxr&OD)sccLb|EmZL$;#w}usbXBSI09wg(y#|GgeJ#A0Wo0$}fE5BRCk(|3AbXlhD`1 z45GF}!9oGV&QeUUj819Pb*3DAgJP>@sK+X&fwIJiI72nbS#Am17_2~sgdk|r!E7WT zQ{}%8ydq@0t#g$oQ1*orWvgHiqZ}F$6l64IR6bvzQ>`yyYV$6rUft?8RTk+2|E4lcJW> zrv@_;6ORvVC_W4Lga#O5hp%DX#MMP-tJeDGbKJZ+j$0_hVUFV%3o|+wmP_5R`41OI zdU?1(7G#36G$klC1O=7u`ry3hq~%d2@K#Qb4LW19r}Xa)p>||hJ5nC#p%iCM77{oj zvE7(>2H!J<=K+Ge1vx}oL(R2rto41*e=Z8 zm{W(9@kU;SaxboXs*p)&ZL}Oz^jHC!!ZvIf$MQy|>6k(73LQ_)fuNw$zQL0o`1;fF zzT79JGVN73GBGI@z*$j{1xAO^j50^at9ZGGLnr`wEx!`EKVN7F8c=Ix#G59{4ps;_ z37e2=8CeStkvN%AtfI5DA-UpoU>EAnxMz+{GES2;O=)O-7~9xD3ZjCv-jGj-z4W*K z`8V*+obPH2(v~v8QeA|G8{5YyurQI$%@{Ezg>wGQE^gDd$Gg6_{sf>U<|xmw(cbT&agm#{it zC6>9Ys3`&Yt3S95&xZctXiYXdl!kk4XzW*o;dCE=rwY(r(Br5fFkbPzQ;DJJTo2~! zXl_@Piwta?4g%$gvt~u59*nohJEusB{otgS@q+0Fgc|%rLVbsxs3&M8b>QP*RXUH^ zvBUiEKfdyJMgICbYx^Apjc=EuZ>~-2;2r4>r!K$=-KlkPTg2hf!T{6T%Cs0x9QG!e z!}DnGEL2dM#1wL^FBfK zf$S7BxCin}GkoIA0Xs1uj1ChBTy;?xUnh6~OF54lDL*RDK!ppW09Hd5Q+jgTp0(9t zpagrc4EMWsOm+*au3g@oUb+BZRsDRMMm$~=tbNN!#28`o*4TNteAk9pN@KIl+Jf(p z%z^0f*$TK$0?>&)_l)nHlO78v1XoL#o95*TXj6RFaAgd`9J_(iodGVM6;<@=XsrPR z1Ov3KZf_)o3>RkSJA}Rh>l)M?7iP77s~7D54DKoV@QMQ_h9hTzh00OK{F5TEGA?{jm1i$Zyb54xMLZ_K~r{UTrOyXW8ZD8B{h zR5m3#S15UGP5>-mu~QOda1JR+D z^WLEsa2Dg|3S2>Va{Vy8*QC;yPhmIKM~X$~LoW{C`aqk6T^p)>BKB^Yu;*wvFa51Q zLA>7(X4rz2UdW=eqj~vDkO2_zQMPXDGxR>hMj)%D_8MbIXLE8 z5UR#ECv41CnD9RHv(^E9%=y7ix1_c)*+_WUg%woJ9PQAxhB+8hi)K;S**=a>53%66 z;u_tal>!7^Q%uZH+Tvf(Mb|i+@V1K^1Xc#ma;PXqiNmQ60;hlM{GuHCZ+PDS6Me#h z8UQ|;vqsfle=9i7A?bjk5!37G9%_$s_qy zjJxjKnD?x=C|dXn9(2eeXsn=*&_b~aX)#u8y@dk94KE5r1lf{9j(V=KkLX5k;^aV zIKTh?y?aNn+c??Y%M{U}4! zVOXI{dnmSrto?U{btvfs$*z3j_2*~ayV+@TKmWl8vuy9)&3z#<-T3s&cDie5i2;C2kP$VbaF_=97Pow-xnIInkQ$SbeBtpp3zUj(3$t{I&RGGx(jbMz5RZS za~eC@H8fQ`Gt-Ro;g1asg_v`k%QrXX$$=B*4?Q9Ow<0gweL_J9bYi|Ad#^T}!t{RT z*zsdNH-{(ra4dvzzSym&U8mt;w%OcNl!(9Zn*9+!_uS3RmtMm&2hP+lyym6{1D<80 z2f{8h=mwLC!cw3oO2`M%+Z<|bmFb?m(k||@c=q8Bi+te?lumUeocXR@YDG#n?IMYE zQVA@FyusV_E`H=l&`mmRI|@4o4jjYwJlI5vRV3iF67Zx!dVuQb347r+#ikT2A?DxM zbs*q4UXJ9iNH}+1rv~oC;(B6{AhGm4ulp2Ue}8nayqC6j!!|PxmOK@zow*!GVP<)QsCqG6mT5sveOj~+-E^Ip3!5a0fMhnLQd54eioC-7%~_tl>g z`PA?9k?Z2FT{YU?DUWt9iq$f{#*Twb+WumDfy0N7?Gx-0Bb?NjY{q$c2;z7Jio z?O_#dwrhIW)%>gCH#q`_Y)!}cxAMC`o%gKo`l7m2dS#Daj_IMQEUrJ)BRwsph9d#{ zn+I6V`|SVRp^~@By=(hAwPqcv8vNp-SJPWapY;}}g^rG|w@O`9x#RHj{ZZ)(4Jf6% z8trnped}SD(WQ)6H9*4u3a)k=Y zt5V@y*250HSNZTP^L%o?xO*n+DK_rT1rF}ZFnGO;LKgsC%X{bht7nM4-ik;HTBlX# z0_S|sG9>~h>Gn=a_ci|>Ux&)l`DVhBhi50~pOmh(hi&irzb>Q3N&a)qp5rbCcLGHy zq6BmUr%ZRtI^F^05cUEWZ1~_-4Xz5PLLzhE6e}}V!^f}vhBE~Q`%LhxaT3u_h3{G;nrq|l@1FP@9xAcN{a6A1zR}- z)bn45*FnI4jt`!|Mjzup5BH`+LS%!EO&k5yyJ0x1me8RfRu~6RQrd@!!rP@c{=Ue# zcNxf(uu}x(X755iusXtrR=9SG{L@!|`$HS@J!cVzpxLqQVIj-Q9&X?^OPKaxg)F0p z{Yn7Bas{291jkrfdw`9w1+jh%6amRtrZ1YeiyJa28f`#h96MXOB6CXD0Jb;b5SbyrXR%brr>Pd&Qi*f4VxonyPNh zZkA$2yy;4hcc^c;;`A}x$8;U4msK!s9!9`|L{`4sR=lxd_ih<~$1Pc@)8NoEt*)&K zh5fvmE>>ksba$1Z{j_2S;qKixRcqi6T|S1FA+8o|@;MKES>5<9H9Z08C6ev4;e7WVe{q%yxpyGQ#)5Hr{kov z8%@GtqQ#IYR~HIA|2eS}zdj<+z&$~@m2*PG-Q+Uo5F{-R>MUR1w15GIX?VAnVoh=D z&qgMbSK&b+ROX9Gs2b!w7zI%j_sR)mi6!u`fD&F_n)@8b51c_1j0>{x(P)qSqjy58 zDzbyMDyb`GX(`yGFEzkRbf`Mk7Oc(DG*B1n05)gZyy4fqUD-*f>YBuVa?iug1zj<0NYSrwyF1S=*L6OVk#d_dbF%yJDYz!ZMtkjI_j z23D(*syD;hC?lDTK(SbZ6Xe<(DZm$(;nxs%Y>egQ`E&?8?;ZHloQ8af`mi<^Rdxvu zue^LqKEGQ~iSyO_r=?(v5OdifFPC*!l=JJQLXT(RIQ$j&LEkKM6X>0VE1p?Zqx0hk z6D5}Cr!uH{1O|1DFBg*@5BHXevPZS$yrNb{*cZO=|q2HgrxMNNeYhnl$A5ihx%x6By^058EA`BmJ9kC=l~%<+IN3d908)dL&B z(|C7Dap=1g)A|9LN-O;M0y4N@(^|IEqG+fXiLm}EdD=POdoD4uNr6nHF%fx>3g zvz*~gGC;iIQ{k7(U=6hav_e*Tkk^UvZJ#4&qb4k63l3`*hT2Yy{An3=`KUmTY8WK` z3d9E!&DpSjhKHoTQT)}}g7;OH&+$Y6#|`SA)yW=ubce3X29)s=Di`A|GzCz}pQ&=~ z&L#M@wzHVe)qBqa#50I6j%0|9Jj0dyTn{4zH`;pBh4$JM1TK}ieN&kKa*!7wq2u#t zmtTdLF7<9&yZCJxye*eRmLMVD_@2A3z?Ha{0|i`>d)V z5l;!(?ZwZc!PQ+Va`s4XHJ`_gm|kRJ)Z<=jznoR8SdY#wbQPfh^mbp7&s`)rPy`2p zYvo*~dA?6}^XHj7w#(kavP{29St{KV^52k~MOI6%3bko`*yC6)vtrhvvYj_oa>mYi zr?TR~BrK!NmE7#bVaxzOXf*=Q4|;ZNHd!EeK=^yN0Q6rxGefOj#Wq#Q09xw79ZtBC(K%7Qy zxN727kr%T!Ynb=Wjl--ef30>h^WIo%iVRg?JjfLMw@Tn$2{K492bj&o6^3ChK-;|p z|5ene9%5BdZrHCgQxgr&JvR=lN5xk6O8lZ3pRitnDnwDsS?Kbe=zWvjy?xl z+=*9H4U30G9R1?l4(tKsqm#(!$vuLp+PPe&<}{lZ_~+c|#W}^~$fSaeS91?>MZ8RI zfLt~QpQYdc9vYpK=@63|$O&_~IpdtK@i+(9tHm0B8=*D(l@SvuXnrFM3J2 z?0~`a-#qneBCmZf3iJU|UY+4pi5Xw;D-p1xt55NIfj;j!UyBbIK^%zTw>-j?DRT5>-1mGK@H? z_b9=WIe6my=rb=8eP>VHQ*7B%_>AdT=FoQ8J^LO%y*efCX|dugTNO$`v#931NY5B+ zKFdHxTyr`5+GqMF1I2VHtGxwA&4*A=K?0AI%6t3K_(-77m<=oO&zI@OB#g(*}Iz8-j-r z)M6d=^2K{f&Z{ATp;YF@6uwokBPw$UnM@a^n~SWv@1DbOS{ci|dMv=$#s`28vl%Sr zcOp6-_mt0#%q}VJbYrFH1N57`5{|J8WfrrBdU&hwz?D;&ZSmrjJu28ytfGIGNhzflBCr^-rS|BdybSzrnXR?55IH_TU z_EUvvzv|sjc)iGXWAjNcI~Wc4iR{dgj{$?GyDSHXI9uYEqC}(I-Y~SqJh75bBd+x%B$1n7j zIeG^D@z8noWTfUHA$R?f3y1GCkFq7r5)DH}*;0g48x|K~HdlLq_0pFm8 zHB30(0F-+yF+u@6+l8b9E|i}216O_=5%`2`pxoGLupkyv25*jNyFt;7Mgv&j*GSM# zK45Q>d~1|U#5;#E6r}4kHv(&c)fET`w`CxbZbjrC6Z05yfRnL{U>{?G9p!2nC;@n` z(t^^{1s^F;Ga(c;$FUm8P{OL63Y4Zd=0gbcO60*-h=!vXGld<8wsa|2{rP|U1?&}H zc!Ma55q!v%8MYUgin@R$0|YLR7^@8{$3(+AQ$(ew*j6+U{GkRLn$qYTHYr$pVb$4E zL%!nUY{2qb0PtwwoX}h+E;bRo1RgRARv?xDt8{|exkLy#w;To@zfJ?hhmxg<)uz%P z0(t1~Sl47rq*c91ro_qRA9xjx;61Ay8(=%({wx6S4n!ZUIwZ3-(*++;junECs`gxL z@#Jn5rZJGMna`mL#IOuT7ic!9L1qT;>SL!&kd{M`Tr-Kp4aG&Gz!c0t(E?Cs0+K7c ze-g{*IQkFsX&eoQP;y)cJbD#p-JYB^CNB4q!B2LP<4)-caZ0HjJwg6fQPiT#$gn|B z&{;*CR)9~Ua!9O!2zk`aOF+mJqQG!;uV!rSvo=?L1-}Vp=liZ3qCL!sEC__6L@FWDE^4H&jqB>_y9vVgY?=DR>DCgNYU?vCMQ+ zpc~kOfDo!77QuVcJxbAol#$fH{U3YhFNnOfdygnYeIpVTNoY}xk4nsb@PVYzBp{xp zmOm^uP&6FuPLfg%Y9+%5k(CFXLuX_dwYcJhGjEoXpf^JvB*AP6V3JuHs$^Njp}=1B zEJSEECM^I;T?{SM3P1@?1RV3KCqc0haHh$`(P*?&m~1A(yFWG= zyzu|veEj=JfM_F4OId~ufuNTyctHY|Eh1C^9>IL5OE%wtTZyyO1Ti%u7=^~ItJUCtk4G3KehL!Yw=r_ z|0D3A1@JiaEXy9-#6!A54)@I_Q`#mdt716HWkoR(ff5Usj8R$a#~k!&kdfgm2+IS$ ze&D7g&m5X0&nG!TkvaVSo^wxhRpu0vi^2vL1kKh=B6EUkqDTPr>$rfQ#-=+QG)3vF z46mDY+bbX-+d$2!k$%DdpS^d1vm`0&M8C|=YEQQBYXGGlSngVJ@#D*CZQJ3hZ z2AhXk4b!XQgJ$G0dig2%fOXwnql;!NN7Uxw%46BBY0+&)y?|GDS7-NU!$m}Pbh$1n zUM~tP>xJuM@gf)f`RM!qzIbFrp3L*8I;ZNKp7^>eh4pWFjcR2uCNk+H@3#znl zVVxbn_*GB&Fn*;b??2bP%V6SA+7<|f$SmlKyR#t88L=3oojqcM(~>ibMGw)1^Wd=M z;4t<)pBZC1*O*Ov7qF;IL9fQOlM7Yv3T`*`5NwOjoVgPy3WN1R7q(7s@!HtxZJ?%m zY z1Z=h7OytfAuJVHaB$*ZD!@Q#MUB9>aCqyeh&Q(770@;PK_OR0|#3`T%pv2aWD*riB zylY~fvt;HFjx1dqHiVv|aFdD^*!QudR9LLy4<&XSU>pI@7D6KmVhL8OFUiU=EV#%E zTra#L+mr+>dIbwHF>Oadg%t&KJn3o9p;w*83gDGg;`XH5CDGH=vyYvSzLYQq#0Ozd zmRGXAqz@|)QcvT0VyR9jzR1nZIBxx*61z{XbH2ro${1CeC^@(12g7s^_lL@bB=24=Y;D9)pNu0pT-$;bZ`(cgbaD%|8chjLk?D!jxImX-WR zg+_Eq5etb{K)%i@wg9hD7M1Ko*4gCD4boxFu{HnW1rwfxVfN;-(jT}PV1FMO4q56w8ejwJyERm)@vZ|M>Nf!hNDw-0k%!?Qn?%csD1*P~Z=#C)B9M zY5~M>Fz&P?p3{8;CzxjtK&4TTE5UCE8EZ5NZW*-r+C(tT~S2&(k z(1UOXP1A8YuKJji5rhhhoGr9Fk2+$Y<8cf^s|5$Es=`$Ic7y}rUigx2fe)2oW3xbl zp+|}pmN3Ym$K^+ZU`x_5gyF0Du(q3u#@1NE1A_1R>i2#Ix4Zw1bLIwdc!8yM*)gk2 zK8Efe+rVXahLEqs+f!0#6*neS9iiKq(Ne<#JEa~S4XG*iwb6OV<3FwHGl1k>rF?3K zw-o4c91jc-rhF<9I-zlO1X6tfvj)p?DydKyYz#QaH*)xCaLLAy9EwB0_!zT>qPIzE zlTCZ-6a%@5f2=kTm3-*VHsB4%;SgqveIW&pMwwSzP{I_xEH7mtQCKf=P=m3-f3yZN z%%fmaQ3;P*Q3#>T>i=`@1w=plI975@KAM7?K}~r>$&F(o1oK#(P{WX4MFo;naPW;f z76^>AI1cO$)Czw>%9VA2pb?=K2~<*p83cpWtJtO3B%I_|j4N(eoMVyV2PZ15CtdL* zg)Icr){;U>1+*aP3^Txk|P=`Vl(S!ame_Giq4`i9rU(G&C}gxG}O9A>3u>aQX+KR2g1;iHJi z$B%q<8>i15d65(l{^__oUfz!|fmJDwH+s^wztu0O2e17yg|h`n6Ab zZAPxN4<6q<>ykv$MSgLkWab{#Fu!Bp@LNl5W>6Dn-#Yl3ERT0$NkiW@jx#4!fExZ_`zUvYtpWmJ{8=P2oS!PIuSN-~e&b zSF)bg-K}YM@MDB|kc==TY-5oMrDnw1+bN9J4pMFMR-rdExGnR(bE|j?_b(!mW1-wF zDG89|Z$p;amg6r&5Y_b2PQbtz{Baqq!PkT*Q&nB7xzo(TMT>7OuQ>s|HE6BD6)quH z*b0_1K*ZM#FM9POo_!CVh&I6l49DSP{D{1{6ZI6-xNbZ^EO!Sml1;~{ z6fce;;3u;ZX}5E-Z&2Jlsowe^N=L3MOnua{0^eR(Hk z>5Gnj^A)1+`{~+{IUQN+M0F}^!D>vRuYFmp6P=C9NAFao8f%6FL?7L-ZvcmDGDFJh zEOotd#8Cqhi7GX_2)@q3Na>|oYTXMzt+RzTy!4*T3u$O9H)Lron!X?Ydsm!8E} ztO_3n)`9mj&Fd>VlC3SAZ|&hYyMDQ4O$H}f(U=Lg>|1iJG+2Ow##U_)i#A`ozhYFd z*Hc`A?9%&IxBw*7qWOn6tGwzy&@^OsGd+^AE3mC(+~n zArkW`7|6&H3;f*7vr^)i4JY|v2V3ylpwA&fHwn=tcmAA#5{IM-%_5bE#E3{Vjt`r# zue%a{iJ29rU2C`uuK1=wquv}S9nt^8hb|EP<39|}O*c{0V!`VPjnTVrbC4?UnM&aPa>BiIf-IeK}=EUx?1zNtRh23$CqtQgi};S|WCSaWRY@ zFR{^a77T$u$dl@>xAV#!Vq-tlAx28B)%Y`=zCG z!Bq#&W!M@xGV*NgD4dJBZq-tQ+#9*85=3A9#ScSPzkItj!!k4nMlMR&{JdkZ8)VXc zh~DkqglEXyr|JfM6G=z`QeEd9P)m$mrJrb(muhB|{p0*f=2K#^ibR3ODPV^tvZg{s zHR1helBj-TbynK2_3uCKhw_68DSXZ4THDv0 zv{BnR&PlPcDqKT=&^Sd~5j7*~vT4*bAhuwk63aRnUZtbRMdx`$vu*9|G%V~OYvJcL z!&VwEM*Sa`-jA!VZ{aG_0b97`oqR#0LAYw%L9wr~ovbYdhZ2(&W@eT? z;QbBAb?sgsCAF`#+LL`;6dw%j^iM;47(+K|(?@R+d6g@>ExI+WO>sBMm;KtuA5Zl2 z_s5NdsniOQxm{n*26Iu|l5|W5{}_^(4+dc3eUH5o<+TzRq8p=)N@N~B@r|4Jo^gsX z@AcdX6)L<(sVTOP`Ee|2d%mRDMzK`*kAK02Ci>=lHg7~Nq|%Nwgio(JZM z4gVCJ8|o0QOCAg&MhBib)z*=LaNcJ?5n{zm+xn06em;*x^wdXx`%^J)?~G+=EVLJx z*ns&oe;w4ZL(B(*A&j*zu^A~+vIA#h)$S2Seo(v3$9Mt4IYhJCGS&ovR_Wnd+ZvX}a*(&us+FFyg^q1l zC4!cnU1X?WmeMLWR^b_){!5+%PVPaMT7pTBO9(l5sU<#FdBo{bqjXeiVIC`nmdC+Z z={Ux#)S;$`iCYD6qF_|1OXU+2Jr+dusC3^vhaOEM{(%nP=^~a-U{x)P}{4pT4pL^O^ouEaardHPS+Z{ z%6)WGD=b$(Yaju1Qy*n!IIcM-7KT3YtgrnlqCfba;9#_jFXPUSQ6r;!+NLhuGZ1k) zb*iWc8CRx-n*-J%)zWF#7q-&8z+MfSQYu>_AdM?NrLnxS1sPX&)w)nTJn(FZ-RlB( z{P!D)w<^Iv%*TjWD`J3!@@iL#+_*}ke_>@ZBZkh-7Sgziw|D# zp6J%MMgE4m8M8Jw`d(&iAPHm#>%uSZOttQJY(%pWo+nqZ4+}#NHzX=WqZ<=dGF;D z_uydx{9X~nJ(I^UH>l7=7g$C{+D140J`42_NQns+Y;POk(ovmt6#(+OP-;zl{f$F% z`-cCUBjq}ZvO+Di1trMHvRA+Cj%b8>5;A=8am)+`DM(*bf(S{ezWHaE#M_O(2B z@heW9|1|E+eZ)5v;)uY+RXgl#4_SV}`}i_87Mb=MU&3O*2s%UNka9M7zyil$z1M0F zMd>_jfs<~3#+y5!{aS-P{ zBuH$X@B==|s*N2ak@~1P@jCp@;+FV*al3k1!iNCU&+eZSALcfftQLBrsKzT;aUq9)fKHKEIjasufBr! z8-H%oAU+o4+Z#wq#Wv_dL~+W-%Gn?_68RNbUTAdE5dOI!7r^7EoceUK^A@*`)#P+T ziqf8e`SlPi2LwSgz)WB|;Ohhir3NOy^HX2@K0Gz`mu+?p$Qso)kI^y{nJCZO{%Ec~ zUSySiPrp2Puw}}H>FD0CNsz{ZS81`~gsP#OplT+tg{d1!-ie=bS^cidKS=c0(2v*z z2mSn;8qujR>I@op!N@+zMbedl0UPS{h-L&nY{sa{JXO&bO$@Vq)& zyaI5B;M2&dj^R5R8z{~CIB&&*5#z*~bT8u;YO8iB^f&S(4f?wWf80N8Y5q08JP%;V@H5xYRb&b5ZV88IgkSLu zS%T4@am(2~b z+{CwjQsyGpC$);K&~&#%X|pNXBZQQ!OZ&v-Q6 zm;3atHVjWLmXs?oFXHX6J$1#`yGq@qU~D7uHG|h%DpEvBYgRuTzu2RaUl=+q>S1;6 zGvQA7C+?xQ5q$%Gf8I_!$?_kFhf1i}A7&4qUU2Erxr%4K*sR%v!v=K{0)tnv9(*kx z=XxCf=#KY(yC;nhE*Zq!PwLUvedrJW7>8y5Wq20+Gao-1?LnMd1H;{{wgvZ8#5MWD z;z#h4u{Ru{*WW5v8ZSUGe7%m7fY=zhL_DQnW4AhJh(o8#U+@H6s{4Lia}ly*dC=02 za?xnOk5eVizuTTIH7^>Z8g*M$8l~n1gTI8Aso)Oh$ydvY9^MAb$0B}V?Wlam3bb3J zg0BDar{eng?HEw)6b+1eps$MUZm?ivQ$lpR5)}>)Nn=v4PT{?~m~B*QxWgJxTKh}_ zSie+%de=|9f#}J2C)XfZkYT9|lzen)NqpCRZ71cjO1uEFCtS(ImsfDh>Bya0**o7C zy^hPRxH17RmlKkEUK2P^%M`$2QlUG)vWI*AAHun43-Q1Uc$i?&2dfK3J0`wf+a$iN zjka*4QW@-e3wkTQ641W{v(4D_eQ{+{zOCI!W9-7-h_9ia__ilqhu{0l&}|I|4ch{K zUIQ}Sa=F=iEf*7$>F|&{qkA9$cBp86d>|5x~)#n*7R z**En}YjJEI_O@Ox*}C?qxj~CTotIp9_O`RvUH8D%+itu1imO*2ctlZLhwYFfcne?J zsGRo%gedz#YheE1I%5uVWO?n-0}o(U`SdNn zPxPhnZxzSt;H(DB)w55LaZXoX@rtXTT?Xbn&aWNfaenTF+ju7TX)l_WUR?*w&(Z@| zue-XAan6{Z9XihIIj5e%JeSTwMe)4byoSrBHr5UDsdZY5W3i@NTNGEX7RBc3<(qL= z^j^k%cuUWFp4ZFz!9LR02U{6OQ`>m|v%uujpT6z3cRq02Q{MjecRq0T>}Q^6v#f0i zIma}~SlPI366@L6KISn*AAI6><9CXeKQy|9SG;1h&F(Co2TU0AUf6~;V_^C@9| z5cjvHbDOWTzhf!R9i*4P^x?mN@9GUX4m?Omm+71=Ct5hq0iP~;Fr3YWg%Cb7dxC($ zCuVUpu-|k94`qJ%CvVuoQ$r7S<-(6z-~b-P7iT9W)9O$^z7eb4Aq5^Ql0lA7Zra;A z>7fShlkSN4vNB$jw*Q1g4)@j+(f0kF$-u@PqfDN0$My5B>*}333{m)_#ziX8oiFfD zWz9?8x8b_W*{f&Ij+4)j)iKX1oZf8DRerbevC{pxym*b$#@WNq#RDbt)ju4AKMz-P zuTjWp`)57_%nx_Z=ljrcMjIJ@YMiFWnSbWZ=2KVcSBd_ojH!9b?dsWg{MtDAjI&lUx#dl6A38rdf5T_T#c*1qZ|~v&^IM7TovY&(?tOV_?=aZwmgW_6JI?nS zjlF4aUNOIx$NAo@+1yG-V4o2vmhaf-3zwOCyoVR-x@`|1t`A2luCaK3=`D=XY z7Gr&m2+v!+N`RlEoTiwHUSE0(ewn*I#gJ18bv}93-&8`*O^_3}Jqk}_ULT%HoSVe> z!^m^-PK4+&$ldp9h`;~Mwc()!Q-_F@=z1lPG&kmESue1oAwZg z)h06Jx3Nx0&3;YjKGb|xu@$%KSAZ`e5;^NyNVUjf(SUwH5L;Vb702s52GyMs)u|a! zM5f$PS5=l#QQsp^e2GhH&N$NSk~O>ZpMv{VZwp!2fi?AXW;I@S)^AOEXO4+imDF}r z(d(L{=p8wa;k3gPu?t-vBl;9gbQH@b-I02SICA%FWa*>JceU2}2!Ynuy`3w)O+%bi zyKTBPHb9h2646&i>Al^!rH^M;!))%iZ66|;;a0sAgV6{t>QkC|QTm9qYFK6|2wh#d zvQezw`@Z)-mgvt`B01ups;i}zMruJT_X00ng*5`;KeFQ_P&Zt$#IudDtSd@wtMSr{ zP?}ht@KsV9QYqCCWw*)B$6}!S#q_?sd^oiE8C=Jnf{M{Emhv?nu3o4uLu=5o6 z)V~HHsPSI(7E01<(X+_eC{f$JXWWvAWf5AirnMsBINUhRiji#&9`dEaLCCTP8xAkBE5T<5(uttj0M)nuJKB$3AgDYqgAz za7FfM9MnSokx|0dYmDd4X^_UH&S7z^63am=xW@GHPkh&Dq8}fAjf=!d7A+CuaO3ed zlC$L$b($v+X5-Y2A~kF%r&&!`^VA}9*xOc?@ePsI8@^#PZg0LZP=^lcmXuYCED;UF zC+i~ekXz#7E3DPNGO~%aj{_66i3O}}9P7qBJV4;0IAUG$FmdloaB*N*{$CeA z`y{+g^bgp}#pJGs7b_r=-R~=j$Qoe`8ex}U3b`YE`rLAnhy``k8MYM)LS6?I?3o{z z6x;;TF&rcjn~ilb!O0+w>u8WU#*dI%ZsSC9ExsJnuoW1-!DwvF3b=2N_@jrRdw=`` zVB4vQ6u+mO3Ik(&HV*6D#dpq80#4FaL{^+bLe2NWN48zlm*E_mdB)J4u;?W1pkfCm zz65s8Y3dltheQpV)RAnBgRomWAsMUe zC25&pt-S$DB!{4?8MhMZby2GqPu@M_%frhVH;*V zi4zua<58Z<+i@A&#BvjNk`F0 zSTi4iHdy8TPJ>`?<5&&z8*F8Tp2H`XSpa(Sjqk(nji34Dw${D$=L_hu3nkw_{>s(4N$q%tiOW9-nL!(dODt+NwlAgaP}qhp zB1y@)u-Mc(R)uO{tkC#I61fWo6H5k#T?bC!3e}?@`s=^>DWa$Ud8!BjjC4dL+DdA5 zrxGQ9!hAG!*jyOx=`Cy$zBX8nJZTzqv67C|g1PH=d-t2Iwp)Gj8K3wSq91xmh&hyz z7-gGDlB!B9#3>a)ZyGkym;if2t!>Y{)`P1vVooJG*OIC?FIFe%I{P|`Y$ZBvm|y0F zKXEjXsW_{FM(z8rdbGxEHCp?4Z{z!j?m6PxpgMs%`veOB5t(=FZ6?s!2b&LMzir?jZ&aVX12%JH%p zW%aLae%bdE{fo~VWp~Z$N9~Ne58fRlldlqe@CB@#?&Kvl5&}Y(p^t6KSRU91}s<|MVn3+b5fkxxa>CWZ;oj8NQUmGp)1Dbs zPJUWHDx%dt?M3Hs0s5}-jQ7Gy#f|8=G7dk5seYVhc4f2j_{Tqi=)ldp3bNMe%X2r)?71NC3EvQ6LfcsX3Vrc+|Q3$KGQq=AAb(-ShyE|Luh!o zA&xs%DN;N3ZQan;cN}ioj<`>KX5$#P=#6Pd9v!b0nugne&48fcFlja1FPhYGH}*za z-P)J7cawMa%?M0_fO}-4W1M%0Cuv|Nwx%QMIQz&B*F6-QOLQ4~(tG!?$q`MN5&Epo z2xJ7h5m4PKijPc(+6{{_wr=y%)+XL-F-LQYdqi*S9*k|clbw?qJNg8Mw{9Bjcy2vB zflD^c2xJ5@0vUmfKt>=VkP*lTWCSt-8G(#IMj#`Q5y%K+1Tq2{fs8;#AR~|w$OvQv zG6ETaj6g;pBajiu2xJ5@0vUmfKt>=VkP*lTWCSt-8G(#IMj#`Q5y%K+1Tq2{fs8;# zAR~|w$OvQvG6ETaYYYLiMFzjH- zWCZ340VCgz*w20FLvLTH6u;H9T$!tZki4sD&N9pCEF=Q>wt~hxir4ood9>b2kWc$X zt*z~3;UXh2_M4o~J^ZD25qR-~{k=O`z zhgTM71Tq49g}_VCE*&TO{8#K%dxP!Zl&p>L^?|WSUYc)uD2$R%wp*SckTcvKZ8FcN z+r|a7HCut3m0O#^IEd1S)AMmSg7EN#O~rNF7I7R>yx>>SawAemZBu>c`*04r{tQ;S z+>)4H4(|cEjVXQHjAEK7j$wapSr{zPd=e){96VPQ{)Dj$R18aolVY`7NWpb05Kb0x zV?nA)75LagMc%Omj9cSGLBKXVoYG2{pM2;?iLSri32iY(%)~yf7+;Zf>?_kNcfRvX zd&M=?kye+y%{)X+*IjKIuRANf`x93lP4w#b)HYq5N)*Z@Raa3`2DC#yZMI!9!wSud zeIeD|>W;b-!qtJXcIryd+Y!KRv?*(|ZZ6GFxoRkO8n&y!iQ-LU+|}Yxxe={h4o;2V zvG(4-#`OQJp&_QG3|l~mXf#+OGrsJ@bQqy8xgywr-VVQpmLtw5xcEaLOfN&IGMYo;H3tH99D{&@JD< zpFCe*pGGXobN^Ie%t0~&*8&2St}r7c&(4JzA}}-SsGeEmxehFFKSbtpH6LqY#Xbf- zC)or{<}II)SY{RzffZ61Q~UnRf4EwTWQNm7gLe1!Bk^`=dxYspm#1?&G`)l#0+Dbn z7l$WP+K28CulV>#`xvp%%W|0!$OtSB0=+HMNH)|1(=f=@-67DEpPld1Z_jsd|8`fs zHM{bjrZe|^D%tEJNP<4%bcgEJP^OGPMj#`wX9$Ed+&yb?WJC5zb+yuIIEOiR=9(25 zfs8;#AR~|w$OvQvG6ETaj6g;pBajiu2xJ5@0vUk?M4*^}@OzTEpcv-4NJx?xADuY= z%x45L0vUm6AuvDl;rN-veIMUzek|ksGoKO22xJ7Nhk&2wIO3x4aqkx;=Qz(e|IB9u zG6ETaj6g;pBajiu2xJ6m1pHCsB9(Ra^%=#Y<{$SZ^BIARKt^CU2rSY(=yQ$x>t%~n z#`$MHBajiu2uu$FKNE7qMd9P#FG|jFo^k$}&j@4$G6ETaj6g;pBajiu2xJ5@0vUmf zKt>=VkP*lTWCSt-8G(#IMj#`Q5y%K+1ojsJv%k$ZTJIU!%HQB_fRd{jfs8;#paX&A zCH5UQ`z7uXf6roTo>SZ}XmY!|MnLU40!<+VC!xv}M4D1C4wxw;Foy`>i>(@IP4cC& zNo;q~<2`C-7a3;Pj6g=SIKA+%SK6?$7sB=MRURQAVH}fqDL{Qb~MH zv@*{rb_3g@aThU6qB1PK(%VeF9jFo$R1!gJoGUCf-Eo{#9Job9=c@O9jObj_Ub+Gj zRUB?4Kbtrso6QD`fIvDpcAIhA&`x5i%bTbl=EXyuMq)J_AT?YaY0dWb3el}=k!aCb zy-yub-KG<#cQ5N&I>5$DCf?%CKG z#V#$ph+_FTfn)m~#Wi>v!yyK~ea^xr#hx+Ww41~F9&MW4JvXuH$lbk95Z&`=k;!qa ztd+zj*tZ}(D4Om;KxjKKgDnQtf-rZTTDgnp;JG^8)%4^bC{*AwlM!e`VAfk(Tbtv` zuC;Ujar>R^9$E-!P3uJKy6$zv*22t92?0KWs@56r81pFw&tWnG8G(#IMj#`Q5y%K+ z1Tq2{fr%05_i34ExnDa*Y%R=OMj#`Q5y%K+1Tq2<0=%~@mY1;)E%J^t!X>jAfs8;# zAR~|w$OvQvG6ETaj6g;pBajiu2xJ5@0vUmfKt>=VkP*lTWCSt-8G(#IMj#`Q5y%K+ z1Tq2{fs8;#AR~|w$OvQvG6MUHK(T-nBesC)=a=fnD=_mJfsDY^5Lop2aMAOh+KSA9 zG6ETai~#u=k)c==K3;8$l5?DAoPXvs0vUmfKt>=VkP*lTWCSt-8G(#IMj#`Q5y%K+ z1Tq2{fs8;#AR~|w$OvQvG6ETaj6gFXF zT4mFYs>!>#b?+r?6SuBS?m4#}<8R~Wf@*eSK+rT8v!1S*#HqJ(KU(Q+C&JxSChGBS z8fy5eMtz3W!KPfN%@~bVM34UM@4A)f=RY>eda#{Q9($t?t5_0LJZ@z%PV431D2H2! zI8KO$&3L}Inp-auUB18JJhQ5qS>#;=-s7ZtTU$uh@M0V?;~4F^O^Ks{K`I+VHrNDa z(1(vJJjH{ymU``|a)?K%E-9kJYb_z-HltKpES*Rkc!Nbm@XlYl9{6tWhmZybi|K*n zKJ*=VkP*lTWCSt-8G(#IMj#`Q5y%K+1Tq2{fs8;#AR~|w$OvQv zG6ETaj6g;pBajiu2xJ5@0vUmfKt>=VkP*lTWCSt-8G(#IMj#`Q5y%K+1Tq2{fsDX> zBH+JLyhvq?=VkP*lTWCSt-6Cz+H zwBLL4ErV~KZ{_cv?>+Ll#f(5kAR~|w$OvQvG6K^>K!;E&a1%1R#r`g(PZ8bqv=&ts zWdt$;4=n`r?z>xu(4${IRHxblSGtpCxCc)Mp{epu;FT&q7LuS8vQjXj3{hMn< z_v7!ON~X2r?b24$F@^nLci%7e-$-=eL=e=>c&p9S4n#ftn?6lB=2-nwh7|W?EaM5g zd|B}|#om;=HDMA{Fjo?zv_Lt23SoB~!U4KP#)d%MahO$Tdxhxmw$)&%0v8yFtkeY2 z+%QuZhqiBR9oKlj%2+*>5H3#Ypgnex_&GO!@AnYB?8T92k=dQC0#kQc30sEkzBhx} zW&7UE`-v`xHtN<_9uq-E+fbYpiQ&b6Z}X@ZTJ>YW6jr9%iX^v^ZBJDax;rq znYIvX=7m@Dl1Nt`Ten_5j9GoNOP|P1Qk$2GOu1E@jfyL?;p?$GdHko{@qH^q%VW&v zNv|evD0^J<2<&DY&KjJORus|7Jg2xL2d+9gR_Yx!Fs=D= zWSk_us;btBsziqLn{|jXO^iUtssQE)HGuiV;U9Vq9e|Dngw{ms_{)?LxF!$?8$-NH zTspRl3%hr0ToXN9kWTQ-(wJMqx>=Ae2rqcQXPRfoUSpa<(Iv74!9$X`-BC%?|?MHp=FA%2pYHj6g;pBajiu2xJ5@0vUmfKt>=VkP*lTWCSt-8G(#IMj#`Q5y%K+ z1Tq2{fs8;#U@s9U7La0m7BKzz=L>OHGM^F12xJ6yg}|cEhl`&7u2x=l&In`#G6D$# zenw>BqVRDC7A5C6&p7|gX9O|=8G(#IMj#`Q5y%K+1Tq2{fs8;#AR~|w$OvQvG6ETa zj6g;pBajiu2xJ5@0tzl=aeAR~|w$OvQvG6Iai z6pk~tOolQeFfRzq;>R<~1%GdDc^0Af5Vk$}%#5B^ht@ar4Ma;z(~7r0aVEq3(5{k{ zwp0{ivc}k-!%-K0cL^udZjt6 z?rd~~V#kgn;%0S5AS1BY2;epUc+bB*Co&7$6|HuY`egmq&87wfRQ^tGc;a?321%YidkWu$T34N96Ejg>im(&yE%MvXj$o zYt&J$BGb}fo9w1{yyFQ(KYhH#d|^Z?%GC2=P(`|S)_b&TcOmT#ET4nwQkOh4ji3H5 z65Jct;azDvCu%=&>59`OPkVRA!@u#zun+x2DjmOeWo*;&@)-z%-QkihH@;;VJ4JkwjIoMD7TIQY7y_kQS;1}+e_bRWjp|bFK(2P+b8WdW z;y4fT8-a>?*TqLB2^-rdid@ME>^lO@Pb!)yqnMAx^Ty(O0uHUy^TdKhOs?p<=FoCX zuEj4}booXm2%)=&oOA# zTJJLEmPJ1g9mL!?5sCzhq!M7T%rITUbf;C$%79R8?KH+b__dBw?$vye^64C=`)?(> zjK547fs8;#AR~|w$OvQvG6ETaj6g;pBajiu2xJ5@0vQ23i?x6hueSwEe_D^V#V}+( zBajiu2;}*EA9e_N*kuGV0vUnXAmAr7j=m^-jKrek9OoJ5pZSbHMj#`Q5y%K+1Tq2{ zfs87Mcacr7#XINKpY!g=|;3xMJkKnewcIgtD8*7};8GcB6->73ongy69^=C_6LVL98wpGccjrEwH_97%LyC-Ga3;!oAth zQm5KRHC2Y%gT>GN4bhXnCkSdr)ocf6TI9$#3@cW**|fOrjYxMjGd{`^p({?8JZ*Me z(>l?3wyEcQ)ROfZr!*Qx%=0tscM_T_k>HLSuq~cxOFc4z%i@q4o~mwB_eRVoBVx9N ztYvofEA1s8{}a7J^xH3ydKeo)?afA(lY5K|IhKJYGr~@%`q0N9W=Y$ai$`WKc1+n6 zOj1AgEf*dny80!P_{^zoI}Yu~w5qcYia1V(zSkk|jMl2S<-l#{@ojato(GNrT757uskK#1n{axv zkh=?M;pLUzr%EbKi=zRGhDO;C4g_OsytFZ;t~%x;QFbq+rPXJC$r{lk{~epn>*(z6 zg4O5|1`$+^*6z)?k}1H-l-B>(8Yz6ICLZ~V&0x|`MAs>RUQ4usCzfnHbJ zJJHw**vQ6-8I}^AY~LAMWmtaUk*y7)Z~Uzw7?&B6X-kqe>MS>;w9!8Gi+Fg~AQsbgr;6b_`-Fo!q9 zQuR@0+{rt?w?IozI5m)h8j!G{T^gItIN!J_;mv@A1<4q<12VDm=qAFws=Rr*xJdNo zAKiI-LnfJFLC11Sx8`BtoUY5EOFl-(>6=^&cjb1E%3eQ%w6gn@_cg*;8_d3DIM8^} z$9*E)Ey|P;*b4--YotG=AvfkGcV?+NMzlW3(Z-Y#oF1qix~>zFp-@cH^RZHn0@g?| z7t%Phyu3to_DoB-VAGtP2op|QUz%ne^?1we zFqyKrzG@c&cj6u_QYdOMbG3KPB^Djx81A}H1ok)YAi`9=u`20*2Yd2 zSK4RY171_dHg3T3%$>v9s_Y&@53`vk-PjlpB%O9~=WzxCJAsV|w9gVP;dpUDskw=l z(vL(MAAY0P)?%=`WgmCUT8TZBXzKaAX;{{CL!xTr!->7`;NOM1G3p zJkG&r=I4##i&r{Lu4gBTU|~evx3|N%?}0jJ6zi*r4F1^}S42Y}qjn93cBPrP_TYtA zy@BX=-^GepE{5DzLbXLR&03Q<>_;X1d`mT3zsN(WlVY76ovG=-L$@+h@B*V>cxSIt zzk%A}H$UkXqMI6zMaIn!xQIZti}zkyNG2YmHJ3oz0k0KPXAu>q<|{k%C?0IytJc;W zh8Qd&a{PB8KL=J z(V~*}iFfy52SXr4_0h*Gk;4YnzC~-x#c~C^iVql>T5YUqA(pyrSFhbH0c9)IaxG8e zJEI7T+M+dp2wQCAAX~G7V+DhQ=T3ot+9}8a>0kqHLW&Y~o`aGJLyk0;7J5|Hh7nr} z2RLgr%C>EaMkt8g0k#j&e!T6qQR~Ie{J{yLul>A8By9JF+O(XHdTHW36jxe$8{4=8 z;Z#)DRA5&E*Ur?IZTeapxV05^nCM>oIch)XYe+|S$4A@GQjOPmWY*}V^PhTW&DI(k zy}!nMyhP{53dzS5R~_#~0Xi=rp|oaYVX2%`bdOr>arhTB!5EB4#e#Xqh(XMkRwEI7 z95E6})YgEf2*N@IZeJKXLVIL}wmw`NxsEhck#Wq%fVs5-wMkDm57Q>b`1V%p*u|SJ z#T>|yTbLQf&oj8}pa&hkapN&BEm%R%7%*E+ZL>}bKph|q%bZr#N zd;-6;!MUpWUidOj&Pc^;eCdT&D>b`F3|J(B0cmRN)E!nKik)f(#<`6Z4T5HzX5Bl? zMLBMAD#^BMRgbgJ zd`2K6kP(;`0<)U4W*HZK#}i5RS*6kK?ANT_o!PY3U5=9x$OvQvQUv_G!%}}VYb~tC z%4^=wkArfnY0Bf6DPPBo=VkP*lTWCV7Cfcw>peGXWK2>8KFD<6adOl?1)%7PRD(=#lPC#UPjr=#~aKvm0A z-?%o8O>F;A=KJ=IByzUzPWb^x{0fJd??$Tj?Y5bn<|XvtrzCo%6qi@7+^%1W-@OvO zgcnSewYYLcDXY0%iyRhv?fY#n|DOkm-fb_SOA^RIvL&BC`TT8;y!^s<6#Nr4V|(c3 z6>FZrKNG_*^^~lI-T!vM2k$5^TKOuiqD?ei84MVTUVgLcEDS6P1r015?U(O||I@eP zofhBnE>2@)4nEnC|Elq#P`bWDgG*vj--E%F8D7!nsg$4AgWuGs^Tu2C!7%l;mXhcc zmq*{toAD+YQm38#ye-R<8mp^zq-_~72&(Z*6hcM1gSz}SU!kxTEWkHGcySbQ?M%&Y z93o>By_Psab=0>;^wy_-(VuS9H~csZsK3rjOQp=>m$=eL9D`;QmHf_z5*6gOQdPx` ztn{S7lz3l_<~CTdf;!Q0uFQ_sw61txvb1u;QM0{zS|PP1>Tdv8i22)vNt8%-?ps+_7%4g?-;$6 zHq5VYEZ=D8j|>7ZTta=kIB)a5Rr+sR#`Jp_D94eR&-{{?ipccVfZ>Xjuu6O7 zCKwE;0zNE9#g$Uw#d$i^D_0e)jNiLyr#y|Gse^Q0ac4ov&w>H{mZ8&F5ha3Baf&Sp z`kj0K*B26f(??OU4Kky#ZZVvJA8$?N5i(Y1P_vt;#w)){Dij$AnAKb|%o-~R)|#u_ zfF;St@l!2KUm8^>FpMx3RIzqa8%#CkC){vakIkio19`F`#JVqTkWkK{*hI^3OuU=6>T5rm!{8y@ig9Ku?CP; zi48{`r~69t0(10OUsJyVd`J7H>SKyKt*$6wemho*I@LSeFMs2;--KQJs~*O!poLX} zwbpcgwX{R?_(^q7zYo|eY;3UT(Kgx!q-J@OH(!32$Y z>WoPp1@6Ubkbvr)Q5Uv>7g7Y!q-0iIRtntl;=)DbQWobfa-ND8FoNg;GK4Rx>ld+D zg0t)m7y+X(U6$J#Uqk5Anz@9rUP3HXax;baZsMCD1{(t87mpyEw98@7y>k2bIfF*1 zy!Rc@9sxifx%*G7aG|=ztn;PHq9e?0|{M!52S^DH>Y?& zBTKrV0nsrxTfzncMjym+1h)#HNIijlfA$GqdW7hEe-DD1kb@?D0D_|ERpkoC zDsM)mSg3Mcu?CrF2(`gN;SWoR3lXw_0FCp?DLFyWv&{@h9XequwSIz%N=f+QBv7}V zBz>BCx>%BIiZy_4ZX|WA(2(#1pb9!k^sWo%p&?AqAEB*n>kXuYR<=fU<*nUlb$?DgrBIEXq)z3QN$-X%VgR&;@i zvZu`fGK@SOKyNX?mNjP%*$VR3Y72Aw>Hg(4Nc-0loi{6nI|qwRgjmDy60io;erhNrT(1Pf8!4$)7L=9?IM;onk$G^>dRR0kqEZ{y(tOJ z2x%-eAE2z=j)kb*(&|e@JI^m+v$W~T=@&@4q(_l92C)qW)a%zT8u|{}_y7xtF7Vcf z6zM;k3yc6P*$zi$3@bFN7v95IkUDhg^wTOW<5b_s{f7mjuR!;&>D~&~)pPX5MYcu1 zG#{R=(qpyMA*$BV7{d1qe2di!qz_5E5LIZZkK^k;ys(pf{ck;Yo9KPKsS%x)<%MG! zO_9R!`|>eeAm5WbvygeK#x7K$2PbJ=Ar8(UFm@nBSi?)sa-Daw<$Bdu>!dFdPMbiy za%MzY8MMoXuBz9o-m31wxta`lb8ro<;=t{03>!ka2dat=gEjBsY!u1~?_B0>9VUu6M;&4&I27P54V8s?xJic5zaw{f{3rD!!yAW4=vC8x& z%($*U4-qx3vj_h7Ui^laKZfX2f5mD#y|!86lo;m(s<(yu`r&oh0#__8+49OwRsRC^ z@;!y#9Xcs0u^ z01!vbI28eI$1(OW+n_ULae?$XS}P0m3($ZV%3`Ho92bidcN!j=8UP8#nDl$g*l79V zS^B&orF(szw=5N>P%1i!IfYceT*ih0-(C;Cr>Iw)Fz@K+c-c~pbbqWeI8z2L@UVh;C+C;zqD;MHj5`9^({8R4ugvG$XB6l3?j|WmT*dq z9&k?zSRCZuRM>Ib+`Z8>OWSpB5X2Q-5a-A_SRE^viZ}~)C`F8g&kox}RAb(gi-e-) zoKBp51jr)RS_}y2HP8HKUxfMU)3ohkaN*6gtE_VwD8@JlBL?0&s?L_hIIvXp8IH0r z7`+%4vLxes!V)>}t9V3uvd-GnE692iPpF2iwq!Fk*i$q4#!AQ?@!aHS3p4OZ**=0H zGzNbfmrMNGLiL%?e=(%`$7~Z2fZV!d5&m;bm!}5nD70h&wqqs;IfAb!?=sWUx5kZt zud5YH3WbGmzH{Ed^_BC7NNRKE! z@ZujJ`lXKrD|)3*_=ExGuQ9T6F`M{oBmb23qac;exTcl7+=}Q58bSsN*Hm#3hQ1mI zR#b_d-8n^TticWl8$%!bQ3Gvtu0(;6Y;9pqx0Xr(FfJ;*LmTY`~FAgQ}J`c)?B2n6w{8GPSfe#>W#WNnVhm11?2yLa1VY z5X74K7CPx$Wt|BIc83speKIKAOyM?`GdKM@4(=ZLE>ZiIBU_(TEDF31oX;V&CmPh+ zLe^fp=g@?#>}|gdD>PZ1(L5u|fiZVLGf&u;8`&IIk(T6zAp(Lu7nTeP!I>GH4Y4|q zu1HA*N6AhIkq`tkR>RUpu_rOI&YXvp-{>g*P^qwwbO%BL$h+ZDBhawDewdL~xG-3sFJ}u&z-gT>x%|;nSVlZ%L z!A6x6S~y{5ga- zqhM9#w48{fC-p5ajZ2qmEZSp!;tT|m!6YY)6Gw^pB=DPx8=r(#id{XESu=iDOxV{u zWL1w=SlbzdmHSI4xp@qVO7pf=R2y0t%n|FXS=U-~$u`hvY|~Bvwtxq$+1pz1(vsg$ zfxPHMYB?=DUzUV7k7#=;CQ^h$oe7Y^T!ZuemDX?kiLX6{dlnyKgRS01(Z`L_o_Y0Y z(svf>d~daa}*lr2$!WhoOfVNMCp zOi9mp^_@S6^U%k#h>WZaNX5mk83o4kVupnhhL_6mnCk+$=0bgjOdnTiS2QkDa~rN* zT(poDE5-Zz5=YipCyK91l(-;>!wUvPai^5RjZ}~#gM}uHH^>Zd(kzy7s;hI=DQJ0h zDf~NTEF2eBbx9hP6BVyvXf1)4!y2x?pwg>2O8|#~3Bl1*bPn~Gzws$VU;4j8Oi-)! zRp(o<#FDV<%vZeNj?@(Fq+vN|cM&uj1$FI_xqbmymi?*i?(vv#r?dM8c`mk%YJ5AD zkKqDoB8@8`7%MpF(}XIMUgyJe%`6HjnHLU5DB;4BJY@Le<&v#R%}TW`cu285%42rE zwE~S0Nb00madui_K?=?K2JU3h9mgQ%8w~6GnPPk0Mr)Rd6DQXs-4saB7Q+F%X$v%& z_K=wE2F|5byQxS`q>Fh(si~(NZ=@`VtRS{=77DYPW0T^=zwtHr#^1lZTZC94hxoxW zcd@L%T43IuRyQ^UlZ2@&bt_#Kwe1wR3mk(7lA|lOeN9*qe1V*G#_D96SFte}9Io(o zUO8_JRu}7vi+b@iRH09%FtD~WraWEC+l!KMDUGoXUqY)$(&DK7L;S5=IB8bNf}Z-e zBhMxJRgTOWM>YrSnQr94Z{=6K3ny71JEsWr^XJz=*^+aVH09natRPL??EqL0I6RvvN#&|TZr5V`e+ zn~-j(!*sd7Y_QX)dVEu}up`*srDXdf-}x7>!}sP8e}G&9(r&CA5IChm$rmE*VN*!o zX=hbnP-FHp)IScG044Vjhl4Ula+^G(l>Km!&@VYL*x39ET2qG1A*>GRR$oGZzo`5a zYXnrRPQ-^Amk$a$ffyI@M+OgPqF`SKEyqR!nwR|8mR%)&w(iq;qJRF8&;JvmM|_1? z*gU{8v%v)i6Vh0+)SLL(-A*)OvR{jkBN8xmhAthejkhGe0FKTPCS8qxf!M~584(F~ zUay0dV;Fysc2yLB*|mkj%Td}mRs}hptoh6@e#d=8Uxs;JsLj6~|01cQ~Ox$2{7ZQUB4=LMUD}u4{N_LcHDnAgNjdmLi zS2dm@;&O?jFt#ZEm-SEJerW$+vz&uK6qDG<^-3(@E>T@8`ZGSYRHFH z)ex<=XdQ!%ZkRztgoQjQB3gzBXOf(~0qX{)?U0zRTF{~FSBgr3#5$qkNU_paxYYQw zTIMVn&!9wOCu8Y-&wTz>qQ|d9CS$PaiXHASiS6)6?OGXX0*=>X3U6r?+dh!eI0Z>a zPNHlK$YZ5uyA3{x5mdRxgsS_~se+YpyV#e)0>MJ#@GWG5#_#%Ln=W5#BOvqXZ2PR((QXv~G`AZz zBv$;e!KSa*_Vc!=p2ISMY&ePPG6rp z_cZOT*L1fVEE>$S4!#5sUszAYI;zGz#3QpC!y<}44YrYCOUP~uO`=Q2VM~D4QQjVP zWGH&ymG^xR=b_({v{Mi2bguv-Wpfk@Wu1bx=6a#9a8xMI&AK%87_@VMUB=DgWInD& zeA72lVQgy*qVh^Ci}_)`)^4!fkFB46H_^lHX^(?VASPW`>b7cG%GvAbscdGo=HODp zTI$+VhdK=lIHB%TfAy(EpZ};fx4p`tt?kKVcn;_Sc0qO^;7lSVtPnoGGa6R`lHHkK zQwCb`_2=(l(*>iTB!jxgOd$5IZZlvjOLl$wT3yx_ zEb~@A|JrWWoJIru$JE!pW2h*W)TC?Ha(06-wHQC3t}7Ae(C1V4b78G$Z(w^Kmsg5Q7Lm7gT~@Vl6I zq?;Qk%LDFp1CYX$Nz1Zj5xiP-(-O%f-4-m$lrQ+U6MhsEE>XEvi zd&f5#^}jk;`toB4^ZXOmDnw{lhj=jHmfERX({4W}($MLyd;rD}o1h9zR~#=tbL`{> z_Msqh zgKo{(!FOhuHk{V<&O*YgYol)jOq=t{fmMLxmY04z#`&WLj%ndiTWcR+ZcCpbADbDM zrG?5NAqG}coR2P-I$IQCc%JPz2$Pnj;icxAa_ywO*my=H2#3p6qQ!B#qtJssb$h|HsQtyDbX5CaypavL4TlcN1POd&bA{A=+5*KN_Q83-~Rfmy=CBnX8u zjz!cL8(tG#VXjxDlQM3a$wt9C(H!e(=9#oz*rA5opZp7pFz!T&#|8`=L2TQV3Kkj? zJXf>s>Y^44Z}7<9eeh1A^Wi*HivmjM1EWs+?cWLmdr)lx;y~@H)G{k!uJc_ zyp0EpzT%6eCJW~#yv>2m*ILgxjjy(p&SJD-i|>v_N<0SmSBPV`{#LrhzT|Jl`O&Iei=V^)j}8Od@p^zf<4*y0?#e7eVZ0P7FG1BFdtZ( z8$P)77QA<^ewYqcbqvH~x9?9+on6tIh_C7F9`x?X9NG zpf#G`Mq;IjD-kbiB&yRpKmODI3HOQawlWi|+W3(MZBBbDYu~nTC9DPTB(rFv4Wq{z zK-2obK;qs}>6>UUijDc4k9_np(XZiIu9{5EE&wM3RX{@C2LINgq&;|0c{18_$~exK z6dvfe3M+4}D<9K2bFpE^ve@JPr^03c9)=1f)|e<@2Qox|bN4_0Ev!X(ae&A~&SC4- zu7aYSi8eITT&e9I`z6)WZ@3OwbIn$2C`EI}27W6;%Q#+)$zA}^v1o4jmSJaeO%zEb z(Ho3Mdk@WR0VeKhRMC(ZQ5{tw!%M)bxQxi|WD|j{yyZ*&9K&?ezSFYSx1?Ar=ZqeV3m39HQ5ybBl8_qnzhOzsA?BT(UqE%@B7;= znGhgNK8R<|tPg2{e~DWk%nle}!HtZrJjb3R{b4-4~G`SXW z=8g~I+WA{v)wGw@X4=+XTd$hl`&mzZ?v^H^(rQ$5`#UvYVVsd(iL6`MmVpkt5}TL8 zUrZOO?=*OK)O%tX?}7CYXeC5@6G@o8tT0-N6PMJvXiy<_(~yQL-nnHhf~029RlKOQ zuBRN{5@S+HvnJOiBH{I4cJ~&3;ey|Yrt}0E<3(c)r8ZqPY|HyWJ$E*wS{nDV_K^Z9 z{&QbVi!X~*hun%esuuq?vn>eOBGA_97rmP3J$HG5Q+gZY<;~I?H0ASHH%O{5y7Q)2 z-Ivw&^p{$0!FfvzFuNl-=_P5&ThErPOXC&4`@)CgS;go4j<0iR@ZaX4>vUoR=FwIs znW5TFx7{mLbadDft!?%&v7KIuYm@PQT!Tf|B zPY0O}`Cf|)5H{|J(wbFRS+~Z!53_4}b5Fe=m!#ub%;U{Z2_0L$^A5Z>N)9m-g;eka z!2rd1HCl~gH!~UtGbO=Zt>bj0?yl8!y{_@p;xt3F;k4r?LWYOkjaKc#c{jd| zW>u*G&g20X67xpi_p!R80XaXI+j&Mi0PTFv6+i!Y9;NX->uTQ4Mk3?yCxV*3iiM!2 z+@m1A&<@%_!uRHctT)l`J@@Z%9{S<`Hds9p~M8 zqN{kf+P=_!9k`4Q|NZ~)T#WOt|D{RM89mNl@rp@fX8VjlM&Q~(0B4KbnX%`h(DTu| zq|p{3SY{Rp0e`f*NM(%gBIWIKjq}fZMj#`Q5ttSNevVnBGVc2#vT0EVC$l-1|kzInFcAKl2%Zj6g;pBajiu2xJ5@0vUmfKt>=VkP*lTWCSt-8G(#I zMj#`Q5y%K+1Tq2{fsDXjB7j#POpB%%s!plb>lwT-3V)q6lXg2>n}T8&37f&@TSS9K z!z2R%dRzSZQnNM8Y3_BdSFYgxtVzyJAiRC`8+3yNp{k|E{=BXhv~fus(`FILnlBMp z+bS>P9mV)#Y71pVGp`HRA4$B<)JQ$)4LZ=Q`#v=>adDK_`_jpMb!R1#Si8K9Cbuq) z8K9Zom~MM#rgq$vc(%AZ(SXJad`U6ILKSaCY^2I^1@GsX6w5d!hq+cr4R)kOG-x!D zq*QA9K_|*!cE&?H)}@4e(g8TM2Lr)MS{Z~qYzsauxH->(07IKwNM+ZgKh4hA-OZK@ zxfd-?Gy4#${vmG71?6rT-5nrpO()eZx2odzLh1GHsHr9inyTiowySJ+<(z;ak?L?- z-sP$jlWV1tytWrz(53G-NS!9d-(2z{XOS96Ezx18#59&7Gxsm}CHCaLf=Den4ZRuv9dI&Z(yQ-i1{_2H9FRZ`nGY~Br z-~+mO6d+&I%qs=2eMF^`w++$ScXrox3#nf%AK*f;V-LRP*RkdN0b2xNonp<2a=eeB z4zxByff+ZpvWBYUQWj2N$GEaJUV3Hxs`wg*$S}Bgk03}HtFA*(?^hon`r^+`ty*i5 zQ>%V|gt~6FPO#=`EjZI5k7BTWurge;bsln&JPc2-=W<-S^1G+;z1AN&Z|!##YTPDg zXlD=`qspwgk!Mj-kfLWmd<`5^zXbjSjt&atlhD48 zKCZ8iDA8^^X%PqY9mO%cN3`E~$6`>27}hOR=Z>jIL(SDmy6hc>9!e*z%?7ytpS`z% zv*ozz15fwsdG2|BwtJpO=E;aq?|N)M1gytjeC>wRjIQKSkYHr=jGX`(%f^Om%*WzD zvcK#vHN!}Zgm9ky6CiI)c4SOYY#?$Lve|6*m$7VuF-kBHvdd;!9F~NSIIJBY>>7yo zf2z8=tNV7}ueo>T_RKl&-L6yTt4{r^y1H)9y?vWv@mQAl1QrNekLX*n_RbWdZG9gw zzyB6)j(>r}lIC;K?$5#HWPc9D{jR99D%?#coiGY0-J*MZA$wlWZHZg=0j z`FcD@^f|*rbw^w2^yF#7UDdqGh;>cPFsznNynKW;SlwlRSL4k!Y3Sa_Pio&7WI=@L zr1QXYp<|*RUT2d|_Np@;jM0l$)`>1$JDZ40uLJ=>KoD4D1jfE9jAgiD--FiPhECu8 z{7u#L0p{pA>)gh|7yXH7!}rRiaQ`h!cpq8_b0zDvH=ME@H>D}V=We>my(X+y(Kr4J z&J<_vDzIhF3h`m8K?j*VoFQK6b42wo|Sr|><^;xt&W(-}iOEy+8$8Xd(ixr!Nu9#V6x7Hl!X0zB!TfDrwR=O$s zr!V>(;C!7CZr#FC!=|~nx>-E2G%h{tB6Q(9?s_rNcfYC>3nvInhd?m5rVB8( z*W@k5_UpK+H+B29hY-Cdhh}l60B`N-aeJv+Bi9r#u~cV>K-DYel2BM%op8EIs#1q3uxNqrDa9Prd`b0kqunh=V~*S)2g0h*=I7^N&qNbafdqHNZEU%XFQvGrpL9 z0U{~73JXL?uUUtL;sdVdl-jVUWR#^5YD{J0sOYdiWXis=Wk|L!R-n9i|Ce8Vndo(| zxAk_;bA+(!)Idj(8Z5Y1wPiE zd6jpY`I2;^HW=h<$pNJs(CtJj0=O7#Ky|?xCQ9E%8l#-zJ8Dly93g^5q(~ouXG(jn z#L-ZEm^Xr1(KGR$SM}n}r@hohjg*k~a=l5hlYLK<-h4Qx!6^U z3hWsWrW7e@%VDI^7aUy;nW6$cV2zJ9nRk>F{X+dp3`8u&NAad#5O5mjXL8JgqVeJq zaex$f#q~|wU)x&G{UijNtR?D0j5+2rSJwdu_!lSfI{*6bi?F6R;-=u6(UE~1nk1%3 z(WZ@OeV_JSM7zE9JvP#bNqVt1%riM-%SMXpPJmOnnKIhcUK5kb`TzVMp8jQ`-}yzW zNlE8XxVmR$_F$K}?59%*Ts)+UIF^r?A3`ld@sEFa>l=w~{S)VDe1M2S@{5`my3zzyZ7XQnkxz=O*vbkK zYPP>X%0tcwlL{@sbHk2u&Yn1KozE4a$Nn;a&l3EWSW3IgfB<~5x}SrA$*&?EC9p|T z#g~;lSB)4N;VP))7X#M{Yb%6-&=mpu?&Ok6oYJa5rWAqulCSxl?-)$c60{&Pl{kY`o5gK~i4i+RbbCzxr|frs69;>y@rlh{j~>ky}uX!x8=Qq+P`z z2jyippTY)h6&lVHWZuk&eC1+8gBO#Af#J3+ZGd|^;JuvV8`99=rMQT)HBx)jM}Ul; z!$OE-a9Os8nT*4p+Q4vQ4}wnEB$s9x;`8={Ns)$wNupH2PivE1 z%eK=yPKKkh9QtMD`etFz8Uv{#!+f&N_JGpme^oISCZa96046g@ zyaIj;Fzv@H`|gr?4cAbLY!F-@;jqtBYBNJ|!R?WugQlR%Z}#jmUDn{;b^03ig@qMD zZ#gRMp@8`?3u=f%!*I)KUcM!e(hLaU0JFaezijR%n2K{9vTE&FRDe(-Kin8hy zz_hT#=d3Iez%X~&r!{a;NF?)=S{5xor0wqP>$ zh=bkjqPN^(*J-ceQ_>TUKWBm@tHd@IS{A$fz}O##^%~m)Yg23{96WRpzG_*)Ft=ge zpc=%qHG5d5eYCzxbQ$gBd91p|H5*_+K>Ivtc*)u18l@kyh2smBXTBqU%DS4)rLHLY z#nrWnsA z&9&UV-(SJCXJez;XdLMz4cGb=hMy!1_kA+^_Lhn`?qZu8hVk3@`Ur$=lzb7t%(>s^ zZH3-$Y^%w0SbrPh+Yp6(;(oRDH&D0Mj zU}!^?e9CCLWLvq=rY&YDKMvoTL`4y1R8dS_nJ%KkJb--a_MKyyMak7emYR~Qj&2+N zp;hQxZ(*_PyeMAkbL^%ov#)3av`M|@{g zIPYAR?Y9WWMXn>84>d-A6opnLUvdPCvQ}~|pNxt)cw8=Sjl`vY6UVXJ7=zyA2_`$H_wA5_VEFEk?B!a*I0xKD>=aYSo zYcbdJ5tqNJ+6(}3k^*C!#~z)@*drgRDHdWdCamOq-MY!9!A(ShfFN*!2u$*Z=J;u8 z`;`X%mUcJE1ZkH%IJ?{xYo1jVHRqF8{r7(%^lnxk$PujcExBPUuxr9aEInKtlbQqg zmf~9cLQ%^nPb&}Yi^klnC&vL}sfgLu*2HoSJL1Y-QAaM3;#g)>h~~(cn=6Ls>aDhk zAeBmrVf%qiDXv*J+LYG9oe2cOiJG6l+%J=N&Z&JZ7v@z{u_|p!ImZd*xj%|hTFOF> z+pYSthq38|pW_;|;V90VIVNL|zHk*jR(+kk-fno~xN2{l!$6$T^1@M=^Mrt!ptGun zJ1+8_{|OKiQ$auw5CjAPK|l}?1Ox#=KoAfF1OY)n5D)|e0YN|z5CjAPK|l}?1O^a@ z3c@Dw zwDB#lO*M|wlu{pme7TP;r63>(2m*qDARq_`0)l`bP({FQK09^@d(g4eZMtFp!V3a| zfFLj{1iHQ+c0K=Djiba71Ox#=VEDajUM(3TziKWDACB9i4WyWU}xG zBx7W#$FMmelY}%fUZ8}I+wU%PrQZkU-Tj^1;||eu{>Q$WVy`&aZ_Q7ar+A%N1l*&4 z7rT2aD>za7bIBGv)#GQ!zaKk2jdQ6UC;C0lBu7NgTpq`EVQr4Ryq<8+GESK1dWY%6 zvu~U6V(2|DckHCD+5X^9y=kp)DbKFA9yq(~E`z*j)i6Z%I%PfGL zAjV3z0?a4-JJAVGiwSx&t*M^YaVkHpsZYdz6BQB!rbM9awrnXcIp2gkabp_PIEzwV za^83RvhcmKehv3>S6<{?RXxIhpl)#5_0fNAYqtnAy4nwuR|5+#8r0;HdJ*{6R7YFs zqePeYS=?Y{s^$$ARfA5|iiy`c!ROSS9=ELK6ugsRRXG;($v^J(dV;y054bH+wd`A3 zkP-3t2->f`A|(2+Rh7d8}dcUO}rppGObo8?&0f)C2)RKoFP}0)Fk{ zc>Mf4t~=go>Tvcb|E92o!Ime3>QORr{Wsb56S-U!GOizuueC)+Si$(P))*mz7)@eH)k zBjii}W@)KEEpCgR`4o}CkD(|P9T6QJWqR8_m1WDPlsvN@9T_?zrJN?yPPIjsE56j^ z`zh;tH0b-xdZk_R?fPbkZhOk|Mkz1*mH+d;$BFiD@pUfWgE&mi%2>X7xNSY+9_AKR z-O1K6ZZ6Y`){qUlpBRc#vX2(GU;5L^Ss>jtiWD@kh~4=*Phav>w7X`!=)HHm@DGUo z%qM)^mU;eb$e&#P6?K_EEKZrSgcC^OSaHc%BIS(mj4_KSG;Cp5X=(oo9pst>Gu(uMpNuyXCXST3xFS+QtWv3I1PK7wS9L8v$H*Of#@*3LRmk%mOe=baki;#7YwEA`h6L5dOX9jG;2Chpfu3O~d8{Dh!@ z4SexZs}M#ep(of8iu90Z?@L~G+xHrJPQ2+0|^!Jg@L%D#X#j$|~ zjK&zDKnbxwuoJNb1}<9X8k?LN8Jv2Dw)JdRQJO@nNJm|zo0#Bu&KPnvnTZswCn**H zP(tsc?BH6u1vxAZVR7lB8RlG?ETJ#v@U{HlLj*}N60q1+bje&wN#QK-FD;v!yGgor zH9dq;W_zCP(O!bdhwH@?w4dQTBIDY94xCbob!;)mZxKVozes%XFZ?%m5q;wK;A2Ne z*#+@Az?{Qi${V7qlsRkjplt?|2()4-(x-|yXMv*7+(Zue!&iQHwl&(V00}p$o>Eb?=SCc(9X>(tA@L%-ut2)0`}E+ejhH850OH2^Vsu& zIU(>h8ygT@J;ItBCH%lAz!wwgSR*!5L_2sO@x$3ebQ2gEq`|=Mr?-5V=v7!>n6PYR zNWd_dJBWa7mnDE~Pan)~iuh^{1C0Zp08BUS@zf3}ItuDX8%SO8<>)9%q8`gwqqt*F zgGrJ-2%=?$Gu&KQb9cfZ!U9B_EM`f}2e66CliEbZ z#!0N^v<}aqP5mJ(r%`h4N^&9Fiqih>8m+FOtI$xiL(d`Juc(a;+lkee@LXC?dA>Y{ z^cLOh^GdmnUZuMj4bt~ySQ6mtEbJuxf{g@IP`N&8gL3uJ^&@?RcAt$CUB&mA=i32H zUcxr<79UlN$&ayyFQr#AiVnEtPrm9qpCQJV6bn-zLY(TxNb**D+TP?SEoBia047!j1`CjXy5LA zh7}-<*X4*bU)$LN^q2nOzc)mm{SxMxGTJeg!6C**5eH6|Dce4>B@PJ>3+F@TvWm%V zvsiNSw843mqMD$|zwWm3J^BV@FC}vC65G-EI;oyrRLO9Yp*=54~exKFbVZX=_dJqAc zdhwt8wP*0Y3&}cStLUN~%FD^B9pYRQ(OS%GMw=Tb66PSl4h)IsHYZ;gtqfI;}PSfkRGmF+7Qy!_hKEv-Xb%wiS$(#YK6m9x>v`PTs;JjMO%})py7+t1mX14 zEH%#|elr44$$XEU%egN`7VV-LGYEdHy{7}1uO-Su~uDWeAZl3gm<#o(}L+joV7*(jXA8xZq-qdNIh!>um}5!hIKaR@}p zUc~r-?M^=8wUOlAX9Goa+uy>RP_K-gGH);+FH#LIEE+KiEnf2wYb0)rGB$s{QXTp9 zkRwZt-eZeL43fUd9ooaL#ALXX(vG6_%*4*tY|+Fz zR2nsdS9nUH!f7bH=n~%X9&R#+J!Wcf^pvJw{pzp%O03A=&k}9VNJD6S%d*xC&DfIL z(5^AmtxVgaLR@ZZL8$CqmQM{Y;nMRVmnUATf}U7m)iKakSXecMh-jD1bZL9rgZ#|- z&-+j*2|aC$z&f-7->#_{&aaxoic6PjXoROiVKJb$8s}D>GexcHn=kDN2dZjFL6DdV z=6ohODww?fZ+`k`zLDtdUuvs57rMevbx3V9kk(qNn4eCini1}6a2k2Kt^=^pR^*k1 zOXk<#+}`)H?1}R&>bfx0MG#h+!XjWQ7J;1TpZ{WZH_^}8dERd2UDzT|Jr@n;>1|J_ z%$8DP!AqkwdW7s-NCq1>He!WEk8fC$Q8<7}aZB(Z=Eak%F@tqA2cA#qt8B{@8xy<5 z+*m)ni?Tlc)Mh*5poRfg;BGnhp4Q4RMH#OgRcH{X)kR{0Z^kE6_4H~F8D;sntFESRevR%|?OF?%TyfG<##5_s#{_A6!FPxd? zza%F%EjtNxLfc%^q$7xzDA~tENq839DR-IQJ!*dsnjPWcr*Gl{q0aY%Z{c&=QUVX$ z7Xa~0v+>Q)&ysMqLx_2+eQ?v#B-JC=fCdpUn2UlZ^+FsaHWst*`8N*jCO4b zx`5HmWuCd%1I5jNz_GIc$ zZd6sAf3850VKtMn-WnXYqwLKcRFJ_?LQC<{;XUsly8WM7!@OxORO#t&;y|c!zEmy( z$LJZGdy%z9UP>#nCGM4zI%GcKK{3!d!u>haaidCc$p_-wQ~ZzrTSD9|W)xJ|$ZN1E zCZC=9EMfr)OC~RUQB2B$;o+p8`-cb5CHmKY!AcS*AZhn#f2x3+h4OEIDQyn6CVP21qL z3)6Sgm<^%8&Agn`sDV&(j63EPvW@2k&~R)^&K*{Kmjtb?W^^CY!}Y>bxt=?TjjO@) zeZ+utz%MXsFKTv`H9pIN@d7S2UZWOcwi`lfh%Qup;v=tlE77C-xvT&f?Z=^AK9;7C z8JlHMJuQakmfb((fEkyFn>g6&x+*MSh|X!Yw|Bs;CgDpV6!{D-HXSAxIByGzjp*-x z*(grwjvOUhvw>mgycMf7UJ9>}-u`cY3V$Qo$NT?+w03M2^FnPIe=n>mJ+<1fREwmJ zIg5)pqnXNx4Vu5<502hU^xxt-nv-Ane0{RgPKn7}j%S_X&qTPh?dNqqQ{9xXbJ%I@ z3?%%i62Ln|AV;zap8R(g+#Sbu-bcwz{4UA(Mu+d%`Z}V| zc}?gB6K7?GmUZDnqr63k2HU9E&AF0AnNjxd37T(d+eGb*&iK0cPKQj^&$Gavobd@A zmDkWUle4y9KL}FVg)9H<&My|M%|Kj6TQ(-tnro1`KWDIxN!z18n4EEdY75p|U;Bpt zgufF00;_CDYvY15>xRZ@oL@N}wmEBmdWYf)R?yk^w$ErnO* zUCn)$+3XMmr`Oc-dOyt&AUb^x+qWgP=^Mup3)>awjgg8t{56D1^ zI^U#O3m9g6D}b%+fthVSpeO{|)&mQx=7V;eEfBZ}Z3V1@1?1Myhw~*5YCx;2{S7qQ zFGW1!BT0|6I7x$DyqPq%L3ad;wcPSrp+XA(Y~c?q0@)QGoWG~XvQcDUeLQ;Tr~bny ziGJJr>_9oq{57&>lW$mR(rUGNMR5TQOq=w@SR#Xhryu^TdJoZ`Z29=P z27lcPt-O}Ym<*2gmRt~rHK$4FagJQC;(d$rGCuGdM|1(iBlm@>;sn3Jr8)B7ab<+dv8&z-BQ7%F_} zrA`&Ax^jW)C6efaYD%n4Zr^w3?t}dgB9+RL3)G%9p7AAHD_;r9r{4Pke4z2=W#(4L z=b*~1s^?=-GkzV+%}%r6r10n6@>V(3z{!?fdRAO?0Wy5B%_j~B9ABSp{1qQhg*6M5 zt+~G|mvOwQU35eHg4eJ6+E)_2^~I$nb7dn{`6AZrbiu(vrGpe946C`ui(DUV&5Jk$ z_~Ly%sza$9ot&$F_NUEv<^BkNBhqc^4#>Cj>=oylPZrDDwS$GO#vJo@j9jJYw{rD} zZ@}byZV}d)hk>PH(pr0+OI2Q$McA5`zHa@=j}!g1U-9)WmN6$?f>3hx&NOJOZ)w+P z0h5?^;X23tt#gD>nB4LfoG$|L*U^h+?T`9cw3EtfNbc;W5DmL)j$x*u!h!L^cqT=7Xy24>=4QL+ZAT z?9HU{GI*6_O16QkK^Is&dGW^|!lxiV!Xj=?G1F1PW&m`dCHpoxo4XaJ-Iq0{CGKc( zz2y%ae$V^y`SX_ZtZqFz{>fWto_;uxomh+>rfHPVVXJ^BC*v8E`Mb>nwl|6KnA#{% z>-@#hJt1m^Or_RT2`vi#_36zY#>YVJWCz<^p+RE-&-$ED_ zvuY4Q?xYwnX7Y~>)jE+Yoiwz!F1crM#+0j>GYx`8U$*|<_u}*C9}Hyf=6EO=aPvuq zMyJKQKgj8Z=ItCBkT*yRk#76zUJ<3)z^_e(S-}*c3klK24gMt3HtsE!)MQs`7mq8h zk2Z08pQ+LX?Q4Z$*#{PxYPGCc&N(53k5cFx!WBBlgcc>QKl0I!;-M}_-q>q21fKUg zSBBD%uUegE%}mlb8;5smC-I%q_UhvYX!YIs{pBfxblk1@USLZ<@{cD$JDWN7_~Xm? z+uXz5#oSn+aCCU6a^vUM4E`oRg>qEAj!P5k8kmX#V(;mwZG`UruOIzMe9z)hj>OzgD2lTLe#p}$|Qd1A@#9Fia_a=29 zQvp9An^f(;^E=*z&mF#GvnusDsJghL_2T+CRsP5G9&GZczXf4m4{EHWHbN~{izeP5 zKOx4`b+R4VcFlP0)IrqdGD6;SH0XWYmIfo9oTT2%5iKXx^>&2yvDI(hNp|o6*^_Pb z*jWz^FcIL_IFz36-vbo45zqr)`ex*~(+fo1W$meHCeHuB-u`I!YuAk1RCOBs_;1rU z6Fv9oLGRF-jjZY|^=k@pgQ^h)MCy$D;Yekt2CVwlrX}HhReJIsq4mBR3 z{Eu(?@;4Cu*$3-prY=~}dIZ81(7u=tIaeQkWZ%zzmY&yc#THDybTuz2r6pIlaGFy8 zsZTMOpM4%5>v6oSjNvVO24$S8&B@g`$Kw((7ZL={JOVP$CmZ6yRcvs*^AcayefWVn zPUg$H1=iADC~LP1tvp|~#;1w4m;NKsuh@HT-li;{XRj?)pHjOBT*C<6XpjvTHQsTo zx%6uFV^o3pvxxrcIISL|l|^?QV|6(O<~Igs0p|I~TR?f9-Oscr7gapi!&ziHTg)-f zzkL>2ol*?H!g2GCci*5Gl=BYP+k`w7@`Hm=9`fwjwN_O3#yj`Q=pE?@9^Bj!VLE-)WrGuwHNJaXYN?+`1pF?xOJz7tUCP_% z8s;y&ARq_`0<%KEuQ6RJ!@hSZZ=Y+Jzwm;9ARq|L4uNo$=?WkAzAHJ0d4~CSgEwjP zXNbPp{DU;TzZ)4#mV$sFAP5Kof`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|( z2nYg#!1M^%N4-q%ek@Nz{4DN+(@f!5`A_S7njJo`m`^)a;wK0Q0)l`bAP5Kof`A|( z2-v6SR=&EZX9h~YpCEF-5`AXDI~}M7Nvw@5b-s;ui@$4Y&7J_0rS@i(c0@ z!Q;QFoT8sQG2d%>%f%^N#ibR2;X?_n!q4R5b>_(|N)JHlh#& z1OY)n5I9W))M++8R@*&=j}`TXfADCmKw{K{fNBuNaj$nyKF8J2dl3l&f`A|(2nYg# zfFK|U2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFK|U2m*qDARq_`0)l`baJ~?TI!NIN zbufMTUTZjj!V3a|z|0Wn`g+*){AV_h5=amb1Ox%{D$ynTdP|0vf;nR8{wNp9o?hL14iVSeqn2RWjQ0&ZMJi?o|wu z=lnNgBhncmVE8SEJt%j}7|l()|{%wKpxKoAfFW`%%XW4cs^eeY7< zKG!gR;ROLfKoFQ60^ust6+Y~JS8@*X4D%OW5D)|e0YN|z5CjAPK|l}?1Ox#=KoAfF z1OY)n5D)|e0YN|z5CjAPK|l}?1Ox#=KoFQ80&0Gtr;Z%Qy&h37o;rXy3Ic+FARq_` z0)oK#LO`ErcPl?8+Sh%q_fIqfX-p6}VFdDNt_PZ}oDBn75ln_a1A)VD6A}dGgg`Oxa>mT5oyM@{;NSqi zlUwA_Xe2^GpyLQ+D^Y|eT4V#=7?cc{bV0C)n}Hy01<{9QMydWS52m*qDARq_`0)l`bP$J-W zja@3s?D2Hy4pNxE@PdFKAPCF~fetQ*c*cK8UC+PliEx5|ARq`F7XiN_a-6R4VV}E_ zbC_qCzwm;9ARq_`0)l`bAP5Kof`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|( z2nYg#z)TQOGl|j`BrX&sSBNHLdOgI5j~{2kW>3W2%%zoMV|DxO*HfZLF3lx72`UH( z0&_(GCvQ6qRkpj$N^?NQ%qo_|5d;-e-T!(l^~n^qtox z3%5Ad4LI=TccCey01<{9QMydWS52m*qDARq_`0)l`bP$J-Wja@3s?D^@?-J>vn z;ROLfKoFP}0^M5;tG^x6_55cwjuJ-@5CjB)a)--U_|r5 zyG6Uk_oKAvv8cP>Cu;aoj`5werD?Fp4H`66Uuv+Jfv-8R%^c*Rx>~656Q96z{GbzA z#`y5uL=Ivs2nYg#z&S!d&!n&IQQ9@W;dYAwO}~%7KcB_VD^~v0?txi|G9is&NESE2 zg+NJ?5Cl#a0X5Kk`F4+0F%4RHmqAU{m*(Z$vn|_qqdpfY1pz@o5D)|`0_``W1^}AC zbij8uf;2T|HjyNXARq_`0)l`bAP5Kof`A|(2nYg#fFK|U2m*qDARq`#hk*Z`VqccO z3e6IZ={5CoP*a!G>t%#NOmM$Sp~~X!`_$D?r>rL z!V3a|fFLkC1pGSaBDxy$p?o~v`3&>*Q3q`%^Cf(F)qj6=yxfk{ui5)@|AhnrK|l}? z1Ox#=KoAfF1OY*yBM7Kd$}?~;8Drhrkok5(DW+NTbp~CWO zhcbqM5*}udtr*K5Dg-G8J7V8_a1WKC1RD4#nCidrJC{E86n*vwty>2V89>QW?rxgx zM+xwHP*bYWy{9p0GrdbIut+Z}KDQP9SW5f*v`Xod7n1MEw8a4jA4<#;clCxB?8GCF`}&-$*y1g+2$ina+Be1h#^xCs{4msVjPnS>5g>x)wm zwEzFT4Noe1#q*i(B5CEa)>}jha|<0en0`xf-)Lyi|1Cy^Xd^zPT>^Xxou->CDo8s{ z0l+wpmk1+RC!7rU4~vB7ww>P0+Y^VY(Coqo68l17$yr3qD=d5p8Ew)(`sBwxiG*GO zVIGL}-Jy47^u8zKly2X;WmoM{@+$7%i)i=pUX~@5+uu$)iPvcV(H_z70F~7>K&gqYxhaU_L(4k=(%=QcN%2O@@F7w=I38Si2uD~L z3neUa-`$KJqMd{iv<^MTxR&I@3CRuw4`&Z8BXB-c@$!%U#{Ym5>)yMqc^40t`3i`I zoS#F3tpZN$2)#SPYt43t!PR&wP!F}FPjqx$5l=+Yo2*yRF(uKx$}&WMekW&QTdL$v zTPFPLHX5u4lsFJmLU$@IafQ@eGFeTmtR_NqXfz!0U(q+d;QL-p^o9S*S$6NJk@7Mf zeKocTbRoIU7txzh${XrrO``&wm@p=Hnf|pqupIE(eFyrEZ6nSRMSB<|T+wizT%|a< zaKOgNIy=Q02f`TXT^;Ykf+5S?-UAA}|BCgJcE0I#Zp@P6W2|wYb@(pn3yJf^1}NP? zi0}GGFZ~MatNsOBbd}<*4MU6)dW|W36ELpZ^%`JaH;^m5$k3gaa0;y8#E)PBV4>Em z#DHMKl4;71Q!%9IPp#X4*JksMweE zDtuF3?=I6*KlBIxiRfA1ZgpKeY!Y2iYdZH(1jy9=0%N@iyi;*oQoqC*Wq3ENjC;&E0t( zO5ULy@>pQ|wtIO4TMSgTaDOc{t z3^d9Z_O)bUYmrA+)_2wVVgNKu(!ckgZ~1xZ@OvV_gN+#uJDY%h)zHnC?)EiyFB-G= z0$qC+U5K!X)3w!P^V&Wb(7t^a>3AHozmmfOD>OA?z{zd_f^a~RN)Ta z#7ht49Ose%62PHY3}gJSfQ4#}G>ijZw>&6s#BX>Da%@6*lL@g|;9HnFgP(u})6OL7_(pbH%mGR`L}Bas~uwu(U#q5WgBJ*8D~wCxzHHdOo*tQn03| z`Pjw^t)&7B%IJfi{C3>qx)*!&b3z4b^XsqiL!CE)Di5UbEiT>nZm@T5_KoQK&3U;JiYd=i^wUy%hx+umS?m} z-=KIlvx+r_x$v}i_1a`~LVGO388RwYltLEpeS#)hc0&K>iNd5}{lq)*Hk97=@ z2f3Uy+EGfmnr{=07p&E6-u~R*#9g=F%bm_ip-;7+XuXdKk&ox8rZS(#(Ls>!pD(R& z#KBz$_||t+SUP`fUaD+i$K6El-gT<8d^APpMoz@Saz4y~IXLYU=F_n} zYB7^1Z$(>|V((H3!1ETNHAVdKL`S?UFDf`K{B{L@xmI?m^M?H|ecc22Ou!9a?_TM< zb0J7Qe^cWB4$q%FDe(X<%Gxq;paLgXZ9V$+N3n&58$K7te~rpXd#0hRHgWIY`NAiN ze*YI53_B(&I$z{%nAjW^eG&)7Lx&*=`E7v6;T{c1Yr1@Q`Jr!I4{Y*1IMs^95lnc@SM-vJsN zvq4GVgb!fw8fNezqCi^grwZAn|M&YokLdZYDFj_(911xW8rcuPQWLNZzs4ZGeumy5 zZ`~Ci0~^itCaQS$FD4J*vovc>hTV`g%+Cc+-0Z3AM3?r0G)=&FhAlU|TP--r^@*|*q3rt zD(i(a%zXnJC&$N_9TRB6%Lgk5Eu2fMX6rrwa+m085Yjtzr_@2Jwj&<>C{XxW8H&Jb zTUYkzX0GR*NaYqhk8_RkC~IqyOKp75JB#aszSiRl{>_7L!Dr_lwv`Sa7!yaHt53&b zEr6NMZNq|P{2C-ZD5^>L9a1yt2JwaUNZ~WYo&DZi(Io@U&+kH5VL}V$t2Eq~ZQCu{ zHNK6C#iMi?r{fv8=W-L>^HbdS)R$gvtVLzT$xR?r-kQsbO|HprC=6haDV|%fXFxpn zRl~`1_g~mu!uKrjzNo|GuSSfm=kxAZ@bD!FR2c&P;!$p4HRVSM+1~qVt`y{@EC~5( zjWwE0N$jlB6bex=tN=(m7ZZuO0OXi+X8MUtL(^DdfGZ zYG1VoYau_xckR9W8JxXl>(cMMaB85VI+qM;>Za`$J5^JCmxe&~tI|%_OeK3A)S%&0 z0Y#Mt1XVR^g+;-5lV$<$OIvAqEB%>{f4;?@quTaxE$nA_?kZFg<+VDdkE+U=Z&8wX&xYHW{mCIb)iHzkOGDi+I zWh<7)U*VmmMtHD*ea3#b2t@T${r5&po4_C2=|{S1E~`s`2$#$c}s%m!6+lT-#IjriGikMkE?&J3BLCn4{q zEDwmC^MO?pTk&i%@Uj-e_JM~3{-1%r6QLKXyc#OX$qaUVP!cR4i|OZ8!gD(3U)Kwzp&6uJO^@Evg#j9fGoA zajADZ>b)krz-94SGd#tV-#85=9cY!k$W?HnP!H48E!Wnj*a+=F0Wt%V7?Obg)|-Fo z9YlZkI|9-9WX;sw9=Zu?TJH8Q_qXtQX}r2l=-tSxQWFB>_FIiMbaQ{eE?Dxc#o7}+|=gQ>01~M(vS&zo0#gk(<57_8& zU|+HalnO7}y#26G^l0VF7%cB1m3M2Kv)9eyP}+idXmWhMPnUuD(eVSF^$6pPM%~8b zpw#4B_uPY%=F$DL09o_>#2NK$@UeBxfHpN(!~DM0)%%H-@Hx?rQ>|Z<_NH~qV|*m- znSrv^cfitJY5weIZ?c%rA^a(X~S#P-foT=NL#Pn^;r4caJmSnmgY-&$<?Q0s>{IF(O95^Xu47h6vfxu0vYv#%0TE`SIBi>Twx0fmag7^C+c@@R4k-Y zN1$;ytWmqh#~854GX5Ua%9;HxRAqvB6lPmCHW3I-y}2|!!Up~fJfm0_JyQiYlT&3dBt$~y0>5YN}@Z~a~X&Ywx_Dr0o_pO*^o4&0y%jVo({j6WwwrFkc$`7py|x1?6=^UM7&)J4`|SBw0Hy zyWjB9=Ma4Zep|8AWQJuw&O$rPAG%-;kFXp=eQTCJe3thuV?ZD#X99uYXBM;u_s{X_ zE)7ZEjI}7}mcEzrlB=8Q=5=RSyITiezf1Isch*C7uReUQ(9$2%B0r|MzB??!*(4uK zwmy#a{9hK*DH$`R-;CTc+CF}y#<}T+QrpXD+prdLm^Bbaps--|$G?9Wzaet}R%yCi zvJ-G-0^8Y|>e+_Nqs=F(3*JvELok>8PcA5*(*yk(5KNShp2&JEV|}B4Hh!OItlo-| zARq_`0)l`bAP5Koi;ckXHjA_GTcQ&!&u*PPt`boY5CqN-0vK|l zT7EowC(*;x{jvX~k{sQRaVB}uYQGrWTz)5i4(Z*CkxVOAV=6{WV@0FJWXyJsX?Cf1 z>HYXh?%=luju}_n1pz@o5a>Pv9a|a|DOu0EKkK9if`A|(2nYg#fFK|U2m*qDARq_` z0)l`bAP5Kof`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|(2nYh>BVf|>fG9O) zd>6441UiR+PLe*pd#-ioGM9t}0YN|z5CjAPK|l}?1Ox#=KoAfF1OY)n5D)|e0YN|z z5CjAPL126Y1|C+#0#os?)+(x#s2KcRuAb6Kv@30#D+DmdCMV@w22P?;k(!y?#Fn{EFArR&m2&nOVdxYy}Z%pIyLY|(LCOx9@ge{U0 zM#I$za6C%-$4lUNt)E%%p+6Dhl>FN*XO7lRu}4F%kI$tYtoL92&?)A3+@^I)05ze! z#T?>tDF9YX#vZ3Q*tz}I8~yJm`r~&^;eRe%hAt9QBCryz0Q;4Bgq|`ZaXW(u=wtWk zm@_o#Z(y}rT0M3iixR+$Oe9~EN7~KJAb$UoxW?X&`&?&`&@(f#Tca&F#AvJ07958u zwYRtU9=ebqa6AO;26^Z%d93)+WDAiV8PveyfBc2pf0O99?igu2#@RJGMt3ceX;asO zj=E2MA{>Pp5wKg7sR3^cNjElb!T$WlQnR)*((vAe#vJ0rwLLNyzLOlRSpzm< znC*z~wdgrSKCzHN@_J-XPWir~9oD7$`k3RloSpr7ZKzePz6jMg?)BtvbBiz%l7k>1 z2nYg#fFK|UoI?ao>aET6(5_^7d)w{56D>Z-wc*L4m9ArMd!%dqnxH!4+bJVk#=GV7 zcz^4pVXlmWwzcF`bEqUF6+u7{XhcBsjZqv1C^&nY)C2Y>C9rv&skKF&6m(O!(^IkB zSDYHX^X;fdc3+LOI3a_0=gk+1-h$WprC`}V5fHRaG?9D={Y1b%Lya7@eatHOe2ZD6 z{(kh)dx$=A(x=zl5m+dUYrReFcepzL{m@#kMpjRCNYFUWK>4oX$Wao5VF+LvHBy_r z(RiN1bGNF@6HJNC2;e>T;!$j~lJEO3-pEKsg1}G&f_Fkg?M_d5V9>T)Nl$M8q-8-s z5D)|e0YN|z5CjAPK|l}?1Ox#=KoAfF77KxBfQSY}3nl=9_?m+Irow`yHdZ=|H3K9Y zK|l~VD+r9W04%!@dYF2nYg#z;O`h(mLpK4g2e5T`I%;g%<<_ z0YPAP2>6wdBX)%kd*79u!#u;oj}??ACUChG-@S8^L%{Ge+SU^I;^N>LNHYyRi+-*p_oLOb-m8l=Xa0@Scyb z=6Ky4eJ+o-7@5Jr0S7r|rbAkpL5f47cT#m=*A@E^^yd6cvv`4}c+izD)0^xEx+k)p z$hgdiZXvp#XcdJJBQW|0$wpg@LNXbnl~FMkNk7#F?u0v_di!Rn?;HY+$ROc;XFr6D@xz2tNi}jaaspb9#&rb1^x! zhHY;`R6@SqRjqk((fzu7czsyJ;hu}FZSPl`W}4F|S-P=;?X?qaCyPtA2G-xETun6M4)>8h+&ttuO9OZ^SVv8IovVdu+e@3~qS7d z7}hRqX`x26)29BBOUsvr{Z4Ma`)hMwSh*=OE4f0{z_@+($XQha-VkG4(em!fO`>C2npZ5bde~oDOac?_bIV|FM z5l+iWpH{;`yGg&_=N)4pIs>d;=sqO6&k4>p$=OCjdP0JLARq_`0)l`bAP5KoAp$zA z%#qjq1pD)T_xI=ZH-&S=Z0yi2s3xno;3mT@e4p#wkZ$N{2~Wv2n9W4grvxczyyi^v zZ($xC7_q?@`JvfJ}upd@Oh#e<6?gL2@lOc57o9Q z=Q5ew8iPE$Kf>p@&I;y3Ix4C;A)sT5Cl4LWb5-*WR94d-yzUw7k zQ7H?niZraWTeNFJ|6}v~N0iz&(d0q%zpu3anWbIh(+Vtn)M{{V*iZ((HSNL8hi@f% z_cDvyt-Mo%MJ{U481LoE28*h})HO4;=bRnuXGz}NJ6GO)KxFW$kR5}Hm!27(g6?ib%0H-qK9mb(L&h?I%y5N-R z>HE_si5|gcbA<$f2@#mhmSi?jMx<`igAo>@o;3o>UOorb^Wh8Qtdo#zY6Un^}4rE%9mDFp#RKoAfF z1OY)n5D)|e0YRVx2&f=OMPV&aoFt0}LGbr1PU3U8VSht@&fN_^Ql5_SOoKV6gYd}0 zoXqbkhW!osdG|5=Q&>b{ZQd=n#YYx+6oI2>fm9M*0A=wUT~7h%$)VTX(o0=Np$C5EDuu0WVmVwlMQ*&0O(n#6FP z0V(gh244z&Rc=-I!lFu3`F`*J!Rdr|~jaBNKenH9F)k z0%l}KG|ec^@a3=|-RS25UT&py!4Y7Uignq>?r=u@Acz2GT&;dd}^_z)qE+G0LJOoe}| zEM_vuL0b+=#4*Uh%~j*1@O2gm1c%&!Q?nKt#ENvzCWR(Z5KT?%T3e{L>5+AMLalvY zyhm$CX!ni{ZlO=Ku6tN4)N)@v|C{N@I0=w>lCjoEFhO4;4BVk&ybkfoXwN{!EL%Lm zSRCPX$h}cGNe(I9V-3NVjwnLAU@p)FKEd|b=@5rh$C2VL-9!#6`5 zwn$;1lGpRocn;}F%s`A8mVp%cAA=Col2Pa$P<#c&Q7*YmnmHWo?A%3z$RdUar6uKx zo^kL2eeUy;lakRngTN+cd@tsLpx|(57me?5yMsTNpyNa0d7LO{tu=kiZMS`r=)d@| z^Td%f^`Pc+(#1()SoR??c;$o~I1VffYmliUjqJeL9B?qU6}F%qK7i~)%8X@@g939r zGFNErI!0Kl)m@5H9{T9v#E?oaGJXk?$Sz;I4o&_|><4zYHc3b6R+buA90D#27Dj`6 zsws`G63-Jn2|>db>Afn2#XhdCf_0o;AQvaT8pPq{#$JKYLzt!s&JrAAw3H(VExL*b zd(e~hO_0Bhp;+Vy-rTce6C$thLiKVEsBGI?z=AW#EDA^$n5{=wkR>3&(rptjCM_0( z9h)jrTrtQejrk;8Y0ht7+;X3=;IFQ5}xgqDMkP>~*KDaD1HZ<7dk?r7xMAJv; z&I<^I37&o!$+^TKPft4o2 zVJjqB#Nq2ER!dFqg9WY&cHFHEn;4ArE?wA%ZxZd}EM#}c2^!81)tv_qHc(>gWY6A> zV`7eoI!?7Q00ev*D?E!P-BPJCM`$wE22!kXyyD%TZVY66Q>h0NEY3KuZ9R(-;nkFB73xtEa~H9xQ42w z47;dfkyZvx>C2eQS$c?t8z3N8qv-)fslpoz%_tsjW?vueZKZb3Aw`_hWVT?6WH51P zD^>BAQMQk*kDbg6{bh|PfLFz|e~~^)`>;0b!b;8PUFAJwmcbYM4Q`cn``A?g57Gu| z6{q`rf$^R=U+D85{^oBZddyuzw<0*fdY`VkI0R1}P|{Ua!_lP&blYPutuy@D+7j5)eS__q^1D?*QZt7MmX z1@TRFU-Cd|UdzZt_$i6~{1R%L#P%+^839?sF2wHj5*|29M>r~+?y1`5`brXOE*%*x zD8?WGWxJyx#dWmsrHh$Slyo%`eewBGk2B)7f@KbcJKX4jwA* zxmt5sjI82XPC8$1Z-4WD_06~neGM6}X(}}f?ZLI8T64ke7nmBncr{{c&1_B@rO&e% z46mHJ(yX|@PruyAtPpx6M>eRyKk za}zzrrpfHt+p31#R_r=#z!zk*)3)`P$3n9Pw@mito=>gj?W1=0T7#q9IV1XlC zA$hw68*bnbF9go1V9YhmB4}V_n8V8+*oj$V3nzE%ERWjgA{=)blox&;u*l5_=IX>J zNDD>VUST69u9g?J!ss+ps9CwOi%9)nX|`l(Xzi`?UT9x0OW!}Xx!3=*ofi}RtA7h?#BkQkvoj3%VCSc@GT(~F$pz!KoTixVMF3_LAHwL?%?giw zaPLlRc%M`e(>24H4K&CC?R!%=fT;$t7Ez^Fxkc62Sv2^Dp=}my^YQP$cZ2BjmRMPh z6Po*+2Q5mC=R!Z`?bxC8zM6$hyj;$LGOS}J(grIZ(=H#-H9PB=ha47;GVXJ2^+>eS zS%os3vB5l3CH^W8ZP?rQgV$ob4IqL?s_;(M99kYG@MUT7LhD%5^B_c@-u@^I-jl$> z63!5#cda#SG+je8&Kf!JLT+q_a%<@9MIfF3HC(?*f*pcgEIe6IV;|H zq{j<5kW3Zf@q&zF^}<&i0FuA`fpKi7wK2_(s#!d#G{2RDS)(yU`*!wduv%}siw1Z{ zJOohh`#L2_IhPBec2+prdorl9gzs*!bADhpS>jv7R;JljJ41WVq;FlEGUqubH>|Ju z!PP$@`nzxW|Ji#NILof8PI%qZrz*EQ6>_WTNFq^p7nM#E5gG#qe0L=o(cxhmehaVseAdWLC>IjU8%8%dJ z-+%4LIs2S@&VAoo=T_G0uD#b@uf6vF?6c3~o_j9ac=A!u(wsE@gRC$(u|RVH3%h&q z?G;Dfj!(Hx;6l~f*$=oj5{)Q!=JDN#jp62?k6u+7GAv%9L?t>o$vq~=5*BGL$es&Y zj*GQKtE@rF?Top=#X6hC28A=t92}#`lRX1e=pf-ZE41$AiZ9hIafO#aqf$75#VM!F z>*RO8^BA_wcUcn@R_z-&L$x+&BC28Otz6^;3qD&=_@pQoS`KZ+%nJT2ytc&>1cOdl zZX(6HMm%?de9Q(+jNuOMMguo7F<5kHN%NKg7usIDiQ4e^3~hT6&qxUD+5KLwPotf> zN+pIRiVH|vS-2L*g^{IIy9`?^!+2XVCn0Em%Y8qM`>k(%1&dgtm;p?f9ZE503uc&{ zuTyY%MVjw{292NX240GVCs%@vVo&@6)ziGyQ#)BD z)^B@z1PiMs%m5U2szG>-?v%QAv0>qx z;RFi4TC?Nwf%BlcdX4!LTzJwxBWLA=+%x1Tu+C$ME~aL;JXbUz*Y3Zw;FLK}v~YXX z)@V(NY}d+0D`a6C`3V{u7?-}a?J8`phDceBD=izh%VK9>T$Q-Wm3Be(0vp;ER`B1B z{OlUhxqlLykIbuHo_U{Sdf5%9V`NX;6AZ$TPqVY_sD*`==ZGWUH-B_Mbcq+{m3ByD zhsS?sdmLKKtg!xR7ZfKtwS?|r&lKS1+zQ*lhdXeMIY@NhpR=vKTf>Ye6ByJXjuW{^ z9J4^Fm7A7!cN7@{wh6vmTO2$XIVOcDLp7AQ&c+r5R-Q?{Ree=(gPAD{>RpG{Y_8n1 zi7ToA%h3Ki?SKo*PTPIzx}WeYpFdm2rsgf`?v~@;53j=zl(urAS)M`K&KEap>`j}} zJpeayodKZB(d}F_(7PS3m37ei)jQuu^ka+cijVIs>5v`oToLh(m8IFjZs-!qEbNBs zxa$m^^^mCp?_xym4X3r`t$>(;BU7QXJ+jz<76l&K`ztoNG|hCURZ~9CbnGOWVzwOQRJjqVo#8qsu#1zEbP_8gs)sU`{cZ;9-=Fb75XM84T z6f?G9CMT7%Rcfa-**OZh`oTt_ronbFpN67VZe32ARk^w_aTR-^;I-KD-0oT|lob|> zwdJQmtZyz#r3Fx?Mk} zva4KE(u9d0+voguE#CP&oVPq8bd+hZA7y+{a-HwFxrKHH-rjy(R_W^_I((`vT%@5( z1CPRJW$9^M(IP~HpUwH`8v(){1Y{q~JS&;G^`t`G;0QUtlLv5BkW zu)g41a&*o7v4=|ajtcu{U!Ptd-x7+4&113OT<~A( zMQk7Qd1|pV=8F@ps0rS&)bgul1G>9QTOydxWvvPe_ymTaI0lLsJQj^gE2I#r_8yn2 zja#olZatK>0Y_8t#MPQ~t#_<3wN^o43I|I_{bYovJtoW&qx%OV$)+Uty~edUFtSH~#Pk$3*w&?>EZxq^WoTx40n znhIIws7p$P_zJSJ95)TQXI6RQv;T}<@r7ewAbQyISx~W4X59scB=KCPaW^yzL3O4K zZnk!=x*(fCLm{rci* z{&w}R@!inpzdE#Cov#k%1hNhcES0kk(UfmPs+}g3Dr2(9nJB2nsyln&e#D2!a;y!> z)R-_9+u)3~~I_Xt3-HVx5kCt<<12 zTv&SJM=yZiYm94YgE*FSifY60wlt2{aAwXA#`4?-8QP8(O_P7~+<90VSY%`}ZZeE} zoFl|?3Hmgh&_4;%2`1fj!Q85yG0O{XnW1Bn?ogQ|nC3S7mla?42ZgoF8hM9V1jl3+ zC3!JW*(zjRl9!rYAqNqpFtT5wv3=;^QeGL0`2{OqD_d723A8wVkCmIW)uR|>FfV=W zue_aTYc2Q`>OlgqgD!Y=w@d0tHv_WTaO91E8h9%}?JP{Yvw;REbrs6s%K~0|0_AeY zImcYec5y5Eo>(OJ7Pwl|k@VK|V_1TowdDHBK2){O=@esjXH)LA+CH|bvk0-rstwOF zJ5Br}sx{G~ZBk=V7Q+K^!&hC(THAKdBu2niS~=lIUi{4;Bl^APluc?r=TT+5%C;Sq zsZ>ov810Uy5kG386>nzO`AC>+=UZP65%qoV|M+`xw7sxCSV?2h?j67DS}u-|LBMe) zM2H!}no`L8z?CmFC6m1AgD6N;2xzs&mR&`SI9s6#F(U7~)Ft=eD?uxf2yDJOsiJ~5 z4FvqhWNeugrDi6dJ)?*3GG&+4mNm}3bk-R~yp4-tBF(YILu>VY_3Ne>c86Oko9&|| zV(Q%de2q}6vm8u*m!aFRD{T&DJ?5we>|}~&6T@xL9IF=Ey=T83&qDv|y}k&e z-LcPP2|)h-XCHVi(Ffn?Y`FAf$bDfVw1d;8>pqA>9ev!65B{@Z2lY&9H$1GAA=e4@ zT12uts4*<-XO&OHU;NJBIZX7n8@nTUNqnJDFgjog&8UIt&@X|=dXlWc%bru*HgPCa zMc$}C>#E&S{B0r(CH8o{&Rl5Ml^*#D|;C39HU14$l3~KTlM-V$i!H5 ziT@xxq0C#og7m=(VJ-p&n9UWGK!Y#M8T;j`3cV9)IIq@f;mv@;hUmg~E?DR~k%F$Vp>-m89!O6VR^l1GZ6?bK6ERRT?L2tCl9xJuK>d$I~2dZ6koseW*|vld5&qK%9fRXHU=?noR8R zXFq%Z?>K)7zQK|1wXa}T`%S8OsYX?A#TZ!c@p z+a%L|?#uU`OY}wm%zq~C&#c)K(n>qrxYU)3X$cu;bjsA?FBDdsD_A8T+Uu!${=mN9 zk*#M`_-of^HXDBG*I)kYL|?z?#D&t^)I>A|+pOUe=g&cOCY%+c40^&}D?AT7!H)4I z-$_M#*jsNwk}vFjzoJ498h=$(JC9=Hy}dp%jSVNn^Ba6XiK$!hSUVEg;kHyS-`e5gg^*IVn`dV3O-`nER9f%L zY=>b?W*qt^dUX5jEuw$-qnXMx&cc+%SzBjZ1*5ENtwJ+Z(T0tVPh0Ac%b+%0d0@O) z7Pl%r+4_XeG3#=60{F6J1^I8p10N%9?$g@e6cz3b%T4dk(Z;mb}n@z7_H6mCWhNn)EmS>3fOZ`86I%@XqTh zS#_M;r`0-h=FFFhYkjOO^Ywj{EvwqaEx@f0c8k1ZfCY4|)_H=8|Fe1LaeVIo$2B4A zPfGbqc{K#gd0miBkK}-37;2ChCX%U!;TUC#6M3anu~JJJ!k5!u_oEg z(6PqCeCXcl9q{sMjT=N0O~=pk`c5aRaVw4s$$SVNRw8aY-VKs@K7-HYInS0=@({H< zW^PaE&HjwrS>Z@_`_^}(Z$cb0pIt3E?b1$qBzPO3A_8Mwr9H#hX)$?SUzdq zWs-gWgH~!+wR~dLo>SEy3VMYYEWYmA#SalZ?LjW{?(!>N>6TfE#j{4&P;riV ze{@C|f}iIVo*7mj{xEA74qWj9q94cge>F`dyXvmSl1^xzKe09mT!;3f{#ZGS_uT%t zcjLDe&aR7BJJ0JJL@o#j0<%DXZ)#Rky{6iJNNIk&sB?4{>D6mE*RQ=pQJ-bKhC9^w z>uteSLUV}#pLxz3#X!$n?woI&zwm;9ARq`#3W0fF59dAqNo_}oBM1lrfJ*Pvg30re}%%B;E?Fr#@iGs7iq2nW&jkWRyOv1_dRe=%;Lp{}iQpvk^tVW5u1 z=>C9!={Lx}26X|3JnP#$d>guwHN6hbf?U>?0vt1FOzeA+%N_o@^76#u&0y@(g&-gZ zOay`HzN!E(D(C;ZV{I`-zz4a-SM>0$DaY9~d}GnxT&(PVCc=@ynMroTbu!58UFKKv zFHd)88ZK+G-kk{OogCJ-*<8Z=PH*4I9J=~8U6L6KbX9*7`$f0qYYwatT|LMuRF#Lw zMnC{p{VQ-A@{WP;NEJIAEl4qjwB`)~H6IDD@I05#L+4{-NtS|uARq_`0)l`bAP5Ko zf`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFK|U2m*qDARq_`0)l`b zAP5Kof`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFK|U2m*qDARq`# z4uRGjQat)OOkdt37H>e|1pz@|VhGIpdN}X-Pi#X~UHun*2m9mp&1p*V>6e~(0ysYOH7}tsV?CROYKdw ziS_(`gn2FAGkecer_(_at(o;#J7Q4?0#igFNl4)sitD0j)5H$@(@u1v@l{2%Bw@T) zs#F!$jTY(d>?%avMl+YBYZ{3)Gq;(8Asq?=y9NP1Pup2)Eq9iQmgQV=XE%fNE(iz$ zf`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5KojYh!icy{uv#g1Q1jh z)NM3#Nn#%oZDwvW2SYj(1Ox#=KoAfF1OY)n5D)|e0YN|z5CjAPK|l}?1a<&{@GHgh zRL3yQQ{ExhIDg><0YN|zm=pqGjhUx99{W7y9deEH7hVt$1O$P}ArP-J^TNlYpO>8D zJmdU@7X$T7T=RQ z@A*$^J4zfuKoAfF@-tkyvKbJIP7;wA3czEugIK*?KnpZ?gwI-Lt#!}G`t%6`BNze|q z>`+kK2)>9EDwgkVJ{t9;2D*~0AQa;+BnSusf`A|(2nYg#fFK|U2m*qDARq_`0)l`b zAP5Kof`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFK|U2m*qDARq_` z0)l`bAP5Kof`A|(2nYg#fFK|U2m-qif$%HE^Hj&%VV?31xyJbmF9-+%g21E@2y4td z)$!QpDesVLoWJmbfFK|UOb&r~m6;bl9{s%J9OoJ5FT5Zi2nYg#fFK|U2m*qDAdn*v z&Kl>b&a)?)r@TY1asI*!0)l`bFewDW8Z%FIJob6YJLDSYFT5Zi2nYg`Lm*yd=7o<( zKQB4QdB*t*F9-+%f`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFK|U z2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFN*xK%mpWLAF}U%S6kq2Bsz{2?BzEARq_` z0)oH}BA|D$@4BwjbZw1jEv?hvALQ*B57L;nA=;dEw=)_ghSor8w`p_tV%|W&B_%)LBJLDSY zFT5Zi2nYg`LLjU$^Hj%UpQpS-u5tdt3j%_GATT)u;#Fo|_;~d5l5?DAoWJmbfFK|U z2m*qDARq_`0)jw}Ksalhr#jD`XrA&8xyJbmF9-+%g21E@2y4td)$!QpDesVLoWJmb zfFK|UOb&r~m6;bl9{s%J9OoJ5FT5Zi2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|( z2nYg#fFK|U2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFK|U2m*qDARq_`0)l`bAP5Ko zf`A~fLkP4h`b~&bg?L9r_Z(g!I$V|Qj;7U+&ZmS++Yk*Ly3(*x*bvYpjhQ2W`7}A2 z)Z8+ry-76D)FwB`hDTDR{0818x9z)&=$@^T`~9?u18#3pz0|RH%$I#uXayqG%cSgr zc8$5JFr62X89vd0=XEKx*)&*Ni2sBH0YRX#2y_~oS#4si&N9(*t5!d!3e(`c+q8+b zyglmSpur=P)C2)RKoAfFb~6HL0|u9_t!bjQCZy5;G$aK<0YN|zm=pqG zjhUx99{W7y9deEH7hVt$1O$P}ArP-J^TNlYpO>8DJmdU@7X$<0YN|z5CjAPK|l}?1Ox#=KoAfF1OY)n5D)|e0YN|z5CjAPK|l}? z1Ox#=V22SXzk|8lo@sh3io3G~GeUxZARq_`0)l`bAP7tg0W)sk%}vuL+QgsGv=Im= zsL4vA@Eaod+ilco?0{O-SteR;H8w#>Ob{3ffzy@N7qmOKVm&ubDbu|YBoX#RKzD0X z7FEb=EW5={V#Cxahmxmhs)^Pn7jUTF=f)TqjYd^R@+*!mpGS1oqI%_MLmdBndihm%+(C4~-qHHM-*{D>evCZ$#ZoKs`V72rnC#tfDjQg;C#@@$!$JKoY-`8NkA++0ke+&QT zn$&z{uV_Vn_k4DnOrxuGZEX!DvqFMEvk)krdXAOba)-~&chC9xSYWX81hK8lrL!!U z*I^@aK|m0=KO-=)1vu@8qBqd}?CSL4j^xo3=UqW`0H4nZ2?Apx(0A638Gj7-lyFHz zX@fHyV{qbnzegaf=dI-y4nq7VBnSus^M`<%Y|0Z1r_^qI_8f2ze^$`f!yD*vH)guV z5yHLPvBQm z!fbnyc|Li(`z=nFU*6AR_IjZ35&Iv^?0X--$9`M!^2_^K?1+Aw2>*8}-F)*d9aw{h zb?K!IPHt{f3+odPpqsz=jH#5j?3eGm?PnoB=bVqfkLXX%;f$+to<$Dh_3JXPE1P)U za?x2&{|`j}a*?V_dd}q+H}L!%*F?`I`uMKBCTik5-|g3-pFZc_2JWe6f1-g&NlJ5! zz*XsX|!+hVqyY>;?hQHlOtEqkMm1)xGe(mLVd~}Ph|FtIN zG^tz|?j*c;Y*Ild5a$((fAF`4zULJa2-VCGY4d*Z;ZS;`!tW{`0$|NcZUS3zO*QZR zE{lu&<7bPD6Bu42L$t{>Ft1(weO$oZPMU}LzI`j02lwpC^A?4XB}a7Q7MDGH9(V=O zo;^r!*O9_Gi#=0p+OcY7Kkn)u*>!mHfb2^Qbn}L`wDiOcqT836m)V3eYTU}gZ=74h z;CAzGaO(+eyvc>Z&z=MHUHty@WWSjlT9b*ickinoOLXh*`_0zu3NK?O1K1>@B>awI z{NH8dUjk$dkE>z#T=sT2p}o6ro-@{t3h!W2LArzWzDw@HMbWdMYEkk=XWYUkl8SPqmMc5}SgPnL^A_Lbf+~LEqe+n5!y8{9UgqRgG+T zkD5SUynoLFanZ2Szzc`oc@Ly@_gWe^w#CI&q`zxECsJM8qFdrkY871}CM{S|$;v#> z^U6ug^ShvM__{JjFeRNgX2>m4f{A{k+Y4vd??k(@*=Ix0i0$A^><<_Y-BlLJdUCib z(pAENWXBSG1YKNPMh`YnkFzzxXV5C|v500aw_HzU$#$&fm5V?41fm-Xd*WCDXY5=7 zl(8u|h2zU>NaUm=W6REaK~3M`BH< zgKMGIh1M{QPk!v#uO<3a{Mp>-!G`I03but!r!BTc_{QzC(7_tUi08!8k%I=z3Xo`pSKLX3Qv1e z*++^fXji-EUk;P|-0|z>NR|~W#ND`ZqEKUQ1TT<9XkX*Emv*#MT-ifof7%0 zh2)8Ec_Go;`NN|5B|DdSKyxx@jvl>w-kH~RN+H7&a_ z@@eqdZ$c{=*zP<($H4Ygtm%4;Ejba_#VhZ_PI+i?BEgy%q=EB2;YW&g=d*LFiBo`c zN=RWQ?3%SDKO1+?`kN-={(uW^!2PZ3&TV3D!{(GPBRTZL#+ZeDYb7~Cbm=bmzP~?L zOvx~Aii@44u6woG=ktL3RvwOL=RUBr=}orxFgCn9qAGB%uF_6TmR~=dbykXbe%9lr z*3~QmXHz`yY+L1g)3^tuU%>ab9{zx)379z{*Jv+5SjOk#Xb`~UIcf5dwJOTKASommo7?1;}{FoASU z7x^hpjlnd<4_~_EO+;_mz3*?CCV2Pz*s6#?SS3SU)Xt(+N(fzsy=x!8*J3@iW|7Mj z`!G>#UM7>U#7FX-XOo}lykj@MFV`QK_U}Bx-5Df%mhrj&x9*a8UKpP)w3^dM7FSN< zRO`@cb5a^36O+H81B23tgwJ}LN3C0z?jyP&elE9pNsf?_U&tG|o>ObNnR$(XbL?{3 zHg@i$CC;VHx7z$n(Jp+Bt2|I?&jNu2D|#dM;jm># zYl$9Md82u@7)`i0i*_?l#~!e_dBbkGmm6=jjy+Y(uC`;|GT(!51z^W>s|L87bZBSdNXN} zZq!6K?K;fY9o&svTON?!b2rhC?uyT#<5_L&G}kJYHHBYVy!#78Pn_G&=E5&JSJ!9G zRLgf(ifxbUV|R(Xvzd(6d+)h>Db9l%Nm$EIHZrmClRDGDUxOZhR1J^N)On8Up%V>< zu0FlqE7HxE_tx)>c4>+5J;gWJW9ZIgFkY|qTZ1*1Ufx^3Gg@E{`rzE2xAaEs=B8qf z>xSERDdsZId(X*HwP9^y|C~3Lf6>d_r;fQiw%I8@UE2I4(QEuQaQ$HQ<~@7;Rda<2vA)6M)&{n_vQ#IV~*>;-`;1dJ74)yVtj zt-YJi;`4*5yyscwFmE4j;u!WNoA`ad+vfH+{=(U9TsQNsd7dHW!LGZ1E_ZNezjv?Q zJo`R}>=Dn+9U0Q4;pUe%JU{!T`1!>=UnO%+*7F>TX>e6DTGsO_RHiGtcxQjLV35I` znCH*tss@N>Fq=+uj(J$I7-q*`cby?)`KN!biTBU(d##)Kr0CASnK{RK=Gh1C+U#8M z=}!-`hSe(#%V+F#uDdRTc>3o8*RVR8=MBqj#B^kyj|kitZl6BqUhlo#(9hP-{`xV7 zC$55kMc}FfeBQ!z+?Gu%(j|lUTC6ql-u|dqwGSKb+HQ{;W14>ZD7g)P?Va;Ww4KlNVK>+e>{H^Wiqb~sI1~&9 z)<^AdlBQ1f)@^TlBGFIons-C-nxgO)Ak-RcBWY>n3An@mpLfsqLk~Kb8+l^xXF&VX zcdiq?{_I9hh>?;?^p@ha#iDLT3NdA;r62wL+B`o~RE9^fAU&VRFcY0M+GaC~)}gn) zljtG4>pev+iGd0%3bS$Pu6ipCLCTW42}5@(t|i-&GVcGbBegQfdE z@~TF_6gZ7TDs#T2{qPHk{_xGT#UjPU+!Oy=fj@6CO&rWCS8jhV-kI}Of6SR>iet{3 zUa8`?V!o8;TrZay>Mq%{2V*~c$rJ&Y;b_p6!C%XruQc@>{Ty>@ljs+k{}j#;TTUrl zhq^Z}fomQuCTp1Di@WRHP)GU9#gbNmn;i6N+)x)CTDWodz3VSE87^&;^G;|5mFrH~ zG7B@#JZd&#Ru^IKPN-Jk55(-wQiq9{K;rKC%vFSkqTSu`2%-SVu(X%AR5 zg;sP7A{3D>)_||qKso;G&U(A-Z7=$_Isd+Y0jgBR@I;3x$N?&spn{7N&F~`ptdoy_ zP5Ui|*qoOLNM7a#_Y@N|lL5WDY;U94ESG zcRV|X>FW=5sk`H1?=OY}Ym86^U@V*!-+I~){SMKa4!QnzG?hsXIX=s1+@SU(3I~~8 z^BW>zn%g?Niow>5`AKfvQDQAnN6-8Dx#>CZYP7LYsugvyfYPMsNk>19`?&ABWm545 ziDL#ant+X(K#XaGNRng)2l>XWd83Y1mmTdYlS_GW`vs_MIkdbhz<`4D&btDZyX-wh zsmA#t{wDN%OWii&4hE-uDLarZV{J*#8{D_SmH-EXar0H%JaP7zkJV*983bLd(aP2f zm!C^CowpLGUMV@{T&!uPI1X&b@#uY@dFHDyJAPrjCe6GO?+=|v-0D?dN0uk0!0KAwfBb;KUF+6^vl}V zOLDQpAzM$_e{h@VL%Zjh{~^a;WnMnhsj?YfrnAFXdbP%Ho1Ayl#+XiL!>2cbhju=0 z1l-6*=oDj=6GFu%#F^36Ys=3dI*sq2V^!zEkq*q<)%lUB9Uc_5W60&h4{03Vyf>du zi$41P3oyrTKOR(_aN{`$=B6Hejn-Xb8r-+bb#Q?q<&1Akuf%f+$&KFCOMRQx1 z=^KV8roq1wL1 zs~UJ4RgF|>q{16nEBdw@S6_(lK|d(6>(Osy)oeD5VIS>td#2%hXYmPS=$ZQ~(NS&# z`^Wv%x7>m6aD81#J)t{t+(%dB2@5J#h&i@1zqJf^FEcnQM}A|arsea;r#qjtczkh z)66RJEVA_$^_pUYF;Y(dt+E&Ij=C&;5ufsq}@}9FR_}C3Jp?&t04Vu!efA`2gBYM{r zSs!5R8e?L~-0`}Fl$A@{SFYhpU1&|RF+k+&ue^Fc(NiztZWR}kCOzqZ{o~oSN~waO zZxw|Fi`g~K-~Sk_b{Cvq?2%{5Tv9krsYI)a3(=lqs$M}fd=QnZQAt}zE{|I7IY0S# z*ARWB>y*VRd-TK+dXw(0p14-U5mQQ1<2OLq4)}UtY?AXjXM1sBo2Xt!y>u326#wu| zkH))`Pv7Hg59coVRIk|{xoH!*WUK0IC^^<6*MMoAiC?YynbonAZteq*Nh>R0EsDfalUPq?n zNe{VRRp@-KYCC=X9B%9E9?h|8go_`O+JWZtKj$I@bj0^yD}8f&6;?WP#bXZqJ<(&| z9&~*igPGK0AaHW^rWbk!OSh*BA-R$dy+OJ)^!Vy9u)#%Cla4*>i~=-~BmJ zrQ@6m!(9M1R{nY{Z#cJz499r#*S`B3iO!9Vp)B16G|5GhcajOxCF(XryJX)4LpC5( z8m*6q$Ir(tx_aC|3ITZYU3m7t{4vqb;(dRhXw9+hxh^zkzeOgxv4x$x33Tck4&ojE zk3D5`F-^#55;UAvqZkjHPHpc*zHzap@!d-9EJb%!@uX)!-yXCJn&2tP1S{*cIken7+2Pwa;{rb z)D>H7U6$l+yjSQR-+`@iO^}u)d7HTpo>{xuS$^rvxo5s~g6M5uVq_lt;NV|Z7vscM zxh9sze7!}zCibu9r@ck<_}_j{&JWKq=FaO&Xa3WVoqRvhw|$k{4}S3QvF<+}_l$)( zT^cZ_b1~1ih_3VV{QiUB@FN{>p2wJDoJQEyec6ISc-ST&AIJcHSX7 zo46E$fFK|UOdNrDm2v!~m%59OR_o^LF8f1+9-aKbXL8=X4XfL?w>(7RL5%L(R>|}6 z1f9ReD#mefd&LhuciZH?^){}zZr@x!h%fsW={vq7w6DGHvdaQbw0tJ#N8q9xH)DCH z4|oE72*2_7JvPdCQAbE*IxalV9q~L5Jgz^+!#oc(F1NMsf921JjvK5Q{!^Og6C2#V zeRiJn4c%Qx+e_O^`LJR>m-gqP5dDp7EzU6^&ccb)AH#2mJjSykaW_6wRqvb6 zg$wU(@w_xjIivz!ZFa} zC>aFu`C}%8vAO6~exeLuUHWoBG zg$68d$yQ3g!m!XD{E=B8S`EH<{DGdAQ2XVbty^2LHK{=`Six7L>LA1xouUIBwBQI* z92I1r6I-|J)?qxq1kgM7LEzN(OE@ir?}{PKn}ZvmAOE|b`k!0$f%hMvOeU%?ADfXo7HuwScV>)Z$hN;k}s6-O*X8~yHBJH3H;J}pSueD-NZ6Hio z+;JmBvyP5v?8OMPLAP}1O$z{NV?EtxKC+?S1%yv%q9gihym(AKWi>I|2z~lZ=0FDz z>n_oH@TFvdPQJ;UQ2LguHrvNL>ASB$7I&k|HvAR-wOa;#@Rn4lwush&kxL$1Gr5y( zPA%b4TgD2sg+KVVV4o%izIS%8gQ<3led*ZGf7{O(`lW+lF94~C-P7E*`F<cC=WehFkOU6iyqQcvBu8GU}d|v;*-$uPGexgV-Exi12OjHs7tG~zEFS+ z7e4>Um!(BA*k2SxxW+t%8%NhJw$$pWgXzNQ{g}XY_y_T^o@O)cHRqN8}f?C?~=dv1{x_sf(f?F28< zfQh1xLn9?+&_DZvfVrZ_Sf-txpPc%`KYapzYyK6i%Hu3CUg$u#SdQ@c&pnyW631aR zG>SL}N}VR;03|Hi$BDzFgtBfI%8#BSO*1e^j_b%Z4~6_q9p;kF^mH#J<{cFgNULDYfz2U$^|5HxYgK z1}Ef_&lc2SV+H9JSBW~ULk`MrxD({!q~^4X!)Bm1@oHnhb!cIWp>>q!f6VOH9mAtZ z=rlGD#%Lq5#{X}(RS0Rrv`8;tlG6rHh>k&02nE;=l6|rBDc;s6 zmvskX5GLBn_1rUP8UIeU=#(KlrC9_@%y+%(f4z|C4}Q+I54yt|`gsMc_jk;JmR*`m zf*h>L9$HRM9^}>X6}-894g~%o#QBr=#SV?V5IwAOc8*%fG96h!(x*09&_2zDRlzsq zt$;C-;-Q>kP2wh$u_ir>gdIRBozFploTAnOOSnmBfsWt=q_wsUHI@f1K!+79^by!4 zslpb+d{^7viCb`0be!u>x(7Rx!XE;xae6i?TA(WwG-QZ0Ds2^zvc(m)PAS!vVVQdV z|M!tgh+g!TAX)KDN>8$2?V)@i z1s!t|PLWC3624}^^ID(uvVPUMbWGDp1-~Ua;gZE%Z!c;}6*QQ_t4C0!snzYZ%g(af z*y(ELn7(3(HvqO4^uQf!?-34WQ)}^=0rN{oQLsfqEnZBKGBk9Hh8h1x<_0uYd_b|4 zr34llXfIu#8s2J0+!VXxm0v!NP>*s(ZtNWRD91_FTX?aBeNM=TjxQh%EU?3|!sme0 z62_GGS535qm4nwQ{_lx>^@4d^drz8R%fti?Ef~Ziy72%#4%sWPOxl*cilnW#+xKGX z86I~#Szf1O*hLHnJGpIv!UovhXy1PPFdyWw*YoiNHK=`ZJ4H5aT5rR5y=9Mqkn7}x zHZ}!?2zu`lkhH#v18`_fhxK+!v}&!7w()U3;h2k18p?H8@Yd2PJ#-0tC()g~uz>ni z@BOWJ6MgV`9A~eyHq3L(M7NfZ4n_mgSPwY|biy(BA`bR`2pq9Jk+KcuF&k2q(2=&n z*rADi*W5~i-VAc#9mZL(Gq#ydc;ChPg8U6LJqdXww7T&a-m(W3XI@hF}4iH#H$rvRXhl3N`LFWji*sgvW z!Ix-luVM|*wiR4qk^7>xc((Ngx2d5a{h9Zi|1(72{uFj&vT+s>0{jw^gbkCAg9;X) zD_suED*ORBl-Bo31T|oZ=jcz86_Rx`oQ+?}oz7N;=MFIF5DR zjfLsXeRc;|HvJV!tcT{^t7X&P=4+u1^KMSswB14t8}n{-auNq#o<}Y0p9X1J2MsNy z@4jGTk@lYtSz>7KL5S?^gb^+Z4B%FD2c50=Ue5w1_BGEih^k=m0P37i`wTYL-jj%* zeA5rS@%xB=;ma^W^4eBdF*+Q_Ai*|D_~Xy!aFXFwh_lFXXd9ZnXu3Vbq6c5o-l9_p zU-Gz-I$tdM&NsbaV;iT;yk_xzL}acJo+(AdWrgMi8!ZL7?Gk3a2xffFyhlF;)-Sj% zdH14UwOWU0xy?~pkHbj|&g5Qjv3jbFh<$gj=IPqPbq4xB(COSx?K=}%znI#4v75A) z_GDf1{79D!+83ZBoQnsLAi*G(Oe-Z)XwVjGu#Y6%u!PlD5qynnYFE(%&V2O$!SA-< zy2w&Xqk`2c$H9FD!);P)E)Ft8P#0&*E)b{F)oku-tN~->=%1hU^Vp`}u|->G+o(}!ZEd35oWM%U#acx9ThtHRGT6p@>}CZQQHw#;ksxL*Mks9Jz5-4Tj&7$2rZ|e@aRy%&Zn1zD{SJM3 z`Ndx&`j(H8fk^RxSabJXPLO#rT(ga}vvZa?P?j$r7xT8|jV-f+4GjBsL+yiAXfp4J zan^t!Lm{z)iA*Zl?tUXP9*B>#^GwH zq{{oLvF|7-bPhp{nU3VfZayyvTf1*ZY=0lM)h4cJaBwrcfN30nkZ`sm8)QOI;m^vj z@Nt8I!2yOv(eSb!Pk9a&nk`_18vh-^?Ks4S4&yk1Wdi*pX@esfc!fWvC+y)M3O4~^ zZjZSHd+_x0H~;S&@J!Jg*ot#t8R$Mf=x_+MH@P$hx^B`W$Rq>{T2z4-qS{nd%w(1DS+tGHsEDhn^ubvi!a zg2M1@!xt`il_s|GJj|45wVeRm0CHRm1~k@S{YP$J$7#@;xZ(O_d)}X_D2wCchi+8fLlAYj9|@A& zLOD@6YA_t6#__=9c1vx0d&mi#yxrO0CQgGuxEXz7*w7M(>{SwqdD2shWv zN}Z3_%A$>Bf>9xQ5Zd~G{M~2XOmy?>xlwNwT%1MJLr@Itn>j>`@7JzREUtAoj@1+u(#ua$eLi2uw_hl?j=51$A6n4W~Evo zmD)wz+hG?q_>VJx2*5!N)=>K(w=@Kt%^N=6ejI*l{m3U0#C+IkuK(4OtCc>gFwi~wPJ6S&J0zl{`IAwTA`h(w0 z^ooCuVr$Fu0GRTQaTAz#u8=a+u!(bk#8H~I^4W!>rHjD_5l9FhraG>%=6iTJ;)hhW3ggCqZ2x7w-B8TKDxnR$AWol_37Wv<}O=;IEC1ky=NWCr>Tc=KI+Az)~TB7WV~4TSJ`K zT8nHtuo!75tIZ0NjS?b6pp$ke3g8-h0j47hw&jr^HcGqba*aDFX$QC9z&-TnD-J>N zA}dy!E9YS0MN7K`6mw)C00&yfAS@}1E&EtUoSif5_|Jb(vYRDqVx@^@+mo1extld{ zg+irW2q)-Ux>Vp3k=u))$#+!N`m7_vN_IfAO5eW1qeo9H<5Hs4*RZh$Zl;Fxd~40N zJ=}f~b0!*9zCe150>rk#W=u{~+-~_if|?ERr`fn=OE6f11M5v71X=SAU7cdba=$mH zAzjN<2xRY?aL|~vZFp&mcTTp1&?yiCjli=U2{=M+b77%1v0!Lij-zFVWi^_$R_~ZT zrN(ZGkNdH7XNhRNRz3v73Ns$@nQ{4A#uX~!r^kjB>c?++DL&8MK4E*(hATU8+a9mb zweF@?V-?ux`dGyN;b?8sPTD86z3Rb-{jpKZEBg@}C6KX?!QU~mJNiMeAl86*78qXR zY-AJ)0?-;4Ev>k!BNHnaYlFv)?8yu?Km9x3csv4%g9b`-WUT0YW&NEE!iZ`N0k*VYUW|G8KmuH4$#kpwl%+0fu$fpR|_ z7K0`i1_{?DZe*>lp+tgW97X%?Zr_C?e^DGoE%p#88p7hK9=DnJQj-6-utjxolW{AP zWDHyL=yHJ{lHxi@U2v}jZEv<;*yH~ToSv_R?QI6$lUn>7%$^Vdb^4kMu73y7 z-{ZQ7omda}Id7(Ad;ZNMff5&wPHI&svYx$wwc*c-f&m^Yv6?P0td$GuEPSM)D%*>J zi=x)m_Gx-{=cq1U;KGD~Gey(S35umlrYQ3*cSWB2gVU_y@E%~-EerV=br7}Y1|F@s zGE*6%Ph9@^{X}2=7pvkTySe644PKd^aIa0d7QUC?F<|keLhFbVp*(_5Xrj~^Z%47v zN-_bPWDRdUc$LCb2lJ{hSq8zVSi`rEg^jO@USqT#ch-wvh|4v1eqM}|Xxr|aPtgml z1t-y7;hVmdRYC0p4yzhdm@u%_q=T3l-j%D#2PnotudzJMwjE1#F_0=WiyHN+V9>3!UdsCt<(wDkOa%sK)!HVL(&wN0fcU?~O%QjUu$(Vxu_zi^+rYlT-MCwwF zEWm>~ImLXx<7e(QY0eY_uC%vskL#|(kyJ(e80<9gtVt*FGtbT=G%RHk6D@^5Zg=Oz z8kT38jIjzhg?PN@WV}`Smc6_!YOESvu6QQ$)kN2)$A5+BWOhh^FQlMsm2^!j&);^;+#KV4kK0BTCvRzI<*>;bL0DghTz%cOuX;Ip43;65@{GH0l4F|N`Aa(g zkyG%C>cra?HSAEmyAzhCYASjQi>uaq!6Nf^RM! zl+!hanpjgtg^hE0&apg@vKDTJtJ20iVU3hG<&g&7igdx(TXFRtPe0@@@Elk6iGgNe zOQB#woKim=2RmFV>LIhx?9x&wH2y#>g(4@PgSA&q+`~8b>&0;%Od5X%e;(QFcm)A3 zDxgH!%C{`<3!6lRJlJTG^yMyaKHMy?zJ=zmtu=5UUjb=VKY>j4=O`gPXIk{1fi|#HNgxP8MU7DT{q$jT|fEl zRuZoHxe;4s<^`s|MZw%P{KPKJh6=+0MF`}+yU7PETo)_*jXpS|qn14fY$+egb*+y0 zrmfcE2J=;kDQo02w|u#97G){7t2A%^%S%>?K5pL=eQV}~m9G`73+G;T_GTK&$zK2> zW&T*7iOb@VCtFVqo)TxUtX*707I-Eu*3|JFWBCpgh-uH%IfTId_NE$6ENBQxj1T@PoV1AR4t`y>xy;52G5HUYPq7oY2Ui& zU;q4i{ATM@3(7tX^w2+zJ~1Y)4#Va;A-iIf`e04CAy&kkHNhjqDLTi}n2#q*k$3(I zRcvqhzgCwm;u}OiTI^!%mL5C85CKxd#+_q;G@#w4$Jy^SD^mD?IgkQ#JT$s$*4C4% zS9wj11r`La37hpBpRFGK`K)FOJobPk7hf3zr^u3VRbFO-j0w6}P%#3H%ZFeZ>fih5)?uO_dWLOl zmlMG%|HyW;B8)4I>xh`-8kqT1OiAKSclCgDOXwO<-!&}$V!$0{y z-%s@GKf;Z;Gle!xm*O~XizqiFDE$^<*IH7UCg&j1nK)vCa5a+kWfii914>K@#kIY& z!Zk*qm93S#*|K6AC=ys&Q##1s*0!WkS_2(zLSZ*%;?}R>eVenR>)Xxgz zyg20+54}LzwxCm{ATKxKhb787*RHoHYd-$@AO0fIKi!hYL0%b^tuqDHYwWN9TrZ0} z&bXXrlmXeIU6gM;&L6U(bH&IT`+t?Y0E;c4x#S}3q2+CmvO!MTvc?Il&ht*9qn3$y zt8JC-gGGlfeATaf94VbqG4?{q3 z5p74jV*@Z7758>z#iTC1Smm&aEw%!$}$&$mQ7WR`Qx?Q!yUf=pLj9-?HF&&kajZYG$;8 zvOpP(8wGLHa2Ba%QD$xRam(IKwfmA)xq`oqYe^%Oz*GBzpWk>HzQgq&yfW8VL5oXc z*-+@r7ZT>Jjn!rv!?!J0gGW?53sbbNXjzdnvuyvuehW9+_8~774b}z3@JmCo(fQ76 zaIykdWMkr{ak64r=(MPcTHI@(ul`kvcVzs{Z-zEziB+pekh24FNI%~axesUO#xPi( zxo3aQ*bWi>i0h+`Z_^cW$U9g4qh%H*<0irZ7Q|> zAlFR*j<500680x;99t}Pv6;2%D_vIF8pg2XB z9cdZk-SGvnX5y8_6A&06=j| z#cB9olg((ves2h~!yFl+C z-8VgZ+xOG*OBULPjUuB?we2@Qc#45B(G;`n28RN$-I&`xOjKGnDq7Yz669=6wA=t) z0yE7c8M<;g(k?{I;Ov==BDaICT^J1xO&)l)Q4%IlW=EM_H zSqqa3J*T)!?CI-Hoj*cBVJT7G|z*sUU0YyRPG=r8N zs{tdtFt-q^<*n2Rt7JsNrEq>#oC;oT<%B&sauI@3OqG5f@RIB(KyV|KNd@udu z=YJln`de7k*2-z((!>qVvnS+8-p1&*z<7I+?xh@F_iDpFd_iHKqT7pxI>I7SN|nA5 zsg;48|B9s1?9f_*s(PEWaR9C*Q>&>`T;Be-PZK=~*P__9Ok`2rvo(m#B9DyqfY(o) zdQBE%7{+Ma%`)s^-`>9$lN(2PTBk&7p9?XVIhmX-aO;Iuq0s{m*x7Hkn}UOHVBd;4 z9{Q>EYrl@@Yxf2P>R@F*Jmmbls7e+Y<;zYOainCnkAKN}ux7fULh1&W2J7g$b2M2o zX$ttmkPI0cO)VCK+H01gsMOjhwd1C-4IPUD@3&NOi+}cMAHZkOFYNjrwAf|0W z^H2Zu2R}jd+z;6ZDw`14F_|>}N^w|h$@p6PI;!lnI*l$&B=l@uxNggVBzVt*rR%Oc zbLQML%#tmg^x88EPKNKfv|86*3t&sclJM7RJv#CYhED4|U0Kw)7AG6zq5iOy1x?VO zIrll+U%iUx61$$Ci>z4_v@sXrgbbZcZpr%K>uS0*_X!-)nJ=*&EtF$-N6LKyS5@lMo#TWuz3d{qKAL#<-y(zZtZ8?aRG4G}`=RWnzUwsbIuRfP`=MrN+0lKt4#+ff! z9ah}Q(&d-$dFr|6a?ER^F@TR+U-?SEJ|7)f_p|M22^Spnc zF)hwabX0jV=bjrdk5L96^*8HzUWfU!zWNsIanIW3>@m;tK}?C8H0EKw`P}Eu+|2m$ zs(mq5hfvBRnNQNdVD9>Vor48x)DOwxvbSG-ucct z&FFH*{8GD)@H`Kz`b%C?jd|VPRws97aJ{ozsa2OT$2>nu^voK}?d4Tvtnl*PN@X8m z{mA+__E6`TyLs-`@oTTG#=LeBtv$2RJ^JpaDr0`-^Zt69=#Oyy&ot3_?m||Slf~Sv zG%tCXu|2uj%-w-XFofi+h+>r=lN>AT(h2Edbx|%U8-(Tm&9QniG4=7><_b~CT-fq0%fs>|%=F)$DF zJoJ&*E7?--`u)obKl>Z_!EHa!b34a{d0v*s?YjKKJdbT1@8)^8d>jepxuG z$GJ>4yJs}dLrPg~=Q-`a@UzI|-@Y#smza5&=lr1Ir+?(Pw?pcmJjc*)+s3DVg!!0U z>yz2534`ul%Y3>^9`qyC+eNSNK;-9-KN;T-J#^A(&v9KBO{Fy|0-b6{cXZ2MGh1!c zbg3b_Dm{JtsLeC&T-7o3D$8G$K8c_V1Pom3sxCB~{7DCbX;92rR?w)`ECNHq$}Lu(&i4R9Q-BM$Xy5-%z!$`7}Ty*c+zQ=5Wtvp+SAZd;qIE0gbiu}QOsC3 zX&aQ*z^PQti2nBvtGq-u4g$4juj2$2-`)uH_{^lY`!eUmk%PtF7 z{EvV9toj_LAAtP`JR`bGG2c`3k>oH4P2P6?F%K&dW8?UnFE?ar?vn?b(e4{}_ccnK zCECDM3!ayOoZw%7gz#oRPhAyY;>!Pl8KTB@=0 z=vVLl&^=r9Gj|pepW{YyjK~~K{Rng;NAk1!U8{zE|HA&+!Mehqq$@1zezMOllL33$_ZyGJvvZd=@}B2_L+CPF zJip~-X_u}Ef_>?^k0g5C9G@!|QRGQ)_K|rQZsvmJDc?9+xa4V1z%xbjytWiEHE8N< zQeIp@27is4?B{NL;ekXyuzN6Pq|qP1GFTII+)kj=VMq^6gEtiu3I*o zb;;k9+M#*MVjiA_4$?WQ3s<4WA2#v&xokDhe&B!ym0?)ANX_K&$ZhCC{8&3WfBWnH z{Gsu;n?{ecW1c4KnUO;aKUd4IbM^8r&{(eU7ZKYi*Y=fbOs9On)@3)~`$Ubr=Q+@b zP0`9uZ=DG>DaJEv7mdehjT7>|W59g%_Hnx3d0*hFY!=3Fg@q+Gs3}p3t3K4du&5f3 zI(dzGjreD_o^%P(f1UI57M{xmYPpp=Q3YwfoEOD2Znf^-TqpYFImbK#ZNu{|)cluM zmOqLTr#j*HsH`k6(!lD#j9vR2;yBBn*~D+6@85oW(Xh6wpCKwJ4t&NF8>tKr}pk-4&(RDQzil#Kqnd^H_@}n%aRgVClw1%#|`j0ZkxC^6+u3d-@$B<5qME_vO85ca3oLB)|G{)2D&v4<0V z;z5yU{@5^J{9*{d3fg@Fy&a7sGl*oKozNQCqld0O54`hvcwX_kZ|qXckw8beZi8u9PY&(*tySOD10LQoG)sP(+lGrNQR~+q`E7XK z{~IoxQv4Z&?Wk<-@nU+?PDSRF?YzzSIo7s!xZvZ#zAyaMuM_?LEjygbs z|KNh9w(`u7Ro4PFVw||!?|kzI|BUE+9uUjsp4W_2Hv5aP69{J zAG>$W5p2QC*ra`g^okQWe%tvlcFdg#pd(bm?{@o4{It)0*DoZ>9tea0G-)c^xgai_L)mFS_{FFq`0ttFOHp$DUzaD*J4dPz{-l8NhxJn*qYG z$v#?7aO($ub4xWx{q2bjNKY)13v~SW+UA5q?r6BtSBDv%sO}3XAv^cB zoob6Yle)7QURc8UO!cuUTY513jISMQY!UNC-=Zc2^HN*c;=FNgChIllGLdCWWTW|1())t1qbz#<^o18ini}UG78~0JPS&7@ zm5&=)uvbKpCXzOSwUa8&MAc5{*lK$GLmt9EwY}$H)Pt(wBXQq7Ew-I5uX=^|XAPqs zL*v-GvY*%@=8J1lq~V3(`WHX`xkN9DF^6=H$>Q7cSJo9DM(*Iy!lvK57e6dR=i?dl zT}G?T9nT`&gy}xV-{H~)Y!lkzc6j7}*h9Q#=WZG(jPCaHlAuw(eQ1;43H|UN^vzPG zOYP9qRHq3RJ5wX8)2?TQ%CF{5P%K%UQxC)3Xk1QZ0d9Q9>v7%xh;PXRbIyeGrzE_= zWn$wQXtLM$7P+r(esG;=3D5ltO%j2y?M+qC?9!l0*?gJuDdy8CtmR(OR>pB9IZk(# zH}O@mXAtr<`*(<#yR~T5U#7 zNDvSN1c6B-Fs(IfnsH+crrFQ5V#oOlF9-+%g23bu2&)!H%z0z^GiQqD;YFL+o_W_E z&8EL^=#4+N-rUUZ<>oo}${~-R#|hjpV|2as9%FwS_OGLbi|aHyEPo2o3wAh#X?1_* z%(Nm)+&Tngp4TBWJ^401cWfl#vpFF_V0;9O4RL(@KvRg2E^R)MXswZ-kB>jx#y-zr z8u}Q>_>fD4=^&t@urZ&DV`{a-hz~Jnn!7;%6)@rsPnmV z;k_+>^wB5?Dex}%{|jDRuW#p=258;-EALBGNG)X#5y7tw2e%ZBpBg^0uC z^Eb9pD7Yu?A&k%|`Q+!qZ*{!aO#S2c)7)JLzelu+e34RW7zut?ho@CXt&$4feeOC3g5D@cUcz z);nMYQus6L{2Z|XN6FR}N|<(11;%x6*2Y&WuS8wDl2scL&HriJybs?k=kS~n;x$MwWX12ZPvkyiK70ZQ#pZtDe~vPY0D@C0(YdXN@YA#-2N)GTJw zE_Y5nq4Y2+gTI*cUP_a60SfLf-!zz(Xag=qCtL8vYX*odB3d!679}a9CWRq#NOVwwVN%WszHB!=G98{&jOYQg zZK#zVJg80`Y@b?do6{+ohal}^`;DTt*1mSC(#7=P!ojU2x)XD78NP-APN;np70h{% z+GsQga~o_2I|wFBvJKP{YCVcl?Bs3i&+vr?!&WH*z&6pC&~_!jD#F*l?8|Xl*a;bf zM=c?^Nm7-Z_2j2Lg6L!KVKw4xY(d-7OB`qEIAPDiI64VlY;Bei!gLmF4lT{w4kM)w zwj1vX@HOn4Xmm##_(NZ|nC?rlF|E-n0KhCu+9yAv4SEGkDVJ!D7=gMxo*nI^wgG@Irx$wpf-doQ6^*sFlzrDMGwQRc!0>18jXC8OT zE4?#)g+fZ$Z#uROLVazC0kyK9)zS84-~Uaq z2fryslv6xpbUP^eiOcs<8OC=+-}S?F4v6&P!yA{Hs!44>O{~7%?{%ypkLFhVtK!O+ zZtkULqqpXAZgrliinZo-2UX1WsuGemezVL}a#-A`?g2 ztn^TNNmbsAAyw5Iay~Aysm_@kQ)Ta%m1(qnL)Go1&u>e*>8z^WQeqza;qbcn5v6=G`29On+LPE z#jJ{-cDF?49MbIS4_3iT^$aus>H{nn$7B2z4yoy z(Ka4otCVj@(&zqGx|Y)4_s(W%^!92m&f{3)!Q;84 zOA*vWbUu?)JR;NwHwWn_hFl-K!TA&E;KuD&<&C+}#BqIa`Qo+o+89S(=l+e`=~f=- zo7vmvsKkDlE$(bh4W6ZZBQ$;qyBh~T0iPF3j`LY4|6OfzSKk|P4`Y30m37lcHR<4yy;MIQ{p1I);c@4QCWpir>ivT^!D{0@wV>h#jswERFCHv7@GnMK88 znKRDXsOi(y$izO(?z8IfMiYyNPsVgF8qZ4I)i{!)Fp6d=SGVaPo-JJM7xtocj)-oa zJg9SNec^q7@^7W|f4-^@IY?LQE~+bvhx$?yTUJWm7}Ht#j*d8sXQ|4MQTYsuZf95P zCe~2L_%F}W^}Mcfrk9;uLN-5%;ndOV3tkgf?tF}WYaabx+}JhW5=*%%WyUJKsonpN zq^8Q{Rg~sUi7{S`L#RmRrV+hYmy@IpqPmHaDqXx4(Q)C;D=2(j+pxLSq{Dc;h?6XS zB9*(3jN5c=556l-uIRs{SZ_)n{nd9pnbJRPzdtmOA@~cBa-X)BeyFbun#f*g>MGjoU4Ax@BRKxWAaZ|^W=}@jS(BcNY`#x@CfZafedSBv z^}dw;*Nf9U9X|3*6QhgDl>S?tr{zZJM#)8|x#sQd_@b|e>s%g1B^^F;Bc3+I8F%<> zx_Kk7y^J9mom-0ItLi!rzmSX+>#Mu6ZWc9>+T*mz^{c6^Y|AGDqADI}htzgCES5~Y zxHwv>=WV~{4_~?+SB;;^`(i1rTklfXJxOH*`*DG8hY}Zze$5Npv)`BILG?Q2>YEGNbTMY7 zmxY#nZA#Z8+cz!q>^M&2{hvL%vE}0;E>h+2I7q+ony0=jmfzY1x5JKJs(RejQhs_w zE2aJDmRfIg@kaF4bUnrmSzXL#O^hY}SEX*hy&$xk_WC*=7o)*`x{)Hd+}-BDQd=gE zbuDvDj>xHJ$@6kA-PE}_9lWZ{qL=6L&N%3vtmd$zx-@FKy%MiXwxKb7=TH6Oufz>x zxmT=Xx!du#BU{B!NmYs~Pm>$fWjW{C4%@{%tz(3_Fskaj9P{P#CYPLd%1^jUS~&pP z;_|2&**ZTl?9(hVdwF3^qdu&1eJr*5@{_^Y+Bcx3h9y zRdJ&pB~9l!-_}x_H@pnCybPGJo6SWfBv)I{SV`NxV|)pMT+5e{ne3gPtGWAa$VQr*_@9jKe_OB z{PLwNwV`o;oS%o}?z@7n@;=S_vEAdGc~|Pv!R590ksg&8}@-PM*>}ABCe-caMNwX&h$dIE|=$ z!_(vgxUI@Carif7DZ2ZHfA^tZNa;7*XYTnZAE$b}Fyz~=>gabdwR@l&!LaR%G3U5c zMc*A^UP}`{!&uTQx{n-d>L~70RR)>cd`60Vo0>e^uVYeD*W;_oLKV}|DoWY#2+-_* zd|MDv5fsy*YN^f9mwdrbr}V*}$`O&8GF_f5wyDyU=(Q?^SLTCl8!d(|cXSTRagUq^P>)|{;~eHEGgs)}5^+Sm@coRxJy{5p@j&S7=@w5jSdB{UYAcm*o*IW+3> zO0SgXVfB91^^>c*bfv`YS9@i7Kc2JoG5cTr>JNW++$+XwE+sYHylU4|=fx_n@LQ$)xM&^ zP#8x*pO4}+d#XN+=S1<_wvrZ(k9pi-da}OWMzqs9kE#C^Vq|lwqP zhvLm;_WQ1KrkY+|6;<8KAMMqlZ*xxbxn$J>@yD=DVHh z@mi{yQXU6J-sRn!BV?Andep`OUYbyVlQ7xP1|f9HSgwk z{_OjnOX;t65m7#0S9?jH*F@zo+M#q}eI+g?@k^90O|7`EJNJ3Dd|XGtVrpV>Vu<}i z=VI_NOSzwkw9?OOU;CQJ;|We2>l3LzHYTb@MJs)d>h5i}j5qZ1fiON82GF>S<}_Is z<$L*6;2}6ic4@D?H)*1-J3{y3w`;L$=S`cw<<$JW|K%ILHl;t>z1JevIv&rw!Qxi5 zG3D82gmf)p_E?{vH;ml;%vmVj*h1dYCjONav$|xWw1X;(OOq%1qtbNNirW;R0eBnR;q%VlyNWZ6)m!RBVo94N) z+;%Z8jQn!HUBNi2@9tdY`QE$EJx|<+)Qfw&gbhXY{7LG%Clb+0zr)Ez-72m7)g*m^JhC#(R=dUO(1>OI}*y|l+KE~=ipfbss$VGl| zE=A+Ts2oyh`)t41^qISx*T*&c?sq-==9GRdes6JXnl+2nbywAt}HEW^h*7i z3MM*VJo);7;mK29FuB^MEiEy5Qs?EpDkk%dt;^Cd*&lMNnJODKi{<~~MIVmmLzjPG zR2oqyrY>d})QJtwEub9c)zE!YatoWVeqm@eI&|u;aB;tNh2yJL*(;^IZ_)+j*-#np zu~#B$1oT=tZ6FtoZtTx!!FGvM`?KsY_{cK-3uNg=6wRv75>b7JYJ&KRw_}{cK z=RK|Z739bH^2$fP%U(#a#Z_AnxrrA?y5Okn(>y!R<+`d5n9u7jJF&mIw#zl2`K~wp z?RdA}!}C5$E~1;rEJsJtyq_*t;>VM9<>Q#C{KU$p!dA=bD9Z0lS)b}uuc^%C?KNUL zq8hcVBDSQen=j1bC|lYkecP_4T}?#2?l*t>w^I7wf2D6;=geM}57dZ>=$s#=+)o{) zT|c>I=qt(>MAqW z=tCy@cRb|yNJD&kg=z~&(|R5e9ksVUeRbQmeQB%Y^Qv;H%QPlk@1=ZL)2~1LP4V}* zuly%{P(LqGeHVS<^t_%f9#%13z2VX(_jgd`>8y##a_U5@R4vy`FPHe0-LO(H-8h%l z>#JV&L+}4rDgF4rT^}*3nfEi#jj9*3&En#@Emd95Re!b3DFS1k2-a)Wb@Xxjd}*?46WMWuRPKIF#2QP{-$rMja2@>NN~`SZZDSbuo+O)w<@X z8EO_=6yZ8wzpnNXRhL-`{Lxp$8zj^1|JjF~X5RJL_qeXfu@mtc~e_+Cw+~DC(4H==PNH8x9+tY0Et~Q4l`|@$n*&tA_`ySZLER zZI>eQXGW|>HxZT9R%>$ewzSFFQN$;HbMw0?z2Z-o;)R+LHPKa96r0iZbF*(c>UF$^ zq56C?F`DyC-O)I?iV%szvrbiexKGB63*YtR_xygm=YM$5R;g>o5j&P|7IytG_@g0r z=b1X1d_j}jl}XO5q-Lcg3MLEV(}~~nMRCva)^|=dS=(qjc6(SG z2X7%bS4EdMb4|qjqEz)QUjBKniR??B?3YLLYLtI4vh^7@WArAtYNeYhH7jN73*Pz@ z|M|V~?vR`7BX*>wF5{dZRg=RW{=#LlcCxVQO0#*NUk)5yX_l+H<%Ni^`%8y!i_da> z#hTdTix+x2KJ=Vx<9!gT+|Be#?|9U8=_jro&n@1M4cFNw0v39$q9D=`(4PiPDSpRK ze*2Y_{>W>~!g$hFk4qNw_3%6JuUxFSPfKeqr~PQo@)V-9z3_0~)#`lRx|=?9Hso^2 zhd%2E!|Xr&T+ZKVnl*RY;+*0O%B|x&&tqLZ6^?Jy)t+L1<=#)7e*7E%`!A*RaewI4 z4aR}Z;u$rr+Q$5Bue$4Dl|RzD%hqv;IT|Z8^A3NrITNZ<(_4cMXnodgb=};$ytgUaZSL^Cd zT=O%->&vB!_x{3Re8&Huxx3$omJdtas_V;%o4?NOxbl3AUtRY&nHx5Fay?JhrDk05 zD_{7+Z%*kSd}v&Ds{Ab0bjN4usd~Qiplbe$igk_4wPF3+{ns@s<;PuDj%%2A)6_xm z!q5D^??~xQ-*a5swRPTxu)YvUN4{@_BCFVJ=JQ1LTX*%dO^L`LUB@=J(UN{k)%?o9c63o@-BvY5RQH zZ@>Ce;}$)h7fr=qxUjaLq5pV~@sM8}=e;R!NB-28w)5kr7q;ZC_R-(^$MJ~#8=d)a zBVMX2&bchVqHzDy*T+_zlwP?#<}Xa?@2oLD<_frF=I4E!x4$YlcCW5K_?Buu?svaG zKL6~af8yBQrYg70{ProHVf@+)o2f0i4`m1OTCPOk&IR5auTr0s-g1hVwSAm?aakX+ zRCB3(D)FWGZN^=vr5^9PpEETazO(0;Uixo`J0|3wRPA4huea#F)a0J5aKkIfcc;6S z#ss@I_B`J4_~i)@Ah0QcUB4dg`uI1sAN50k0D-C3wC~Mp$o-W#?}IzdkN4Z1w%vyK z@%ZHl5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UxQ_zMf3|iXhtjV4;Gl`jY2MX( z--l`d+byu>*lsp7>NVX@_P)B#gJyGo-#fX==XK$#cjkzz%29mG<#c5Zc%G(eV!Idr z6l*GCXf#v~nV~8&)s>j+Pgae?v?@P zzkAU7dOeHJdW|3HE(Gq*t+a}-412)S)pOjwIu*qBwq{9kYNuSA?SFZE(&f|bkftKe zaj+Zex;k|~r;nWK^3HXp*Z0Av-W{Ji_lrL?^J8-5 z`oC0AN5hv~f7??jU3jwXW8Svwb600eTe|7ZI9vD8Izyl3vqUz%L1*u;S^O~ab$4B7 zU(v}uOdZ7+Z+>rlPSGc?`QG!B``rGBvmKM?v3+r?7`x)q_6_XR8@qCUUaxK19dxV5 z-mv+LRnNvZPL4VoKR%C&?>KvX?^k{yrRFZLEsI0EG+XOD=<9b zp0>eC+*w}ZTIoyy0RjXF5FqdX2-I7;4YS!S-=ClPmUBxtZ!3p&c$i<`TKYYamr=HI zUl|mEa~C-7>RaF0+OMbl-nrwyDE-cQ6it8t0RjZhTj1=k!fs-Om-g~^wj3`0KGgmB zCTO3}eT)w7{jG3#=;eo1N-uwCD+Y7!gV@l!i<+|y^x){=D0;|0&x6!#WE;=A=fXU? zXr3qL8zI*T0RjXzCs3{L>Q3*5u9QFcFMssEzEd>>2oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlya6SU{aorwUd0fMVx>>runT{5E-R6abFQ&LJ+kU;SuWz%^=Eqi@ zrpv2qg4!KcucP3!?B$dz6Gni*whCt}edx<~vh*mv1Cm zav3eQ#G4elw0G9sHX7bGW$zNHK5iRsA6I$mx^F*v+pnkey%$g2;Q1Fgx<+ki(!- z{Uu$q_6wyv#&+S+d}O@g(KT_32@oJapckn7%vQ~Z_iVK9w79;#za-x(HiIERfB*pk z1PDCX0`=17&Fb0pc)#Lu@lupU0tB{6pxLIutQkv_j*e1l;%6nb?_XLeRzQFN0RjXF z5FkK+009C72oNAZfB*pk1PBlyuq?2*gK4}CJ2?CY>u(jtJ42oTf%_`3>(|3wAOC&b z`BqMVzyl`GUlH?W?Mi;U3wCA9<8hA1FHe8~0RjXF5FkKcF3{gK?$Ufd`uQ`8T^;{; zTjU84AaE9eUAhkTV;ygAU$#s0@%ZHl5FoHQf&NOEd)$@$cl=in}I9sA(7z79qAV7cs0RjXF5FkK+009C72oNB!^8)o*w_r9)>H3*_ zIqN92CqQ6h0`nUGb;zv5QKz-`SHG!_@YhV-;AV7cs0RjXFJg)=}wqk1! zj#87-(RK`GD?|)}009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2yC~&-VUa*=nf8lZ#;f^0t5(bN?_Nohr2%hP3=eh5FkJxrT&VTEp{b8-fz1y=J7bk z6Z2&B|s5wpdvLX8S{9YbULs@qXKt zF^|VN9=|*R0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNB!?E?L`6z|e}Y`RP1?#DVF zzdQi~1U4nmUt@M@KHm0S8h1a|@%ZHl5FoHQf$>#lSMuYn-<2_s$2lIqJOKg(2oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PDCn0*AY>ftM~_O6k(xE)3New^3jxj`BFf z2#2Z)`{EhyVcsslOs-ie1T%ciXOvc|6YX_~i)@AV7cs0RjXF%mwDP#^&U1PBlyK!5-N0_P)8&t}(Cn$`9Bbgx$e1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0tB{5;PI69{@`c6^i!)CQ~r58HG468LC)u&Zuy~pc~kSQ-wW+Js=bf and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."} + + return 1 +} + +################################################################ +# START +################################################################ + +# To test this script, run the following commands from Vivado Tcl console: +# source router_design_script.tcl + +# If there is no project opened, this script will create a +# project, but make sure you do not have an existing project +# <./myproj/project_1.xpr> in the current working folder. + +set list_projs [get_projects -quiet] +if { $list_projs eq "" } { + create_project project_1 myproj -part xczu3eg-sbva484-1-e + set_property BOARD_PART em.avnet.com:ultra96:part0:1.0 [current_project] +} + + +# CHANGE DESIGN NAME HERE +variable design_name +set design_name router_design + +# If you do not already have an existing IP Integrator design open, +# you can create a design using the following command: +# create_bd_design $design_name + +# Creating design if needed +set errMsg "" +set nRet 0 + +set cur_design [current_bd_design -quiet] +set list_cells [get_bd_cells -quiet] + +if { ${design_name} eq "" } { + # USE CASES: + # 1) Design_name not set + + set errMsg "Please set the variable to a non-empty value." + set nRet 1 + +} elseif { ${cur_design} ne "" && ${list_cells} eq "" } { + # USE CASES: + # 2): Current design opened AND is empty AND names same. + # 3): Current design opened AND is empty AND names diff; design_name NOT in project. + # 4): Current design opened AND is empty AND names diff; design_name exists in project. + + if { $cur_design ne $design_name } { + common::send_msg_id "BD_TCL-001" "INFO" "Changing value of from <$design_name> to <$cur_design> since current design is empty." + set design_name [get_property NAME $cur_design] + } + common::send_msg_id "BD_TCL-002" "INFO" "Constructing design in IPI design <$cur_design>..." + +} elseif { ${cur_design} ne "" && $list_cells ne "" && $cur_design eq $design_name } { + # USE CASES: + # 5) Current design opened AND has components AND same names. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 1 +} elseif { [get_files -quiet ${design_name}.bd] ne "" } { + # USE CASES: + # 6) Current opened design, has components, but diff names, design_name exists in project. + # 7) No opened design, design_name exists in project. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 2 + +} else { + # USE CASES: + # 8) No opened design, design_name not in project. + # 9) Current opened design, has components, but diff names, design_name not in project. + + common::send_msg_id "BD_TCL-003" "INFO" "Currently there is no design <$design_name> in project, so creating one..." + + create_bd_design $design_name + + common::send_msg_id "BD_TCL-004" "INFO" "Making design <$design_name> as current_bd_design." + current_bd_design $design_name + +} + +common::send_msg_id "BD_TCL-005" "INFO" "Currently the variable is equal to \"$design_name\"." + +if { $nRet != 0 } { + catch {common::send_msg_id "BD_TCL-114" "ERROR" $errMsg} + return $nRet +} + +set bCheckIPsPassed 1 +################################################################## +# CHECK IPs +################################################################## +set bCheckIPs 1 +if { $bCheckIPs == 1 } { + set list_check_ips "\ +xilinx.com:hls:pynqrouter:1.0\ +xilinx.com:ip:proc_sys_reset:5.0\ +xilinx.com:ip:zynq_ultra_ps_e:3.2\ +" + + set list_ips_missing "" + common::send_msg_id "BD_TCL-006" "INFO" "Checking if the following IPs exist in the project's IP catalog: $list_check_ips ." + + foreach ip_vlnv $list_check_ips { + set ip_obj [get_ipdefs -all $ip_vlnv] + if { $ip_obj eq "" } { + lappend list_ips_missing $ip_vlnv + } + } + + if { $list_ips_missing ne "" } { + catch {common::send_msg_id "BD_TCL-115" "ERROR" "The following IPs are not found in the IP Catalog:\n $list_ips_missing\n\nResolution: Please add the repository containing the IP(s) to the project." } + set bCheckIPsPassed 0 + } + +} + +if { $bCheckIPsPassed != 1 } { + common::send_msg_id "BD_TCL-1003" "WARNING" "Will not continue with creation of design due to the error(s) above." + return 3 +} + +################################################################## +# DESIGN PROCs +################################################################## + + + +# Procedure to create entire design; Provide argument to make +# procedure reusable. If parentCell is "", will use root. +proc create_root_design { parentCell } { + + variable script_folder + variable design_name + + if { $parentCell eq "" } { + set parentCell [get_bd_cells /] + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + + # Create interface ports + + # Create ports + + # Create instance: ps8_0_axi_periph, and set properties + set ps8_0_axi_periph [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 ps8_0_axi_periph ] + set_property -dict [ list \ + CONFIG.NUM_MI {1} \ + CONFIG.NUM_SI {2} \ + ] $ps8_0_axi_periph + + # Create instance: pynqrouter_0, and set properties + set pynqrouter_0 [ create_bd_cell -type ip -vlnv xilinx.com:hls:pynqrouter:1.0 pynqrouter_0 ] + + # Create instance: rst_ps8_0_100M, and set properties + set rst_ps8_0_100M [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 rst_ps8_0_100M ] + + # Create instance: zynq_ultra_ps_e_0, and set properties + set zynq_ultra_ps_e_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.2 zynq_ultra_ps_e_0 ] + set_property -dict [ list \ + CONFIG.PSU_BANK_0_IO_STANDARD {LVCMOS18} \ + CONFIG.PSU_BANK_1_IO_STANDARD {LVCMOS18} \ + CONFIG.PSU_BANK_2_IO_STANDARD {LVCMOS18} \ + CONFIG.PSU_BANK_3_IO_STANDARD {LVCMOS18} \ + CONFIG.PSU_DDR_RAM_HIGHADDR {0x7FFFFFFF} \ + CONFIG.PSU_DDR_RAM_HIGHADDR_OFFSET {0x00000002} \ + CONFIG.PSU_DDR_RAM_LOWADDR_OFFSET {0x80000000} \ + CONFIG.PSU_MIO_0_DIRECTION {out} \ + CONFIG.PSU_MIO_0_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_10_DIRECTION {inout} \ + CONFIG.PSU_MIO_11_DIRECTION {inout} \ + CONFIG.PSU_MIO_12_DIRECTION {inout} \ + CONFIG.PSU_MIO_13_DIRECTION {inout} \ + CONFIG.PSU_MIO_13_DRIVE_STRENGTH {4} \ + CONFIG.PSU_MIO_14_DIRECTION {inout} \ + CONFIG.PSU_MIO_14_DRIVE_STRENGTH {4} \ + CONFIG.PSU_MIO_15_DIRECTION {inout} \ + CONFIG.PSU_MIO_15_DRIVE_STRENGTH {4} \ + CONFIG.PSU_MIO_16_DIRECTION {inout} \ + CONFIG.PSU_MIO_16_DRIVE_STRENGTH {4} \ + CONFIG.PSU_MIO_17_DIRECTION {inout} \ + CONFIG.PSU_MIO_18_DIRECTION {inout} \ + CONFIG.PSU_MIO_19_DIRECTION {inout} \ + CONFIG.PSU_MIO_1_DIRECTION {in} \ + CONFIG.PSU_MIO_1_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_1_SLEW {slow} \ + CONFIG.PSU_MIO_20_DIRECTION {inout} \ + CONFIG.PSU_MIO_21_DIRECTION {inout} \ + CONFIG.PSU_MIO_21_DRIVE_STRENGTH {4} \ + CONFIG.PSU_MIO_22_DIRECTION {out} \ + CONFIG.PSU_MIO_22_DRIVE_STRENGTH {4} \ + CONFIG.PSU_MIO_22_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_23_DIRECTION {inout} \ + CONFIG.PSU_MIO_24_DIRECTION {in} \ + CONFIG.PSU_MIO_24_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_24_SLEW {slow} \ + CONFIG.PSU_MIO_25_DIRECTION {inout} \ + CONFIG.PSU_MIO_26_DIRECTION {in} \ + CONFIG.PSU_MIO_26_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_26_SLEW {slow} \ + CONFIG.PSU_MIO_27_DIRECTION {out} \ + CONFIG.PSU_MIO_27_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_28_DIRECTION {in} \ + CONFIG.PSU_MIO_28_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_28_SLEW {slow} \ + CONFIG.PSU_MIO_29_DIRECTION {out} \ + CONFIG.PSU_MIO_29_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_2_DIRECTION {in} \ + CONFIG.PSU_MIO_2_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_2_SLEW {slow} \ + CONFIG.PSU_MIO_30_DIRECTION {in} \ + CONFIG.PSU_MIO_30_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_30_SLEW {slow} \ + CONFIG.PSU_MIO_31_DIRECTION {inout} \ + CONFIG.PSU_MIO_32_DIRECTION {out} \ + CONFIG.PSU_MIO_32_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_33_DIRECTION {out} \ + CONFIG.PSU_MIO_33_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_34_DIRECTION {out} \ + CONFIG.PSU_MIO_34_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_35_DIRECTION {inout} \ + CONFIG.PSU_MIO_36_DIRECTION {inout} \ + CONFIG.PSU_MIO_37_DIRECTION {inout} \ + CONFIG.PSU_MIO_38_DIRECTION {inout} \ + CONFIG.PSU_MIO_39_DIRECTION {inout} \ + CONFIG.PSU_MIO_39_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_39_SLEW {slow} \ + CONFIG.PSU_MIO_3_DIRECTION {out} \ + CONFIG.PSU_MIO_3_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_40_DIRECTION {inout} \ + CONFIG.PSU_MIO_41_DIRECTION {inout} \ + CONFIG.PSU_MIO_42_DIRECTION {inout} \ + CONFIG.PSU_MIO_43_DIRECTION {inout} \ + CONFIG.PSU_MIO_44_DIRECTION {inout} \ + CONFIG.PSU_MIO_45_DIRECTION {inout} \ + CONFIG.PSU_MIO_46_DIRECTION {inout} \ + CONFIG.PSU_MIO_47_DIRECTION {inout} \ + CONFIG.PSU_MIO_48_DIRECTION {inout} \ + CONFIG.PSU_MIO_49_DIRECTION {inout} \ + CONFIG.PSU_MIO_4_DIRECTION {inout} \ + CONFIG.PSU_MIO_50_DIRECTION {inout} \ + CONFIG.PSU_MIO_51_DIRECTION {out} \ + CONFIG.PSU_MIO_51_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_52_DIRECTION {in} \ + CONFIG.PSU_MIO_52_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_52_SLEW {slow} \ + CONFIG.PSU_MIO_53_DIRECTION {in} \ + CONFIG.PSU_MIO_53_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_53_SLEW {slow} \ + CONFIG.PSU_MIO_54_DIRECTION {inout} \ + CONFIG.PSU_MIO_55_DIRECTION {in} \ + CONFIG.PSU_MIO_55_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_55_SLEW {slow} \ + CONFIG.PSU_MIO_56_DIRECTION {inout} \ + CONFIG.PSU_MIO_57_DIRECTION {inout} \ + CONFIG.PSU_MIO_58_DIRECTION {out} \ + CONFIG.PSU_MIO_58_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_59_DIRECTION {inout} \ + CONFIG.PSU_MIO_5_DIRECTION {inout} \ + CONFIG.PSU_MIO_60_DIRECTION {inout} \ + CONFIG.PSU_MIO_61_DIRECTION {inout} \ + CONFIG.PSU_MIO_62_DIRECTION {inout} \ + CONFIG.PSU_MIO_63_DIRECTION {inout} \ + CONFIG.PSU_MIO_64_DIRECTION {in} \ + CONFIG.PSU_MIO_64_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_64_SLEW {slow} \ + CONFIG.PSU_MIO_65_DIRECTION {in} \ + CONFIG.PSU_MIO_65_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_65_SLEW {slow} \ + CONFIG.PSU_MIO_66_DIRECTION {inout} \ + CONFIG.PSU_MIO_67_DIRECTION {in} \ + CONFIG.PSU_MIO_67_DRIVE_STRENGTH {12} \ + CONFIG.PSU_MIO_67_SLEW {slow} \ + CONFIG.PSU_MIO_68_DIRECTION {inout} \ + CONFIG.PSU_MIO_69_DIRECTION {inout} \ + CONFIG.PSU_MIO_6_DIRECTION {inout} \ + CONFIG.PSU_MIO_70_DIRECTION {out} \ + CONFIG.PSU_MIO_70_INPUT_TYPE {schmitt} \ + CONFIG.PSU_MIO_71_DIRECTION {inout} \ + CONFIG.PSU_MIO_72_DIRECTION {inout} \ + CONFIG.PSU_MIO_73_DIRECTION {inout} \ + CONFIG.PSU_MIO_74_DIRECTION {inout} \ + CONFIG.PSU_MIO_75_DIRECTION {inout} \ + CONFIG.PSU_MIO_76_DIRECTION {inout} \ + CONFIG.PSU_MIO_77_DIRECTION {inout} \ + CONFIG.PSU_MIO_7_DIRECTION {inout} \ + CONFIG.PSU_MIO_8_DIRECTION {inout} \ + CONFIG.PSU_MIO_9_DIRECTION {inout} \ + CONFIG.PSU_MIO_TREE_PERIPHERALS {UART 1#UART 1#UART 0#UART 0#I2C 1#I2C 1#SPI 1#GPIO0 MIO#GPIO0 MIO#SPI 1#SPI 1#SPI 1#GPIO0 MIO#SD 0#SD 0#SD 0#SD 0#GPIO0 MIO#GPIO0 MIO#GPIO0 MIO#GPIO0 MIO#SD 0#SD 0#GPIO0 MIO#SD 0#GPIO0 MIO#PMU GPI 0#DPAUX#DPAUX#DPAUX#DPAUX#GPIO1 MIO#PMU GPO 0#PMU GPO 1#PMU GPO 2#GPIO1 MIO#GPIO1 MIO#GPIO1 MIO#SPI 0#GPIO1 MIO#GPIO1 MIO#SPI 0#SPI 0#SPI 0#GPIO1 MIO#GPIO1 MIO#SD 1#SD 1#SD 1#SD 1#SD 1#SD 1#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 1#USB 1#USB 1#USB 1#USB 1#USB 1#USB 1#USB 1#USB 1#USB 1#USB 1#USB 1#GPIO2 MIO#GPIO2 MIO} \ + CONFIG.PSU_MIO_TREE_SIGNALS {txd#rxd#rxd#txd#scl_out#sda_out#sclk_out#gpio0[7]#gpio0[8]#n_ss_out[0]#miso#mosi#gpio0[12]#sdio0_data_out[0]#sdio0_data_out[1]#sdio0_data_out[2]#sdio0_data_out[3]#gpio0[17]#gpio0[18]#gpio0[19]#gpio0[20]#sdio0_cmd_out#sdio0_clk_out#gpio0[23]#sdio0_cd_n#gpio0[25]#gpi[0]#dp_aux_data_out#dp_hot_plug_detect#dp_aux_data_oe#dp_aux_data_in#gpio1[31]#gpo[0]#gpo[1]#gpo[2]#gpio1[35]#gpio1[36]#gpio1[37]#sclk_out#gpio1[39]#gpio1[40]#n_ss_out[0]#miso#mosi#gpio1[44]#gpio1[45]#sdio1_data_out[0]#sdio1_data_out[1]#sdio1_data_out[2]#sdio1_data_out[3]#sdio1_cmd_out#sdio1_clk_out#ulpi_clk_in#ulpi_dir#ulpi_tx_data[2]#ulpi_nxt#ulpi_tx_data[0]#ulpi_tx_data[1]#ulpi_stp#ulpi_tx_data[3]#ulpi_tx_data[4]#ulpi_tx_data[5]#ulpi_tx_data[6]#ulpi_tx_data[7]#ulpi_clk_in#ulpi_dir#ulpi_tx_data[2]#ulpi_nxt#ulpi_tx_data[0]#ulpi_tx_data[1]#ulpi_stp#ulpi_tx_data[3]#ulpi_tx_data[4]#ulpi_tx_data[5]#ulpi_tx_data[6]#ulpi_tx_data[7]#gpio2[76]#gpio2[77]} \ + CONFIG.PSU_SD0_INTERNAL_BUS_WIDTH {4} \ + CONFIG.PSU_SD1_INTERNAL_BUS_WIDTH {4} \ + CONFIG.PSU__ACT_DDR_FREQ_MHZ {525.000000} \ + CONFIG.PSU__CAN1__GRP_CLK__ENABLE {0} \ + CONFIG.PSU__CAN1__PERIPHERAL__ENABLE {0} \ + CONFIG.PSU__CRF_APB__ACPU_CTRL__ACT_FREQMHZ {1200.000024} \ + CONFIG.PSU__CRF_APB__ACPU_CTRL__DIVISOR0 {1} \ + CONFIG.PSU__CRF_APB__ACPU_CTRL__FREQMHZ {1200} \ + CONFIG.PSU__CRF_APB__ACPU_CTRL__SRCSEL {APLL} \ + CONFIG.PSU__CRF_APB__APLL_CTRL__DIV2 {1} \ + CONFIG.PSU__CRF_APB__APLL_CTRL__FBDIV {72} \ + CONFIG.PSU__CRF_APB__APLL_CTRL__FRACDATA {0.000000} \ + CONFIG.PSU__CRF_APB__APLL_CTRL__SRCSEL {PSS_REF_CLK} \ + CONFIG.PSU__CRF_APB__APLL_FRAC_CFG__ENABLED {0} \ + CONFIG.PSU__CRF_APB__APLL_TO_LPD_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__ACT_FREQMHZ {250.000005} \ + CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__DIVISOR0 {5} \ + CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__ACT_FREQMHZ {250.000005} \ + CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__DDR_CTRL__ACT_FREQMHZ {262.500005} \ + CONFIG.PSU__CRF_APB__DDR_CTRL__DIVISOR0 {4} \ + CONFIG.PSU__CRF_APB__DDR_CTRL__FREQMHZ {533} \ + CONFIG.PSU__CRF_APB__DDR_CTRL__SRCSEL {DPLL} \ + CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__ACT_FREQMHZ {600.000012} \ + CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__FREQMHZ {600} \ + CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__SRCSEL {APLL} \ + CONFIG.PSU__CRF_APB__DPLL_CTRL__DIV2 {1} \ + CONFIG.PSU__CRF_APB__DPLL_CTRL__FBDIV {63} \ + CONFIG.PSU__CRF_APB__DPLL_CTRL__FRACDATA {0.000000} \ + CONFIG.PSU__CRF_APB__DPLL_CTRL__SRCSEL {PSS_REF_CLK} \ + CONFIG.PSU__CRF_APB__DPLL_FRAC_CFG__ENABLED {0} \ + CONFIG.PSU__CRF_APB__DPLL_TO_LPD_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__ACT_FREQMHZ {25.000000} \ + CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__DIVISOR0 {16} \ + CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__SRCSEL {RPLL} \ + CONFIG.PSU__CRF_APB__DP_AUDIO__FRAC_ENABLED {0} \ + CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__ACT_FREQMHZ {26.666667} \ + CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__SRCSEL {RPLL} \ + CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__ACT_FREQMHZ {300.000006} \ + CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__DIVISOR0 {5} \ + CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__SRCSEL {VPLL} \ + CONFIG.PSU__CRF_APB__DP_VIDEO__FRAC_ENABLED {0} \ + CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__ACT_FREQMHZ {600.000012} \ + CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__FREQMHZ {600} \ + CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__SRCSEL {APLL} \ + CONFIG.PSU__CRF_APB__GPU_REF_CTRL__ACT_FREQMHZ {500.000010} \ + CONFIG.PSU__CRF_APB__GPU_REF_CTRL__DIVISOR0 {1} \ + CONFIG.PSU__CRF_APB__GPU_REF_CTRL__FREQMHZ {500} \ + CONFIG.PSU__CRF_APB__GPU_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__PCIE_REF_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRF_APB__PCIE_REF_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRF_APB__PCIE_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__SATA_REF_CTRL__DIVISOR0 {5} \ + CONFIG.PSU__CRF_APB__SATA_REF_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRF_APB__SATA_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__ACT_FREQMHZ {100.000002} \ + CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__DIVISOR0 {5} \ + CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__ACT_FREQMHZ {525.000011} \ + CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__DIVISOR0 {2} \ + CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__FREQMHZ {533.33} \ + CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__SRCSEL {DPLL} \ + CONFIG.PSU__CRF_APB__VPLL_CTRL__DIV2 {1} \ + CONFIG.PSU__CRF_APB__VPLL_CTRL__FBDIV {90} \ + CONFIG.PSU__CRF_APB__VPLL_CTRL__FRACDATA {0.000000} \ + CONFIG.PSU__CRF_APB__VPLL_CTRL__SRCSEL {PSS_REF_CLK} \ + CONFIG.PSU__CRF_APB__VPLL_FRAC_CFG__ENABLED {0} \ + CONFIG.PSU__CRF_APB__VPLL_TO_LPD_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__ACT_FREQMHZ {500.000010} \ + CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__FREQMHZ {500} \ + CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__AFI6_REF_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__AMS_REF_CTRL__ACT_FREQMHZ {50.000001} \ + CONFIG.PSU__CRL_APB__AMS_REF_CTRL__DIVISOR0 {30} \ + CONFIG.PSU__CRL_APB__AMS_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__CAN0_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__CAN0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__CPU_R5_CTRL__ACT_FREQMHZ {500.000010} \ + CONFIG.PSU__CRL_APB__CPU_R5_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__CPU_R5_CTRL__FREQMHZ {500} \ + CONFIG.PSU__CRL_APB__CPU_R5_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__ACT_FREQMHZ {250.000005} \ + CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__DLL_REF_CTRL__ACT_FREQMHZ {1499.999985} \ + CONFIG.PSU__CRL_APB__GEM0_REF_CTRL__DIVISOR0 {12} \ + CONFIG.PSU__CRL_APB__GEM0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__GEM1_REF_CTRL__DIVISOR0 {12} \ + CONFIG.PSU__CRL_APB__GEM1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__GEM2_REF_CTRL__DIVISOR0 {12} \ + CONFIG.PSU__CRL_APB__GEM2_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__DIVISOR0 {12} \ + CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__FREQMHZ {125} \ + CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__DIVISOR0 {4} \ + CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__ACT_FREQMHZ {100.000002} \ + CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__IOPLL_CTRL__DIV2 {1} \ + CONFIG.PSU__CRL_APB__IOPLL_CTRL__FBDIV {90} \ + CONFIG.PSU__CRL_APB__IOPLL_CTRL__FRACDATA {0.000000} \ + CONFIG.PSU__CRL_APB__IOPLL_CTRL__SRCSEL {PSS_REF_CLK} \ + CONFIG.PSU__CRL_APB__IOPLL_FRAC_CFG__ENABLED {0} \ + CONFIG.PSU__CRL_APB__IOPLL_TO_FPD_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__ACT_FREQMHZ {250.000005} \ + CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__ACT_FREQMHZ {100.000002} \ + CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__ACT_FREQMHZ {500.000010} \ + CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__FREQMHZ {500} \ + CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__NAND_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__NAND_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__PCAP_CTRL__ACT_FREQMHZ {187.500004} \ + CONFIG.PSU__CRL_APB__PCAP_CTRL__DIVISOR0 {8} \ + CONFIG.PSU__CRL_APB__PCAP_CTRL__FREQMHZ {200} \ + CONFIG.PSU__CRL_APB__PCAP_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__PL0_REF_CTRL__ACT_FREQMHZ {100.000002} \ + CONFIG.PSU__CRL_APB__PL0_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__PL0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__PL0_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__PL0_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__PL1_REF_CTRL__DIVISOR0 {4} \ + CONFIG.PSU__CRL_APB__PL1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__PL2_REF_CTRL__DIVISOR0 {4} \ + CONFIG.PSU__CRL_APB__PL2_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__PL3_REF_CTRL__DIVISOR0 {4} \ + CONFIG.PSU__CRL_APB__PL3_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__DIVISOR0 {5} \ + CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__FREQMHZ {125} \ + CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__RPLL_CTRL__DIV2 {1} \ + CONFIG.PSU__CRL_APB__RPLL_CTRL__FBDIV {72} \ + CONFIG.PSU__CRL_APB__RPLL_CTRL__FRACDATA {0.000000} \ + CONFIG.PSU__CRL_APB__RPLL_CTRL__SRCSEL {PSS_REF_CLK} \ + CONFIG.PSU__CRL_APB__RPLL_FRAC_CFG__ENABLED {0} \ + CONFIG.PSU__CRL_APB__RPLL_TO_FPD_CTRL__DIVISOR0 {3} \ + CONFIG.PSU__CRL_APB__SDIO0_REF_CTRL__ACT_FREQMHZ {200.000004} \ + CONFIG.PSU__CRL_APB__SDIO0_REF_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__SDIO0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__ACT_FREQMHZ {187.500004} \ + CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__DIVISOR0 {8} \ + CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__FREQMHZ {200} \ + CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__SPI0_REF_CTRL__ACT_FREQMHZ {200.000004} \ + CONFIG.PSU__CRL_APB__SPI0_REF_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__SPI0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__SPI1_REF_CTRL__ACT_FREQMHZ {200.000004} \ + CONFIG.PSU__CRL_APB__SPI1_REF_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__SPI1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__ACT_FREQMHZ {100.000002} \ + CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__UART0_REF_CTRL__ACT_FREQMHZ {100.000002} \ + CONFIG.PSU__CRL_APB__UART0_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__UART0_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__UART0_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__UART0_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__UART1_REF_CTRL__ACT_FREQMHZ {100.000002} \ + CONFIG.PSU__CRL_APB__UART1_REF_CTRL__DIVISOR0 {15} \ + CONFIG.PSU__CRL_APB__UART1_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__UART1_REF_CTRL__FREQMHZ {100} \ + CONFIG.PSU__CRL_APB__UART1_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__ACT_FREQMHZ {250.000005} \ + CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__FREQMHZ {250} \ + CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__USB1_BUS_REF_CTRL__ACT_FREQMHZ {250.000005} \ + CONFIG.PSU__CRL_APB__USB1_BUS_REF_CTRL__DIVISOR0 {6} \ + CONFIG.PSU__CRL_APB__USB1_BUS_REF_CTRL__DIVISOR1 {1} \ + CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__ACT_FREQMHZ {20.000000} \ + CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__DIVISOR0 {25} \ + CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__DIVISOR1 {3} \ + CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__FREQMHZ {20} \ + CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__SRCSEL {IOPLL} \ + CONFIG.PSU__CRL_APB__USB3__ENABLE {1} \ + CONFIG.PSU__CSUPMU__PERIPHERAL__VALID {1} \ + CONFIG.PSU__DDRC__ADDR_MIRROR {1} \ + CONFIG.PSU__DDRC__AL {0} \ + CONFIG.PSU__DDRC__BANK_ADDR_COUNT {3} \ + CONFIG.PSU__DDRC__BG_ADDR_COUNT {NA} \ + CONFIG.PSU__DDRC__BRC_MAPPING {ROW_BANK_COL} \ + CONFIG.PSU__DDRC__BUS_WIDTH {32 Bit} \ + CONFIG.PSU__DDRC__CL {NA} \ + CONFIG.PSU__DDRC__CLOCK_STOP_EN {0} \ + CONFIG.PSU__DDRC__COL_ADDR_COUNT {10} \ + CONFIG.PSU__DDRC__COMPONENTS {Components} \ + CONFIG.PSU__DDRC__CWL {NA} \ + CONFIG.PSU__DDRC__DDR4_ADDR_MAPPING {NA} \ + CONFIG.PSU__DDRC__DDR4_CAL_MODE_ENABLE {NA} \ + CONFIG.PSU__DDRC__DDR4_CRC_CONTROL {NA} \ + CONFIG.PSU__DDRC__DDR4_MAXPWR_SAVING_EN {NA} \ + CONFIG.PSU__DDRC__DDR4_T_REF_MODE {NA} \ + CONFIG.PSU__DDRC__DDR4_T_REF_RANGE {NA} \ + CONFIG.PSU__DDRC__DEEP_PWR_DOWN_EN {0} \ + CONFIG.PSU__DDRC__DEVICE_CAPACITY {16384 MBits} \ + CONFIG.PSU__DDRC__DIMM_ADDR_MIRROR {0} \ + CONFIG.PSU__DDRC__DM_DBI {DM_NO_DBI} \ + CONFIG.PSU__DDRC__DQMAP_0_3 {0} \ + CONFIG.PSU__DDRC__DQMAP_12_15 {0} \ + CONFIG.PSU__DDRC__DQMAP_16_19 {0} \ + CONFIG.PSU__DDRC__DQMAP_20_23 {0} \ + CONFIG.PSU__DDRC__DQMAP_24_27 {0} \ + CONFIG.PSU__DDRC__DQMAP_28_31 {0} \ + CONFIG.PSU__DDRC__DQMAP_32_35 {0} \ + CONFIG.PSU__DDRC__DQMAP_36_39 {0} \ + CONFIG.PSU__DDRC__DQMAP_40_43 {0} \ + CONFIG.PSU__DDRC__DQMAP_44_47 {0} \ + CONFIG.PSU__DDRC__DQMAP_48_51 {0} \ + CONFIG.PSU__DDRC__DQMAP_4_7 {0} \ + CONFIG.PSU__DDRC__DQMAP_52_55 {0} \ + CONFIG.PSU__DDRC__DQMAP_56_59 {0} \ + CONFIG.PSU__DDRC__DQMAP_60_63 {0} \ + CONFIG.PSU__DDRC__DQMAP_64_67 {0} \ + CONFIG.PSU__DDRC__DQMAP_68_71 {0} \ + CONFIG.PSU__DDRC__DQMAP_8_11 {0} \ + CONFIG.PSU__DDRC__DRAM_WIDTH {32 Bits} \ + CONFIG.PSU__DDRC__ECC {Disabled} \ + CONFIG.PSU__DDRC__ENABLE_2T_TIMING {0} \ + CONFIG.PSU__DDRC__ENABLE_DP_SWITCH {1} \ + CONFIG.PSU__DDRC__ENABLE_LP4_HAS_ECC_COMP {0} \ + CONFIG.PSU__DDRC__ENABLE_LP4_SLOWBOOT {0} \ + CONFIG.PSU__DDRC__FGRM {NA} \ + CONFIG.PSU__DDRC__LP_ASR {NA} \ + CONFIG.PSU__DDRC__MEMORY_TYPE {LPDDR 4} \ + CONFIG.PSU__DDRC__PARITY_ENABLE {NA} \ + CONFIG.PSU__DDRC__PER_BANK_REFRESH {0} \ + CONFIG.PSU__DDRC__PHY_DBI_MODE {0} \ + CONFIG.PSU__DDRC__RANK_ADDR_COUNT {0} \ + CONFIG.PSU__DDRC__ROW_ADDR_COUNT {16} \ + CONFIG.PSU__DDRC__SB_TARGET {NA} \ + CONFIG.PSU__DDRC__SELF_REF_ABORT {NA} \ + CONFIG.PSU__DDRC__SPEED_BIN {LPDDR4_1066} \ + CONFIG.PSU__DDRC__STATIC_RD_MODE {0} \ + CONFIG.PSU__DDRC__TRAIN_DATA_EYE {1} \ + CONFIG.PSU__DDRC__TRAIN_READ_GATE {1} \ + CONFIG.PSU__DDRC__TRAIN_WRITE_LEVEL {1} \ + CONFIG.PSU__DDRC__T_FAW {40.0} \ + CONFIG.PSU__DDRC__T_RAS_MIN {42} \ + CONFIG.PSU__DDRC__T_RC {63} \ + CONFIG.PSU__DDRC__T_RCD {15} \ + CONFIG.PSU__DDRC__T_RP {15} \ + CONFIG.PSU__DDRC__VENDOR_PART {OTHERS} \ + CONFIG.PSU__DDRC__VREF {0} \ + CONFIG.PSU__DDR_HIGH_ADDRESS_GUI_ENABLE {0} \ + CONFIG.PSU__DDR_QOS_ENABLE {1} \ + CONFIG.PSU__DDR_QOS_HP0_RDQOS {7} \ + CONFIG.PSU__DDR_QOS_HP0_WRQOS {15} \ + CONFIG.PSU__DDR_QOS_HP1_RDQOS {3} \ + CONFIG.PSU__DDR_QOS_HP1_WRQOS {3} \ + CONFIG.PSU__DDR_QOS_HP2_RDQOS {3} \ + CONFIG.PSU__DDR_QOS_HP2_WRQOS {3} \ + CONFIG.PSU__DDR_QOS_HP3_RDQOS {3} \ + CONFIG.PSU__DDR_QOS_HP3_WRQOS {3} \ + CONFIG.PSU__DDR_QOS_PORT0_TYPE {Low Latency} \ + CONFIG.PSU__DDR_QOS_PORT1_VN1_TYPE {Low Latency} \ + CONFIG.PSU__DDR_QOS_PORT1_VN2_TYPE {Best Effort} \ + CONFIG.PSU__DDR_QOS_PORT2_VN1_TYPE {Low Latency} \ + CONFIG.PSU__DDR_QOS_PORT2_VN2_TYPE {Best Effort} \ + CONFIG.PSU__DDR_QOS_PORT3_TYPE {Video Traffic} \ + CONFIG.PSU__DDR_QOS_PORT4_TYPE {Best Effort} \ + CONFIG.PSU__DDR_QOS_PORT5_TYPE {Best Effort} \ + CONFIG.PSU__DDR_QOS_RD_HPR_THRSHLD {0} \ + CONFIG.PSU__DDR_QOS_RD_LPR_THRSHLD {16} \ + CONFIG.PSU__DDR_QOS_WR_THRSHLD {16} \ + CONFIG.PSU__DDR__INTERFACE__FREQMHZ {266.500} \ + CONFIG.PSU__DISPLAYPORT__LANE0__ENABLE {1} \ + CONFIG.PSU__DISPLAYPORT__LANE0__IO {GT Lane1} \ + CONFIG.PSU__DISPLAYPORT__LANE1__ENABLE {1} \ + CONFIG.PSU__DISPLAYPORT__LANE1__IO {GT Lane0} \ + CONFIG.PSU__DISPLAYPORT__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__DLL__ISUSED {1} \ + CONFIG.PSU__DPAUX__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__DPAUX__PERIPHERAL__IO {MIO 27 .. 30} \ + CONFIG.PSU__DP__LANE_SEL {Dual Lower} \ + CONFIG.PSU__DP__REF_CLK_FREQ {27} \ + CONFIG.PSU__DP__REF_CLK_SEL {Ref Clk1} \ + CONFIG.PSU__ENET3__FIFO__ENABLE {0} \ + CONFIG.PSU__ENET3__GRP_MDIO__ENABLE {0} \ + CONFIG.PSU__ENET3__PERIPHERAL__ENABLE {0} \ + CONFIG.PSU__ENET3__PTP__ENABLE {0} \ + CONFIG.PSU__ENET3__TSU__ENABLE {0} \ + CONFIG.PSU__FPD_SLCR__WDT1__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__FPD_SLCR__WDT1__FREQMHZ {100.000000} \ + CONFIG.PSU__FPD_SLCR__WDT_CLK_SEL__SELECT {APB} \ + CONFIG.PSU__FPGA_PL0_ENABLE {1} \ + CONFIG.PSU__GEM3_COHERENCY {0} \ + CONFIG.PSU__GPIO0_MIO__IO {MIO 0 .. 25} \ + CONFIG.PSU__GPIO0_MIO__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__GPIO1_MIO__IO {MIO 26 .. 51} \ + CONFIG.PSU__GPIO1_MIO__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__GPIO2_MIO__IO {MIO 52 .. 77} \ + CONFIG.PSU__GPIO2_MIO__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__GT__LINK_SPEED {HBR} \ + CONFIG.PSU__GT__PRE_EMPH_LVL_4 {0} \ + CONFIG.PSU__GT__VLT_SWNG_LVL_4 {0} \ + CONFIG.PSU__I2C0__PERIPHERAL__ENABLE {0} \ + CONFIG.PSU__I2C1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__I2C1__PERIPHERAL__IO {MIO 4 .. 5} \ + CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC0_SEL {APB} \ + CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC1_SEL {APB} \ + CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC2_SEL {APB} \ + CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC3_SEL {APB} \ + CONFIG.PSU__IOU_SLCR__TTC0__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC0__FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC1__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC1__FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC2__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC2__FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC3__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__TTC3__FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__WDT0__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__WDT0__FREQMHZ {100.000000} \ + CONFIG.PSU__IOU_SLCR__WDT_CLK_SEL__SELECT {APB} \ + CONFIG.PSU__LPD_SLCR__CSUPMU__ACT_FREQMHZ {100.000000} \ + CONFIG.PSU__LPD_SLCR__CSUPMU__FREQMHZ {100.000000} \ + CONFIG.PSU__MAXIGP0__DATA_WIDTH {128} \ + CONFIG.PSU__MAXIGP1__DATA_WIDTH {128} \ + CONFIG.PSU__MAXIGP2__DATA_WIDTH {32} \ + CONFIG.PSU__OVERRIDE__BASIC_CLOCK {0} \ + CONFIG.PSU__PL_CLK0_BUF {TRUE} \ + CONFIG.PSU__PMU_COHERENCY {0} \ + CONFIG.PSU__PMU__AIBACK__ENABLE {0} \ + CONFIG.PSU__PMU__EMIO_GPI__ENABLE {0} \ + CONFIG.PSU__PMU__EMIO_GPO__ENABLE {0} \ + CONFIG.PSU__PMU__GPI0__ENABLE {1} \ + CONFIG.PSU__PMU__GPI0__IO {MIO 26} \ + CONFIG.PSU__PMU__GPI1__ENABLE {0} \ + CONFIG.PSU__PMU__GPI2__ENABLE {0} \ + CONFIG.PSU__PMU__GPI3__ENABLE {0} \ + CONFIG.PSU__PMU__GPI4__ENABLE {0} \ + CONFIG.PSU__PMU__GPI5__ENABLE {0} \ + CONFIG.PSU__PMU__GPO0__ENABLE {1} \ + CONFIG.PSU__PMU__GPO0__IO {MIO 32} \ + CONFIG.PSU__PMU__GPO1__ENABLE {1} \ + CONFIG.PSU__PMU__GPO1__IO {MIO 33} \ + CONFIG.PSU__PMU__GPO2__ENABLE {1} \ + CONFIG.PSU__PMU__GPO2__IO {MIO 34} \ + CONFIG.PSU__PMU__GPO2__POLARITY {high} \ + CONFIG.PSU__PMU__GPO3__ENABLE {0} \ + CONFIG.PSU__PMU__GPO4__ENABLE {0} \ + CONFIG.PSU__PMU__GPO5__ENABLE {0} \ + CONFIG.PSU__PMU__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__PMU__PLERROR__ENABLE {0} \ + CONFIG.PSU__PRESET_APPLIED {1} \ + CONFIG.PSU__PROTECTION__MASTERS {USB1:NonSecure;1|USB0:NonSecure;1|S_AXI_LPD:NA;0|S_AXI_HPC1_FPD:NA;0|S_AXI_HPC0_FPD:NA;0|S_AXI_HP3_FPD:NA;0|S_AXI_HP2_FPD:NA;0|S_AXI_HP1_FPD:NA;0|S_AXI_HP0_FPD:NA;0|S_AXI_ACP:NA;0|S_AXI_ACE:NA;0|SD1:NonSecure;1|SD0:NonSecure;1|SATA1:NonSecure;0|SATA0:NonSecure;0|RPU1:Secure;1|RPU0:Secure;1|QSPI:NonSecure;0|PMU:NA;1|PCIe:NonSecure;0|NAND:NonSecure;0|LDMA:NonSecure;1|GPU:NonSecure;1|GEM3:NonSecure;0|GEM2:NonSecure;0|GEM1:NonSecure;0|GEM0:NonSecure;0|FDMA:NonSecure;1|DP:NonSecure;1|DAP:NA;1|Coresight:NA;1|CSU:NA;1|APU:NA;1} \ + CONFIG.PSU__PROTECTION__SLAVES {LPD;USB3_1_XHCI;FE300000;FE3FFFFF;1|LPD;USB3_1;FF9E0000;FF9EFFFF;1|LPD;USB3_0_XHCI;FE200000;FE2FFFFF;1|LPD;USB3_0;FF9D0000;FF9DFFFF;1|LPD;UART1;FF010000;FF01FFFF;1|LPD;UART0;FF000000;FF00FFFF;1|LPD;TTC3;FF140000;FF14FFFF;1|LPD;TTC2;FF130000;FF13FFFF;1|LPD;TTC1;FF120000;FF12FFFF;1|LPD;TTC0;FF110000;FF11FFFF;1|FPD;SWDT1;FD4D0000;FD4DFFFF;1|LPD;SWDT0;FF150000;FF15FFFF;1|LPD;SPI1;FF050000;FF05FFFF;1|LPD;SPI0;FF040000;FF04FFFF;1|FPD;SMMU_REG;FD5F0000;FD5FFFFF;1|FPD;SMMU;FD800000;FDFFFFFF;1|FPD;SIOU;FD3D0000;FD3DFFFF;1|FPD;SERDES;FD400000;FD47FFFF;1|LPD;SD1;FF170000;FF17FFFF;1|LPD;SD0;FF160000;FF16FFFF;1|FPD;SATA;FD0C0000;FD0CFFFF;0|LPD;RTC;FFA60000;FFA6FFFF;1|LPD;RSA_CORE;FFCE0000;FFCEFFFF;1|LPD;RPU;FF9A0000;FF9AFFFF;1|FPD;RCPU_GIC;F9000000;F900FFFF;1|LPD;R5_TCM_RAM_GLOBAL;FFE00000;FFE3FFFF;1|LPD;R5_1_Instruction_Cache;FFEC0000;FFECFFFF;1|LPD;R5_1_Data_Cache;FFED0000;FFEDFFFF;1|LPD;R5_1_BTCM_GLOBAL;FFEB0000;FFEBFFFF;1|LPD;R5_1_ATCM_GLOBAL;FFE90000;FFE9FFFF;1|LPD;R5_0_Instruction_Cache;FFE40000;FFE4FFFF;1|LPD;R5_0_Data_Cache;FFE50000;FFE5FFFF;1|LPD;R5_0_BTCM_GLOBAL;FFE20000;FFE2FFFF;1|LPD;R5_0_ATCM_GLOBAL;FFE00000;FFE0FFFF;1|LPD;QSPI_Linear_Address;C0000000;DFFFFFFF;1|LPD;QSPI;FF0F0000;FF0FFFFF;0|LPD;PMU_RAM;FFDC0000;FFDDFFFF;1|LPD;PMU_GLOBAL;FFD80000;FFDBFFFF;1|FPD;PCIE_MAIN;FD0E0000;FD0EFFFF;0|FPD;PCIE_LOW;E0000000;EFFFFFFF;0|FPD;PCIE_HIGH2;8000000000;BFFFFFFFFF;0|FPD;PCIE_HIGH1;600000000;7FFFFFFFF;0|FPD;PCIE_DMA;FD0F0000;FD0FFFFF;0|FPD;PCIE_ATTRIB;FD480000;FD48FFFF;0|LPD;OCM_XMPU_CFG;FFA70000;FFA7FFFF;1|LPD;OCM_SLCR;FF960000;FF96FFFF;1|OCM;OCM;FFFC0000;FFFFFFFF;1|LPD;NAND;FF100000;FF10FFFF;0|LPD;MBISTJTAG;FFCF0000;FFCFFFFF;1|LPD;LPD_XPPU_SINK;FF9C0000;FF9CFFFF;1|LPD;LPD_XPPU;FF980000;FF98FFFF;1|LPD;LPD_SLCR_SECURE;FF4B0000;FF4DFFFF;1|LPD;LPD_SLCR;FF410000;FF4AFFFF;1|LPD;LPD_GPV;FE100000;FE1FFFFF;1|LPD;LPD_DMA_7;FFAF0000;FFAFFFFF;1|LPD;LPD_DMA_6;FFAE0000;FFAEFFFF;1|LPD;LPD_DMA_5;FFAD0000;FFADFFFF;1|LPD;LPD_DMA_4;FFAC0000;FFACFFFF;1|LPD;LPD_DMA_3;FFAB0000;FFABFFFF;1|LPD;LPD_DMA_2;FFAA0000;FFAAFFFF;1|LPD;LPD_DMA_1;FFA90000;FFA9FFFF;1|LPD;LPD_DMA_0;FFA80000;FFA8FFFF;1|LPD;IPI_CTRL;FF380000;FF3FFFFF;1|LPD;IOU_SLCR;FF180000;FF23FFFF;1|LPD;IOU_SECURE_SLCR;FF240000;FF24FFFF;1|LPD;IOU_SCNTRS;FF260000;FF26FFFF;1|LPD;IOU_SCNTR;FF250000;FF25FFFF;1|LPD;IOU_GPV;FE000000;FE0FFFFF;1|LPD;I2C1;FF030000;FF03FFFF;1|LPD;I2C0;FF020000;FF02FFFF;0|FPD;GPU;FD4B0000;FD4BFFFF;1|LPD;GPIO;FF0A0000;FF0AFFFF;1|LPD;GEM3;FF0E0000;FF0EFFFF;0|LPD;GEM2;FF0D0000;FF0DFFFF;0|LPD;GEM1;FF0C0000;FF0CFFFF;0|LPD;GEM0;FF0B0000;FF0BFFFF;0|FPD;FPD_XMPU_SINK;FD4F0000;FD4FFFFF;1|FPD;FPD_XMPU_CFG;FD5D0000;FD5DFFFF;1|FPD;FPD_SLCR_SECURE;FD690000;FD6CFFFF;1|FPD;FPD_SLCR;FD610000;FD68FFFF;1|FPD;FPD_GPV;FD700000;FD7FFFFF;1|FPD;FPD_DMA_CH7;FD570000;FD57FFFF;1|FPD;FPD_DMA_CH6;FD560000;FD56FFFF;1|FPD;FPD_DMA_CH5;FD550000;FD55FFFF;1|FPD;FPD_DMA_CH4;FD540000;FD54FFFF;1|FPD;FPD_DMA_CH3;FD530000;FD53FFFF;1|FPD;FPD_DMA_CH2;FD520000;FD52FFFF;1|FPD;FPD_DMA_CH1;FD510000;FD51FFFF;1|FPD;FPD_DMA_CH0;FD500000;FD50FFFF;1|LPD;EFUSE;FFCC0000;FFCCFFFF;1|FPD;Display Port;FD4A0000;FD4AFFFF;1|FPD;DPDMA;FD4C0000;FD4CFFFF;1|FPD;DDR_XMPU5_CFG;FD050000;FD05FFFF;1|FPD;DDR_XMPU4_CFG;FD040000;FD04FFFF;1|FPD;DDR_XMPU3_CFG;FD030000;FD03FFFF;1|FPD;DDR_XMPU2_CFG;FD020000;FD02FFFF;1|FPD;DDR_XMPU1_CFG;FD010000;FD01FFFF;1|FPD;DDR_XMPU0_CFG;FD000000;FD00FFFF;1|FPD;DDR_QOS_CTRL;FD090000;FD09FFFF;1|FPD;DDR_PHY;FD080000;FD08FFFF;1|DDR;DDR_LOW;0;7FFFFFFF;1|DDR;DDR_HIGH;800000000;800000000;0|FPD;DDDR_CTRL;FD070000;FD070FFF;1|LPD;Coresight;FE800000;FEFFFFFF;1|LPD;CSU_DMA;FFC80000;FFC9FFFF;1|LPD;CSU;FFCA0000;FFCAFFFF;0|LPD;CRL_APB;FF5E0000;FF85FFFF;1|FPD;CRF_APB;FD1A0000;FD2DFFFF;1|FPD;CCI_REG;FD5E0000;FD5EFFFF;1|FPD;CCI_GPV;FD6E0000;FD6EFFFF;1|LPD;CAN1;FF070000;FF07FFFF;0|LPD;CAN0;FF060000;FF06FFFF;0|FPD;APU;FD5C0000;FD5CFFFF;1|LPD;APM_INTC_IOU;FFA20000;FFA2FFFF;1|LPD;APM_FPD_LPD;FFA30000;FFA3FFFF;1|FPD;APM_5;FD490000;FD49FFFF;1|FPD;APM_0;FD0B0000;FD0BFFFF;1|LPD;APM2;FFA10000;FFA1FFFF;1|LPD;APM1;FFA00000;FFA0FFFF;1|LPD;AMS;FFA50000;FFA5FFFF;1|FPD;AFI_5;FD3B0000;FD3BFFFF;1|FPD;AFI_4;FD3A0000;FD3AFFFF;1|FPD;AFI_3;FD390000;FD39FFFF;1|FPD;AFI_2;FD380000;FD38FFFF;1|FPD;AFI_1;FD370000;FD37FFFF;1|FPD;AFI_0;FD360000;FD36FFFF;1|LPD;AFIFM6;FF9B0000;FF9BFFFF;1|FPD;ACPU_GIC;F9000000;F907FFFF;1} \ + CONFIG.PSU__PSS_REF_CLK__FREQMHZ {33.333333} \ + CONFIG.PSU__QSPI_COHERENCY {0} \ + CONFIG.PSU__QSPI__GRP_FBCLK__ENABLE {0} \ + CONFIG.PSU__QSPI__PERIPHERAL__ENABLE {0} \ + CONFIG.PSU__SATA__LANE0__ENABLE {0} \ + CONFIG.PSU__SATA__LANE1__ENABLE {0} \ + CONFIG.PSU__SATA__PERIPHERAL__ENABLE {0} \ + CONFIG.PSU__SD0_COHERENCY {0} \ + CONFIG.PSU__SD0__DATA_TRANSFER_MODE {4Bit} \ + CONFIG.PSU__SD0__GRP_CD__ENABLE {1} \ + CONFIG.PSU__SD0__GRP_CD__IO {MIO 24} \ + CONFIG.PSU__SD0__GRP_POW__ENABLE {0} \ + CONFIG.PSU__SD0__GRP_WP__ENABLE {0} \ + CONFIG.PSU__SD0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__SD0__PERIPHERAL__IO {MIO 13 .. 16 21 22} \ + CONFIG.PSU__SD0__RESET__ENABLE {0} \ + CONFIG.PSU__SD0__SLOT_TYPE {SD 2.0} \ + CONFIG.PSU__SD1_COHERENCY {0} \ + CONFIG.PSU__SD1__DATA_TRANSFER_MODE {4Bit} \ + CONFIG.PSU__SD1__GRP_CD__ENABLE {0} \ + CONFIG.PSU__SD1__GRP_POW__ENABLE {0} \ + CONFIG.PSU__SD1__GRP_WP__ENABLE {0} \ + CONFIG.PSU__SD1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__SD1__PERIPHERAL__IO {MIO 46 .. 51} \ + CONFIG.PSU__SD1__RESET__ENABLE {0} \ + CONFIG.PSU__SD1__SLOT_TYPE {SD 2.0} \ + CONFIG.PSU__SPI0__GRP_SS0__ENABLE {1} \ + CONFIG.PSU__SPI0__GRP_SS0__IO {MIO 41} \ + CONFIG.PSU__SPI0__GRP_SS1__ENABLE {0} \ + CONFIG.PSU__SPI0__GRP_SS2__ENABLE {0} \ + CONFIG.PSU__SPI0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__SPI0__PERIPHERAL__IO {MIO 38 .. 43} \ + CONFIG.PSU__SPI1__GRP_SS0__ENABLE {1} \ + CONFIG.PSU__SPI1__GRP_SS0__IO {MIO 9} \ + CONFIG.PSU__SPI1__GRP_SS1__ENABLE {0} \ + CONFIG.PSU__SPI1__GRP_SS2__ENABLE {0} \ + CONFIG.PSU__SPI1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__SPI1__PERIPHERAL__IO {MIO 6 .. 11} \ + CONFIG.PSU__SWDT0__CLOCK__ENABLE {0} \ + CONFIG.PSU__SWDT0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__SWDT0__RESET__ENABLE {0} \ + CONFIG.PSU__SWDT1__CLOCK__ENABLE {0} \ + CONFIG.PSU__SWDT1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__SWDT1__RESET__ENABLE {0} \ + CONFIG.PSU__TTC0__CLOCK__ENABLE {0} \ + CONFIG.PSU__TTC0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__TTC0__WAVEOUT__ENABLE {0} \ + CONFIG.PSU__TTC1__CLOCK__ENABLE {0} \ + CONFIG.PSU__TTC1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__TTC1__WAVEOUT__ENABLE {0} \ + CONFIG.PSU__TTC2__CLOCK__ENABLE {0} \ + CONFIG.PSU__TTC2__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__TTC2__WAVEOUT__ENABLE {0} \ + CONFIG.PSU__TTC3__CLOCK__ENABLE {0} \ + CONFIG.PSU__TTC3__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__TTC3__WAVEOUT__ENABLE {0} \ + CONFIG.PSU__UART0__BAUD_RATE {115200} \ + CONFIG.PSU__UART0__MODEM__ENABLE {0} \ + CONFIG.PSU__UART0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__UART0__PERIPHERAL__IO {MIO 2 .. 3} \ + CONFIG.PSU__UART1__BAUD_RATE {115200} \ + CONFIG.PSU__UART1__MODEM__ENABLE {0} \ + CONFIG.PSU__UART1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__UART1__PERIPHERAL__IO {MIO 0 .. 1} \ + CONFIG.PSU__USB0_COHERENCY {0} \ + CONFIG.PSU__USB0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__USB0__PERIPHERAL__IO {MIO 52 .. 63} \ + CONFIG.PSU__USB0__REF_CLK_FREQ {26} \ + CONFIG.PSU__USB0__REF_CLK_SEL {Ref Clk0} \ + CONFIG.PSU__USB1_COHERENCY {0} \ + CONFIG.PSU__USB1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__USB1__PERIPHERAL__IO {MIO 64 .. 75} \ + CONFIG.PSU__USB1__REF_CLK_FREQ {26} \ + CONFIG.PSU__USB1__REF_CLK_SEL {Ref Clk0} \ + CONFIG.PSU__USB2_0__EMIO__ENABLE {0} \ + CONFIG.PSU__USB2_1__EMIO__ENABLE {0} \ + CONFIG.PSU__USB3_0__EMIO__ENABLE {0} \ + CONFIG.PSU__USB3_0__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__USB3_0__PERIPHERAL__IO {GT Lane2} \ + CONFIG.PSU__USB3_1__EMIO__ENABLE {0} \ + CONFIG.PSU__USB3_1__PERIPHERAL__ENABLE {1} \ + CONFIG.PSU__USB3_1__PERIPHERAL__IO {GT Lane3} \ + CONFIG.PSU__USE__IRQ0 {1} \ + CONFIG.PSU__USE__M_AXI_GP0 {1} \ + CONFIG.PSU__USE__M_AXI_GP1 {1} \ + CONFIG.PSU__USE__M_AXI_GP2 {0} \ + CONFIG.SUBPRESET1 {Custom} \ + ] $zynq_ultra_ps_e_0 + + # Create interface connections + connect_bd_intf_net -intf_net ps8_0_axi_periph_M00_AXI [get_bd_intf_pins ps8_0_axi_periph/M00_AXI] [get_bd_intf_pins pynqrouter_0/s_axi_AXI4LS] + connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM0_FPD [get_bd_intf_pins ps8_0_axi_periph/S00_AXI] [get_bd_intf_pins zynq_ultra_ps_e_0/M_AXI_HPM0_FPD] + connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM1_FPD [get_bd_intf_pins ps8_0_axi_periph/S01_AXI] [get_bd_intf_pins zynq_ultra_ps_e_0/M_AXI_HPM1_FPD] + + # Create port connections + connect_bd_net -net rst_ps8_0_100M_interconnect_aresetn [get_bd_pins ps8_0_axi_periph/ARESETN] [get_bd_pins rst_ps8_0_100M/interconnect_aresetn] + connect_bd_net -net rst_ps8_0_100M_peripheral_aresetn [get_bd_pins ps8_0_axi_periph/M00_ARESETN] [get_bd_pins ps8_0_axi_periph/S00_ARESETN] [get_bd_pins ps8_0_axi_periph/S01_ARESETN] [get_bd_pins pynqrouter_0/ap_rst_n] [get_bd_pins rst_ps8_0_100M/peripheral_aresetn] + connect_bd_net -net zynq_ultra_ps_e_0_pl_clk0 [get_bd_pins ps8_0_axi_periph/ACLK] [get_bd_pins ps8_0_axi_periph/M00_ACLK] [get_bd_pins ps8_0_axi_periph/S00_ACLK] [get_bd_pins ps8_0_axi_periph/S01_ACLK] [get_bd_pins pynqrouter_0/ap_clk] [get_bd_pins rst_ps8_0_100M/slowest_sync_clk] [get_bd_pins zynq_ultra_ps_e_0/maxihpm0_fpd_aclk] [get_bd_pins zynq_ultra_ps_e_0/maxihpm1_fpd_aclk] [get_bd_pins zynq_ultra_ps_e_0/pl_clk0] + connect_bd_net -net zynq_ultra_ps_e_0_pl_resetn0 [get_bd_pins rst_ps8_0_100M/ext_reset_in] [get_bd_pins zynq_ultra_ps_e_0/pl_resetn0] + + # Create address segments + create_bd_addr_seg -range 0x00040000 -offset 0xA0000000 [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs pynqrouter_0/s_axi_AXI4LS/Reg] SEG_pynqrouter_0_Reg + + + # Restore current instance + current_bd_instance $oldCurInst + + save_bd_design +} +# End of create_root_design() + + +################################################################## +# MAIN FLOW +################################################################## + +create_root_design "" + + diff --git a/hls_2018/router_04_boardstr/router.cpp b/hls_2018/router_04_boardstr/router.cpp index 9c739e2..367b122 100755 --- a/hls_2018/router_04_boardstr/router.cpp +++ b/hls_2018/router_04_boardstr/router.cpp @@ -164,13 +164,15 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], char boardstr_high[BOARDSTR_SIZE], cout << "Rip-up Routing ..." << endl; #endif + ap_uint target = line_num - 1, next_target; + ROUTING: for (ap_uint<16> round = 0; round < 32768 /* = (2048 * 16) */; round++) { #pragma HLS LOOP_TRIPCOUNT min=1 max=32768 // Target line - ap_uint target = round % line_num; - ap_uint next_target = target + 1; + target = round % line_num; + next_target = target + 1; if (next_target == line_num) next_target = 0; #ifdef DEBUG_PRINT @@ -310,7 +312,7 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], char boardstr_high[BOARDSTR_SIZE], else { p2 = s_idx[i+1]; } - if ((ap_uint)(p2 - p1) > 8192){ + if (i == target) { p2 = pointer; } OUTPUT_LINE_PATH: @@ -474,7 +476,7 @@ void pq_push(ap_uint<32> pq_nodes[MAX_PQ], ap_uint<16> priority, ap_uint<16> dat ap_uint p = (*pq_len) >> 1; // parent node PQ_PUSH_LOOP: while (i > 1 && (ap_uint<16>)(pq_nodes[p] & PQ_PRIORITY_MASK) >= priority) { -#pragma HLS LOOP_TRIPCOUNT min=0 max=15 +#pragma HLS LOOP_TRIPCOUNT min=0 max=16 /** Set!: min=0 max=PQ_BIT **/ pq_nodes[i] = pq_nodes[p]; i = p; @@ -497,7 +499,7 @@ void pq_pop(ap_uint<32> pq_nodes[MAX_PQ], ap_uint<16> *ret_priority, ap_uint<16> PQ_POP_LOOP: while (!(i >> (PQ_BIT-1))) { // (2018.08.24) Loop condition fixed -#pragma HLS LOOP_TRIPCOUNT min=1 max=15 +#pragma HLS LOOP_TRIPCOUNT min=1 max=16 /** Set!: min=0 max=PQ_BIT **/ ap_uint c1 = i << 1; // child node(left) ap_uint c2 = c1 + 1; // child node(right) diff --git a/hls_2018/router_04_boardstr/router.hpp b/hls_2018/router_04_boardstr/router.hpp index 3a30542..0c0452b 100755 --- a/hls_2018/router_04_boardstr/router.hpp +++ b/hls_2018/router_04_boardstr/router.hpp @@ -28,13 +28,13 @@ using namespace std; #define BITMASK_Z 7 // 0000 0000 0000 0111 #define MAX_CELLS 41472 // Max #cells (16bit) -#define MAX_LINES 1024 // Max #lines (10bit) +#define MAX_LINES 2048 // Max #lines (11bit) #define MAX_PQ 65536 // Queue size (16bit) -#define MAX_BUFFER 16384 // Line buffer size (14bit) +#define MAX_BUFFER 32768 // Line buffer size (15bit) #define CELL_BIT 16 -#define LINE_BIT 10 +#define LINE_BIT 11 #define PQ_BIT 16 -#define BUFF_BIT 14 +#define BUFF_BIT 15 #define PQ_PRIORITY_WIDTH 16 #define PQ_PRIORITY_MASK 65535 // 0000 0000 0000 0000 1111 1111 1111 1111 diff --git a/hls_2018/router_05/Makefile b/hls_2018/router_05/Makefile new file mode 100755 index 0000000..8f79e7a --- /dev/null +++ b/hls_2018/router_05/Makefile @@ -0,0 +1,20 @@ +TARGET = sim +OBJS = $(CPPS:.cpp=.o) +CPPS = $(wildcard *.cpp) +CXX = g++ +CXXFLAGS = -O3 -Wall -Wno-unknown-pragmas -Wno-unused-label -DSOFTWARE -DCALCTIME + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CXX) -O3 -o $@ $(OBJS) + +run: + python3 ../NLGenerator.py -x 20 -y 20 -z 6 -l 100;\ + python3 ./gen_boardstr.py Q-20x20x5_100_10.txt |\ + ./$(TARGET) - + + +clean: + rm *.o + rm $(TARGET) diff --git a/hls_2018/router_05/Makefile.cygwin b/hls_2018/router_05/Makefile.cygwin new file mode 100755 index 0000000..866fdcd --- /dev/null +++ b/hls_2018/router_05/Makefile.cygwin @@ -0,0 +1,14 @@ +TARGET = sim +OBJS = $(CPPS:.cpp=.o) +CPPS = $(wildcard *.cpp) +CXX = g++ +CXXFLAGS = -O3 -Wall -Wno-unknown-pragmas -Wno-unused-label -DSOFTWARE -DCALCTIME + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CXX) -O3 -Wl,--stack,33554432 -o $@ $(OBJS) + +clean: + rm *.o + rm $(TARGET) diff --git a/hls_2018/router_05/ap_int.h b/hls_2018/router_05/ap_int.h new file mode 100755 index 0000000..b8d9fdc --- /dev/null +++ b/hls_2018/router_05/ap_int.h @@ -0,0 +1,521 @@ +/* + * Copyright 2012 Xilinx, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __AESL_AP_SIM_H__ +#define __AESL_AP_SIM_H__ + +#ifndef __cplusplus +#error C++ is required to include this header file +#else + +#include "etc/ap_int_sim.h" +#include "etc/ap_fixed_sim.h" + +//Forward declaration +template class ap_fixed; +template class ap_ufixed; +template class ap_int; +template class ap_uint; + +//AP_INT +//-------------------------------------------------------- +template +class ap_int : public ap_private<_AP_W, true> { +#ifdef _MSC_VER +#pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ +public: + typedef ap_private<_AP_W, true> Base; + + //Constructor + INLINE ap_int(): Base() {} + template + INLINE ap_int(const volatile ap_int<_AP_W2> &op):Base((const ap_private<_AP_W2,true> &)(op)) {} + + template + INLINE ap_int(const ap_int<_AP_W2> &op):Base((const ap_private<_AP_W2,true> &)(op)) {} + + template + INLINE ap_int(const ap_uint<_AP_W2> &op):Base((const ap_private<_AP_W2,false> &)(op)) {} + + template + INLINE ap_int(const volatile ap_uint<_AP_W2> &op):Base((const ap_private<_AP_W2,false> &)(op)) {} + + template + INLINE ap_int(const ap_range_ref<_AP_W2, _AP_S2>& ref):Base(ref) {} + + template + INLINE ap_int(const ap_bit_ref<_AP_W2, _AP_S2>& ref):Base(ref) {} + + template + INLINE ap_int(const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& ref):Base(ref) {} + + template + INLINE ap_int(const ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_int(const ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_int(const volatile ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_int(const volatile ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_int(const ap_private<_AP_W2, _AP_S2>& op):Base(op) {} + + template + INLINE ap_int(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, + _AP_N2>& op):Base(op) {} + + template + INLINE ap_int(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, + _AP_N2>& op):Base(op) {} + + template + INLINE ap_int(const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op):Base(op.to_ap_private()) {} + +#define CTOR(TYPE) \ + INLINE ap_int(TYPE v):Base(v) {} + CTOR(bool) + CTOR(signed char) + CTOR(unsigned char) + CTOR(short) + CTOR(unsigned short) + CTOR(int) + CTOR(unsigned int) + CTOR(long) + CTOR(unsigned long) + CTOR(unsigned long long) + CTOR(long long) + CTOR(float) + CTOR(double) + CTOR(const char*) + CTOR(const std::string&) +#undef CTOR + INLINE ap_int(const char* str, signed char rd):Base(str, rd) {} + //Assignment + //Another form of "write" + INLINE void operator = (const ap_int<_AP_W>& op2) volatile { + const_cast(this)->operator = (op2); + } + + INLINE void operator = (const volatile ap_int<_AP_W>& op2) volatile { + const_cast(this)->operator = (op2); + } + + INLINE ap_int<_AP_W>& operator = (const volatile ap_int<_AP_W>& op2) { + Base::operator = (const_cast& >(op2)); + return *this; + } + + INLINE ap_int<_AP_W>& operator = (const ap_int<_AP_W>& op2) { + Base::operator = ((const ap_private<_AP_W, true>&)op2); + return *this; + } +}; + +//AP_UINT +//--------------------------------------------------------------- +template +class ap_uint: public ap_private<_AP_W, false> { +#ifdef _MSC_VER +#pragma warning( disable : 4521 4522 ) +#endif +public: + typedef ap_private<_AP_W, false> Base; + //Constructor + INLINE ap_uint(): Base() {} + INLINE ap_uint(const ap_uint<_AP_W>& op) :Base(dynamic_cast&>(op)) {} + INLINE ap_uint(const volatile ap_uint<_AP_W>& op):Base(dynamic_cast&>(op)){} + template + INLINE ap_uint(const volatile ap_uint<_AP_W2> &op):Base((const ap_private<_AP_W2, false>&)(op)) {} + + template + INLINE ap_uint(const ap_uint<_AP_W2> &op) : Base((const ap_private<_AP_W2, false>&)(op)){} + + template + INLINE ap_uint(const ap_int<_AP_W2> &op) : Base((const ap_private<_AP_W2, true>&)(op)) {} + + template + INLINE ap_uint(const volatile ap_int<_AP_W2> &op) : Base((const ap_private<_AP_W2, false>&)(op)) {} + + template + INLINE ap_uint(const ap_range_ref<_AP_W2, _AP_S2>& ref):Base(ref) {} + + template + INLINE ap_uint(const ap_bit_ref<_AP_W2, _AP_S2>& ref):Base(ref) {} + + template + INLINE ap_uint(const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& ref):Base(ref) {} + + template + INLINE ap_uint(const ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_uint(const ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_uint(const volatile ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op.to_ap_private()) {} + + template + INLINE ap_uint(const volatile ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op) + :Base(op) {} + + template + INLINE ap_uint(const ap_private<_AP_W2, _AP_S2>& op):Base(op) {} + + template + INLINE ap_uint(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, + _AP_N2>& op):Base(op) {} + + template + INLINE ap_uint(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, + _AP_N2>& op):Base(op) {} + + template + INLINE ap_uint(const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op):Base(op.to_ap_private()) {} + +#define CTOR(TYPE) \ + INLINE ap_uint(TYPE v):Base(v) {} + CTOR(bool) + CTOR(signed char) + CTOR(unsigned char) + CTOR(short) + CTOR(unsigned short) + CTOR(int) + CTOR(unsigned int) + CTOR(long) + CTOR(unsigned long) + CTOR(unsigned long long) + CTOR(long long) + CTOR(float) + CTOR(double) + CTOR(const char*) + CTOR(const std::string&) +#undef CTOR + INLINE ap_uint(const char* str, signed char rd):Base(str, rd) {} + //Assignment + //Another form of "write" + INLINE void operator = (const ap_uint<_AP_W>& op2) volatile { + Base::operator = (op2); + } + + INLINE void operator = (const volatile ap_uint<_AP_W>& op2) volatile { + Base::operator = (op2); + } + + INLINE ap_uint<_AP_W>& operator = (const volatile ap_uint<_AP_W>& op2) { + Base::operator = (op2); + return *this; + } + + INLINE ap_uint<_AP_W>& operator = (const ap_uint<_AP_W>& op2) { + Base::operator = ((const ap_private<_AP_W, false>&)(op2)); + return *this; + } +}; + +#define ap_bigint ap_int +#define ap_biguint ap_uint + +//AP_FIXED +//--------------------------------------------------------------------- +template +class ap_fixed: public ap_fixed_base<_AP_W, _AP_I, true, _AP_Q, _AP_O, _AP_N> { +#ifdef _MSC_VER +#pragma warning( disable : 4521 4522 ) +#endif +public: + typedef ap_fixed_base<_AP_W, _AP_I, true, _AP_Q, _AP_O, _AP_N> Base; + //Constructor + INLINE ap_fixed():Base() {} + + template + INLINE ap_fixed(const ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, + _AP_N2>& op): Base(op) {} + + template + INLINE ap_fixed(const ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, + _AP_N2>& op): Base(ap_fixed_base<_AP_W2, _AP_I2, + false, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_fixed(const ap_int<_AP_W2>& op): + Base(ap_private<_AP_W2, true>(op)) {} + + template + INLINE ap_fixed(const ap_uint<_AP_W2>& op):Base(ap_private<_AP_W2, false>(op)) {} + + template + INLINE ap_fixed(const volatile ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, + _AP_N2>& op): Base(ap_fixed_base<_AP_W2, _AP_I2, + true, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_fixed(const volatile ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, + _AP_N2>& op): Base(ap_fixed_base<_AP_W2, _AP_I2, + false, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_fixed(const volatile ap_int<_AP_W2>& op): + Base(ap_private<_AP_W2, true>(op)) {} + + template + INLINE ap_fixed(const volatile ap_uint<_AP_W2>& op):Base(op) {} + + template + INLINE ap_fixed(const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op):Base(op) {} + + template + INLINE ap_fixed(const ap_bit_ref<_AP_W2, _AP_S2>& op): + Base(op) {} + + template + INLINE ap_fixed(const ap_range_ref<_AP_W2, _AP_S2>& op): + Base(op) {} + + template + INLINE ap_fixed(const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& op): + Base(op) {} + + template + INLINE ap_fixed(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op): Base(op) {} + + template + INLINE ap_fixed(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op): Base(op) {} + + template + INLINE ap_fixed(const ap_private<_AP_W2, _AP_S2>& op):Base(op) {} + + #define CTOR(TYPE) \ + INLINE ap_fixed(TYPE v):Base(v) {} + CTOR(bool) + CTOR(signed char) + CTOR(unsigned char) + CTOR(short) + CTOR(unsigned short) + CTOR(int) + CTOR(unsigned int) + CTOR(long) + CTOR(unsigned long) + CTOR(unsigned long long) + CTOR(long long) + CTOR(float) + CTOR(double) + CTOR(const char*) + CTOR(const std::string&) +#undef CTOR + INLINE ap_fixed(const char* str, signed char rd):Base(str, rd) {} + + //Assignment + INLINE ap_fixed& operator = (const ap_fixed<_AP_W, _AP_I, + _AP_Q, _AP_O, _AP_N>& op) { + Base::operator = (op); + return *this; + } + + INLINE ap_fixed& operator = (const volatile ap_fixed<_AP_W, _AP_I, + _AP_Q, _AP_O, _AP_N>& op) { + Base::operator = (op); + return *this; + } +}; + +//AP_ UFIXED +//--- ---------------------------------------------------------------- +template +class ap_ufixed : public ap_fixed_base<_AP_W, _AP_I, false, _AP_Q, _AP_O, _AP_N> { +#ifdef _MSC_VER +#pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ +public: + typedef ap_fixed_base<_AP_W, _AP_I, false, _AP_Q, _AP_O, _AP_N> Base; + + //Constructor + INLINE ap_ufixed():Base() {} + + template + INLINE ap_ufixed(const ap_fixed<_AP_W2, _AP_I2, _AP_Q2, + _AP_O2, _AP_N2>& op) : Base(ap_fixed_base<_AP_W2, + _AP_I2, true, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_ufixed(const ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, + _AP_O2, _AP_N2>& op): Base(ap_fixed_base<_AP_W2, _AP_I2, + false, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_ufixed(const ap_int<_AP_W2>& op): + Base((const ap_private<_AP_W2, true>&)(op)) {} + + template + INLINE ap_ufixed(const ap_uint<_AP_W2>& op): + Base((const ap_private<_AP_W2, false>&)(op)) {} + + template + INLINE ap_ufixed(const volatile ap_fixed<_AP_W2, _AP_I2, _AP_Q2, + _AP_O2, _AP_N2>& op) : Base(ap_fixed_base<_AP_W2, + _AP_I2, true, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_ufixed(const volatile ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, + _AP_O2, _AP_N2>& op): Base(ap_fixed_base<_AP_W2, _AP_I2, + false, _AP_Q2, _AP_O2, _AP_N2>(op)) {} + + template + INLINE ap_ufixed(const volatile ap_int<_AP_W2>& op): + Base(ap_private<_AP_W2, true>(op)) {} + + template + INLINE ap_ufixed(const volatile ap_uint<_AP_W2>& op): + Base(ap_private<_AP_W2, false>(op)) {} + + template + INLINE ap_ufixed(const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2>& op):Base(op) {} + + template + INLINE ap_ufixed(const ap_bit_ref<_AP_W2, _AP_S2>& op): + Base(op) {} + + template + INLINE ap_ufixed(const ap_range_ref<_AP_W2, _AP_S2>& op): + Base(op) {} + + template + INLINE ap_ufixed(const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& op): + Base(op) {} + + template + INLINE ap_ufixed(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op): Base(op) {} + + template + INLINE ap_ufixed(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& op): Base(op) {} + + template + INLINE ap_ufixed(const ap_private<_AP_W2, _AP_S2>& op):Base(op) {} + + #define CTOR(TYPE) \ + INLINE ap_ufixed(TYPE v):Base(v) {} + CTOR(bool) + CTOR(signed char) + CTOR(unsigned char) + CTOR(short) + CTOR(unsigned short) + CTOR(int) + CTOR(unsigned int) + CTOR(long) + CTOR(unsigned long) + CTOR(unsigned long long) + CTOR(long long) + CTOR(float) + CTOR(double) + CTOR(const char*) + CTOR(const std::string&) +#undef CTOR + INLINE ap_ufixed(const char* str, signed char rd):Base(str, rd) {} + + //Assignment + INLINE ap_ufixed& operator = (const ap_ufixed<_AP_W, _AP_I, + _AP_Q, _AP_O, _AP_N>& op) { + Base::operator = (op); + return *this; + } + + INLINE ap_ufixed& operator = (const volatile ap_ufixed<_AP_W, _AP_I, + _AP_Q, _AP_O, _AP_N>& op) { + Base::V = const_cast(op); + return *this; + } +}; + +#if defined(SYSTEMC_H) || defined(SYSTEMC_INCLUDED) +template +INLINE void sc_trace(sc_core::sc_trace_file *tf, const ap_int<_AP_W> &op, + const std::string &name) { + if (tf) + tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name); +} + +template +INLINE void sc_trace(sc_core::sc_trace_file *tf, const ap_uint<_AP_W> &op, + const std::string &name) { + if (tf) + tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name); +} + +template +INLINE void sc_trace(sc_core::sc_trace_file *tf, const ap_fixed<_AP_W, _AP_I, _AP_Q, _AP_O, _AP_N >&op, const std::string &name) { + tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name); +} + +template +INLINE void sc_trace(sc_core::sc_trace_file *tf, const ap_ufixed<_AP_W, _AP_I, _AP_Q, _AP_O, _AP_N >&op, const std::string &name) { + tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name); +} +#endif /* #if defined(SYSTEMC_H) || defined(SYSTEMC_INCLUDED) */ +#endif /* #ifndef __cplusplus */ +#endif /* #ifndef __AESL_AP_SIM_H__ */ \ No newline at end of file diff --git a/hls_2018/router_05/etc/ap_fixed_sim.h b/hls_2018/router_05/etc/ap_fixed_sim.h new file mode 100755 index 0000000..5be571d --- /dev/null +++ b/hls_2018/router_05/etc/ap_fixed_sim.h @@ -0,0 +1,2451 @@ +/* + * Copyright 2012 Xilinx, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __AESL_GCC_AP_FIXED_H__ +#define __AESL_GCC_AP_FIXED_H__ + +#ifndef __cplusplus + #error C++ is required to include this header file +#endif /* #ifndef __cplusplus */ + + +#include +#ifndef __AESL_APDT_IN_SCFLOW__ + #include "etc/ap_int_sim.h" +#else + #include "../etc/ap_private.h" +#endif /* #ifndef __AESL_APDT_IN_SCFLOW__ */ + +#define FLOAT_MAN 23 +#define FLOAT_EXP 8 +#define DOUBLE_MAN 52 +#define DOUBLE_EXP 11 +// #define DOUBLE_MAN_MASK (~0ULL >> (64-DOUBLE_MAN-2)) +#define DOUBLE_MAN_MASK 0x3fffffffffffffULL +#define BIAS(e) ((1ULL<<(e-1))-1) +#define FLOAT_BIAS BIAS(FLOAT_EXP) +#define DOUBLE_BIAS BIAS(DOUBLE_EXP) + +/// Forward declaration. +template struct ap_fixed_base; + +///Proxy class, which allows bit selection to be used as both rvalue(for reading) and +//lvalue(for writing) +template +struct af_bit_ref { +#ifdef _MSC_VER + #pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ + ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& d_bv; + int d_index; +public: + INLINE af_bit_ref(const af_bit_ref<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& ref): + d_bv(ref.d_bv), d_index(ref.d_index) {} + + INLINE af_bit_ref(ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>* bv, int index=0): + d_bv(*bv),d_index(index) {} + + INLINE operator bool() const { + return d_bv.V[d_index]; + } + + INLINE af_bit_ref& operator=(unsigned long long val) { + if (val) + d_bv.V.set(d_index); + else + d_bv.V.clear(d_index); + return *this; + } + + template + INLINE af_bit_ref& operator =(const ap_private<_AP_W2,_AP_S2>& val) { + return operator=(val!=0); + } + + INLINE af_bit_ref& operator =(const af_bit_ref<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& val) { + return operator=((unsigned long long)(bool)val); + } + + template + INLINE af_bit_ref operator=(const af_bit_ref<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& val) { + return operator=((unsigned long long)(bool)val); + } + + template + INLINE af_bit_ref& operator = ( const ap_bit_ref<_AP_W2, _AP_S2> &val) { + return operator =((unsigned long long) (bool) val); + } + + template + INLINE af_bit_ref& operator = ( const ap_range_ref<_AP_W2,_AP_S2>& val) { + return operator =((const ap_private<_AP_W2, false>) val); + } + + template + INLINE af_bit_ref& operator= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=((const ap_private<_AP_W2, false>)(val)); + } + + template + INLINE af_bit_ref& operator= (const ap_concat_ref<_AP_W2, _AP_T3, _AP_W3, _AP_T3>& val) { + return operator=((const ap_private<_AP_W2 + _AP_W3, false>)(val)); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& op) { + return ap_concat_ref<1, af_bit_ref, _AP_W2, + ap_private<_AP_W2, _AP_S2> >(*this, op); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (const ap_bit_ref<_AP_W2, _AP_S2> &op) { + return ap_concat_ref<1, af_bit_ref, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (const ap_range_ref<_AP_W2, _AP_S2> &op) { + return ap_concat_ref<1, af_bit_ref, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, _AP_W2 + _AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &op) { + return ap_concat_ref<1, af_bit_ref, _AP_W2 + _AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, _AP_W2, + af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &op) { + return ap_concat_ref<1, af_bit_ref, _AP_W2, + af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, + _AP_N2> >(*this, const_cast& >(op)); + } + + template + INLINE ap_concat_ref<1, af_bit_ref, 1, + af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &op) { + return ap_concat_ref<1, af_bit_ref, 1, + af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(op)); + } + + template + INLINE bool operator == (const af_bit_ref<_AP_W2, _AP_I2, + _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op) { + return get() == op.get(); + } + + template + INLINE bool operator != (const af_bit_ref<_AP_W2, _AP_I2, + _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op) { + return get() != op.get(); + } + + INLINE bool operator ~ () const { + bool bit = (d_bv.V)[d_index]; + return bit ? false : true; + } + + INLINE int length() const { + return 1; + } + + INLINE bool get() { + return d_bv.V[d_index]; + } + + INLINE bool get() const { + return d_bv.V[d_index]; + } + + INLINE std::string to_string() const { + return d_bv.V[d_index] ? "1" : "0"; + } +}; + +///Range(slice) reference +//------------------------------------------------------------ +template +struct af_range_ref { +#ifdef _MSC_VER + #pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ + ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &d_bv; + int l_index; + int h_index; + +public: + INLINE af_range_ref(const af_range_ref<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& ref): + d_bv(ref.d_bv), l_index(ref.l_index), h_index(ref.h_index) {} + + INLINE af_range_ref(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>* bv, int h, int l): + d_bv(*bv),l_index(l),h_index(h) { + //if (h < l) + // fprintf(stderr, + //"Warning! The bits selected will be returned in reverse order\n"); + } + + INLINE operator ap_private<_AP_W, false> () const { + if (h_index >= l_index) { + ap_private<_AP_W, false> val(d_bv.V); + ap_private<_AP_W,false> mask(-1); + mask>>=_AP_W-(h_index-l_index+1); + val>>=l_index; + return val&=mask; + } else { + ap_private<_AP_W, false> val = 0; + for (int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + if ((d_bv.V)[j]) val.set(i); + return val; + } + } + + INLINE operator unsigned long long() const { + return get().to_uint64(); + } + + template + INLINE af_range_ref& operator =(const ap_private<_AP_W2,_AP_S2>& val) { + ap_private<_AP_W, false> vval= ap_private<_AP_W, false>(val); + if (l_index > h_index) { + for (int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + vval[i]? d_bv.V.set(j):d_bv.V.clear(j); + } else { + ap_private<_AP_W,false> mask(-1); + if (l_index>0) { + mask<<=l_index; + vval<<=l_index; + } + if (h_index<_AP_W-1) { + ap_private<_AP_W,false> mask2(-1); + mask2>>=_AP_W-h_index-1; + mask&=mask2; + vval&=mask2; + } + mask.flip(); + d_bv.V &= mask; + d_bv.V |= vval; + } + return *this; + } + + INLINE af_range_ref& operator = (unsigned long long val) { + const ap_private<_AP_W, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE af_range_ref& operator = + (const ap_concat_ref <_AP_W3, _AP_T3, _AP_W4, _AP_T4>& val) { + const ap_private<_AP_W, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE af_range_ref& operator =(const ap_bit_ref<_AP_W3, _AP_S3>& val) { + const ap_private<_AP_W, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE af_range_ref& operator =(const ap_range_ref<_AP_W3,_AP_S3>& val) { + const ap_private<_AP_W, false> tmpVal(val); + return operator =(tmpVal); + } + + template + INLINE af_range_ref& operator= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& val) { + const ap_private<_AP_W2, false> tmp= val.get(); + return operator = (tmp); + } + + INLINE af_range_ref& operator= (const af_range_ref<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& val) { + const ap_private<_AP_W, false> tmp= val.get(); + return operator = (tmp); + } + + template + INLINE af_range_ref& operator= (const ap_fixed_base<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=(val.to_ap_private()); + } + + template + INLINE bool operator == (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs==rhs; + } + + template + INLINE bool operator != (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs!=rhs; + } + + template + INLINE bool operator > (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>rhs; + } + + template + INLINE bool operator >= (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>=rhs; + } + + template + INLINE bool operator < (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs + INLINE bool operator <= (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs<=rhs; + } + + template + INLINE bool operator == (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs==rhs; + } + + template + INLINE bool operator != (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs!=rhs; + } + + template + INLINE bool operator > (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>rhs; + } + + template + INLINE bool operator >= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>=rhs; + } + + template + INLINE bool operator < (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs + INLINE bool operator <= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op2) { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs<=rhs; + } + + template + INLINE void set(const ap_private<_AP_W2,false>& val) { + ap_private<_AP_W,_AP_S> vval=val; + if (l_index>h_index) { + for (int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + vval[i]? d_bv.V.set(j):d_bv.V.clear(j); + } else { + ap_private<_AP_W,_AP_S> mask(-1); + if (l_index>0) { + ap_private<_AP_W,false> mask1(-1); + mask1>>=_AP_W-l_index; + mask1.flip(); + mask=mask1; + //vval&=mask1; + vval<<=l_index; + } + if (h_index<_AP_W-1) { + ap_private<_AP_W,false> mask2(-1); + mask2<<=h_index+1; + mask2.flip(); + mask&=mask2; + vval&=mask2; + } + mask.flip(); + d_bv&=mask; + d_bv|=vval; + } + + } + + INLINE ap_private<_AP_W,false> get() const { + if (h_index val(0); + for (int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + if ((d_bv.V)[j]) val.set(i); + return val; + } else { + ap_private<_AP_W, false> val = ap_private<_AP_W,false>(d_bv.V); + val>>= l_index; + if (h_index<_AP_W-1) + { + ap_private<_AP_W,false> mask(-1); + mask>>=_AP_W-(h_index-l_index+1); + val&=mask; + } + return val; + } + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& op) { + return ap_concat_ref<_AP_W, af_range_ref, _AP_W2, + ap_private<_AP_W2, _AP_S2> >(*this, op); + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (const ap_bit_ref<_AP_W2, _AP_S2> &op) { + return ap_concat_ref<_AP_W, af_range_ref, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (const ap_range_ref<_AP_W2, _AP_S2> &op) { + return ap_concat_ref<_AP_W, af_range_ref, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, _AP_W2 + _AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &op) { + return ap_concat_ref<_AP_W, af_range_ref, _AP_W2 + _AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(*this, + const_cast& >(op)); + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, _AP_W2, + af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &op) { + return ap_concat_ref<_AP_W, af_range_ref, _AP_W2, + af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& > (op)); + } + + template + INLINE ap_concat_ref<_AP_W, af_range_ref, 1, + af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &op) { + return ap_concat_ref<_AP_W, af_range_ref, 1, + af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(op)); + } + + INLINE int length() const { + return h_index>=l_index?h_index-l_index+1:l_index-h_index+1; + } + + INLINE int to_int() const { + ap_private<_AP_W,false> val=get(); + return val.to_int(); + } + + INLINE unsigned int to_uint() const { + ap_private<_AP_W,false> val=get(); + return val.to_uint(); + } + + INLINE long to_long() const { + ap_private<_AP_W,false> val=get(); + return val.to_long(); + } + + INLINE unsigned long to_ulong() const { + ap_private<_AP_W,false> val=get(); + return val.to_ulong(); + } + + INLINE ap_slong to_int64() const { + ap_private<_AP_W,false> val=get(); + return val.to_int64(); + } + + INLINE ap_ulong to_uint64() const { + ap_private<_AP_W,false> val=get(); + return val.to_uint64(); + } + + INLINE std::string to_string(uint8_t radix) const { + return get().to_string(radix); + } + +}; + +//----------------------------------------------------------------------------- +///ap_fixed_base: AutoPilot fixed point +//----------------------------------------------------------------------------- +template +struct ap_fixed_base { +#ifdef _MSC_VER + #pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ +public: + template friend struct +ap_fixed_base; + template friend struct +af_bit_ref; + + INLINE void overflow_adjust(bool underflow, bool overflow, + bool lD, bool sign) { + if (!overflow && !underflow) return; + switch (_AP_O) { + case AP_WRAP: + if (_AP_N == 0) + return; + if (_AP_S) { + //signed SC_WRAP + //n_bits == 1; + if (_AP_N > 1) { + ap_private<_AP_W, _AP_S> mask(-1); + if (_AP_N >= _AP_W) mask = 0; + else mask.lshr(_AP_N); + if (sign) + V &= mask; + else + V |= ~mask; + } + sign ? V.set(_AP_W - 1) : V.clear(_AP_W - 1); + } else { + //unsigned SC_WRAP + ap_private<_AP_W, _AP_S> mask(-1); + if (_AP_N >= _AP_W) mask = 0; + else mask.lshr(_AP_N); + mask.flip(); + V |= mask; + } + break; + case AP_SAT_ZERO: + V.clear(); + break; + case AP_WRAP_SM: + { + bool Ro = ap_private_ops::get<_AP_W, _AP_S, _AP_W -1>(V); // V[_AP_W -1]; + if (_AP_N == 0) { + if (lD != Ro) { + V.flip(); + lD ? ap_private_ops::set<_AP_W, _AP_S, _AP_W - 1>(V) : + ap_private_ops::clear<_AP_W, _AP_S, _AP_W - 1>(V); + } + } else { + if (_AP_N == 1 && sign != Ro) { + V.flip(); + } else if (_AP_N > 1) { + bool lNo = ap_private_ops::get<_AP_W, _AP_S, _AP_W - _AP_N> (V); // V[_AP_W - _AP_N]; + if (lNo == sign) + V.flip(); + ap_private<_AP_W, false> mask(-1); + if (_AP_N >= _AP_W) mask = 0; + else mask.lshr(_AP_N); + if (sign) + V &= mask; + else + V |= mask.flip(); + sign ? ap_private_ops::set<_AP_W, _AP_S, _AP_W - 1>(V) : ap_private_ops::clear<_AP_W, _AP_S, _AP_W - 1>(V); + } + } + } + break; + default: + if (_AP_S) { + if (overflow) { + V.set(); ap_private_ops::clear<_AP_W, _AP_S, _AP_W-1>(V); + } else if (underflow) { + V.clear(); + ap_private_ops::set<_AP_W, _AP_S, _AP_W-1>(V); + if (_AP_O == AP_SAT_SYM) + ap_private_ops::set<_AP_W, _AP_S, 0>(V); + } + } else { + if (overflow) + V.set(); + else if (underflow) + V.clear(); + } + } + } + + INLINE bool quantization_adjust(bool qb, bool r, bool s) { + bool carry=ap_private_ops::get<_AP_W, _AP_S, _AP_W-1>(V); + switch (_AP_Q) { + case AP_TRN: + return false; + case AP_RND_ZERO: + qb &= s || r; + break; + case AP_RND_MIN_INF: + qb &= r; + break; + case AP_RND_INF: + qb &= !s || r; + break; + case AP_RND_CONV: + qb &= ap_private_ops::get<_AP_W, _AP_S, 0>(V) || r; + break; + case AP_TRN_ZERO: + qb = s && ( qb || r ); + break; + default:; + + } + if (qb) ++V; + //only when old V[_AP_W-1]==1 && new V[_AP_W-1]==0 + return carry && !(ap_private_ops::get<_AP_W, _AP_S, _AP_W-1>(V)); //(!V[_AP_W-1]); + } + + template + struct RType { + enum { + _AP_F=_AP_W-_AP_I, + F2=_AP_W2-_AP_I2, + mult_w = _AP_W+_AP_W2, + mult_i = _AP_I+_AP_I2, + mult_s = _AP_S||_AP_S2, + plus_w = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2))+1+AP_MAX(_AP_F,F2), + plus_i = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2))+1, + plus_s = _AP_S||_AP_S2, + minus_w = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2))+1+AP_MAX(_AP_F,F2), + minus_i = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2))+1, + minus_s = true, +#ifndef __SC_COMPATIBLE__ + div_w = _AP_W + AP_MAX(_AP_W2 - _AP_I2, 0) + _AP_S2, +#else + div_w = _AP_W + AP_MAX(_AP_W2 - _AP_I2, 0) + _AP_S2 + AP_MAX(_AP_I2, 0), +#endif /* #ifndef __SC_COMPATIBLE__ */ + div_i = _AP_I + (_AP_W2-_AP_I2) + _AP_S2, + div_s = _AP_S||_AP_S2, + logic_w = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2))+AP_MAX(_AP_F,F2), + logic_i = AP_MAX(_AP_I+(_AP_S2&&!_AP_S),_AP_I2+(_AP_S&&!_AP_S2)), + logic_s = _AP_S||_AP_S2 + }; + + typedef ap_fixed_base mult; + typedef ap_fixed_base plus; + typedef ap_fixed_base minus; + typedef ap_fixed_base logic; + typedef ap_fixed_base div; + typedef ap_fixed_base<_AP_W, _AP_I, _AP_S> arg1; + }; + INLINE void report() { +#if 0 + if (_AP_W > 1024 && _AP_W <= 4096) { + fprintf(stderr, "[W] W=%d is out of bound (1<=W<=1024):" + " for synthesis, please define macro AP_INT_TYPE_EXT(N) to" + " extend the valid range.\n", _AP_W); + } else +#endif /* #if 0 */ + if (_AP_W > MAX_MODE(AP_INT_MAX_W) * 1024) { + fprintf(stderr, "[E] ap_%sfixed<%d, ...>: Bitwidth exceeds the " + "default max value %d. Please use macro " + "AP_INT_MAX_W to set a larger max value.\n", + _AP_S?"":"u", _AP_W, + MAX_MODE(AP_INT_MAX_W) * 1024); + exit(1); + } + } + + /// Constructors. + // ------------------------------------------------------------------------- +#if 0 + #ifdef __SC_COMPATIBLE__ + INLINE ap_fixed_base():V(uint32_t(_AP_W), uint64_t(0)) {} + #else + INLINE ap_fixed_base():V(uint32_t(_AP_W)) {} + #endif /* #ifdef __SC_COMPATIBLE__ */ +#else + INLINE ap_fixed_base():V(0) {} +#endif /* #if 0 */ + // INLINE ap_fixed_base():V() {} + // INLINE explicit ap_fixed_base(const ap_private<_AP_W+_AP_I, _AP_S>& _V):V(_V) {} + INLINE ap_fixed_base(const ap_fixed_base& op):V(op.V) {} + template + INLINE ap_fixed_base(const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op):V(0) { + enum {N2=_AP_W2,_AP_F=_AP_W-_AP_I,F2=_AP_W2-_AP_I2,QUAN_INC=F2>_AP_F && !(_AP_Q==AP_TRN || + (_AP_Q==AP_TRN_ZERO && !_AP_S2))}; + if (!op) return; + bool carry=false; + //handle quantization + enum { sh_amt =(F2>_AP_F)?F2-_AP_F:_AP_F-F2}; + const ap_private<_AP_W2, _AP_S2>& val = op.V; + bool neg_src=val.isNegative(); + if (F2==_AP_F) + V=val; + + else if (F2>_AP_F) { + if (sh_amt >= _AP_W2) + V = neg_src ? -1 : 0; + else + V = _AP_S2?val.ashr(sh_amt):val.lshr(sh_amt); + if (_AP_Q!=AP_TRN && !(_AP_Q==AP_TRN_ZERO && !_AP_S2)) { + bool qb = false; + if (F2-_AP_F>_AP_W2) + qb = neg_src; + else + qb = ap_private_ops::get<_AP_W2, _AP_S2, F2-_AP_F-1>(val); + + bool r=false; + enum { pos3 = F2-_AP_F-2}; + if (pos3>=_AP_W2-1) + r=val!=0; + else if (pos3>=0) + r = (val<<(_AP_W2-1-pos3))!=0; + carry = quantization_adjust(qb,r,neg_src); + } + } else { //no quantization + if (sh_amt < _AP_W) { + V=val; + V <<= sh_amt; + } + } + //hanle overflow/underflow + if ((_AP_O!=AP_WRAP || _AP_N != 0) && + ((!_AP_S && _AP_S2) || _AP_I-_AP_S < + _AP_I2 - _AP_S2 + (QUAN_INC|| (_AP_S2 && + _AP_O==AP_SAT_SYM)))) {//saturation + bool deleted_zeros = _AP_S2?true:!carry, + deleted_ones = true; + bool lD=(_AP_I2>_AP_I && _AP_W2-_AP_I2+_AP_I>=0) && + ap_private_ops::get<_AP_W2, _AP_S2, _AP_W2-_AP_I2+_AP_I>(val); + enum { pos1=F2-_AP_F+_AP_W, pos2=F2-_AP_F+_AP_W+1}; + if (pos1 < _AP_W2) { + bool Range1_all_ones= true; + bool Range1_all_zeros= true; + if (pos1 >= 0) { + enum { __W = (_AP_W2-pos1) > 0 ? (_AP_W2-pos1) : 1 }; + const ap_private<__W, _AP_S2> Range1=ap_private<__W, _AP_S2>(val.lshr(pos1)); + Range1_all_ones=Range1.isAllOnesValue(); + Range1_all_zeros=Range1.isMinValue(); + } else { + Range1_all_ones=false; + Range1_all_zeros=val.isMinValue(); + } + bool Range2_all_ones=true; + if (pos2<_AP_W2 && pos2>=0) { + enum { __W = (_AP_W2-pos2)>0 ? (_AP_W2-pos2) : 1}; + ap_private<__W, true> Range2=ap_private<__W, true>(val.lshr(pos2)); + Range2_all_ones=Range2.isAllOnesValue(); + } else if (pos2<0) + Range2_all_ones=false; + + deleted_zeros=deleted_zeros && (carry?Range1_all_ones:Range1_all_zeros); + deleted_ones=carry?Range2_all_ones&&(F2-_AP_F+_AP_W<0||!lD) + :Range1_all_ones; + neg_src= neg_src&&!(carry && Range1_all_ones); + } else + neg_src = neg_src && V[_AP_W-1]; + + bool neg_trg= V.isNegative(); + bool overflow=(neg_trg||!deleted_zeros) && !val.isNegative(); + bool underflow=(!neg_trg||!deleted_ones)&&neg_src; + //printf("neg_src = %d, neg_trg = %d, deleted_zeros = %d, + // deleted_ones = %d, overflow = %d, underflow = %d\n", + // neg_src, neg_trg, deleted_zeros, deleted_ones, + // overflow, underflow); + if (_AP_O==AP_SAT_SYM && _AP_S2 && _AP_S) + underflow |= neg_src && (_AP_W>1?V.isMinSignedValue():true); + overflow_adjust(underflow, overflow, lD, neg_src); + } + report(); + } + + template + INLINE ap_fixed_base(const volatile ap_fixed_base<_AP_W2,_AP_I2, + _AP_S2,_AP_Q2,_AP_O2, _AP_N2> &op) : V(op.V) { + *this = const_cast&>(op); + } + + template + INLINE ap_fixed_base(const ap_private<_AP_W2,_AP_S2>& op) { + ap_fixed_base<_AP_W2,_AP_W2,_AP_S2> f_op; + f_op.V=op; + *this = f_op; + } + + INLINE ap_fixed_base(bool b) { + *this=(ap_private<1,false>)b; + report(); + } + + INLINE ap_fixed_base(char b) { + *this=(ap_private<8,false>)b; + report(); + } + + INLINE ap_fixed_base(signed char b) { + *this=(ap_private<8,true>)b; + report(); + } + + INLINE ap_fixed_base(unsigned char b) { + *this=(ap_private<8,false>)b; + report(); + } + + INLINE ap_fixed_base(signed short b) { + *this=(ap_private<16,true>)b; + report(); + } + + INLINE ap_fixed_base(unsigned short b) { + *this=(ap_private<16,false>)b; + report(); + } + + INLINE ap_fixed_base(signed int b) { + *this=(ap_private<32,true>)b; + report(); + } + + INLINE ap_fixed_base(unsigned int b) { + *this=(ap_private<32,false>)b; + report(); + } +# if defined __x86_64__ + INLINE ap_fixed_base(signed long b) { + *this=(ap_private<64,true>)b; + report(); + } + + INLINE ap_fixed_base(unsigned long b) { + *this=(ap_private<64,false>)b; + report(); + } +# else + INLINE ap_fixed_base(signed long b) { + *this=(ap_private<32,true>)b; + report(); + } + + INLINE ap_fixed_base(unsigned long b) { + *this=(ap_private<32,false>)b; + report(); + } +# endif + + INLINE ap_fixed_base(ap_slong b) { + *this=(ap_private<64,true>)b; + report(); + } + + INLINE ap_fixed_base(ap_ulong b) { + *this=(ap_private<64,false>)b; + report(); + } + +#if 1 + INLINE ap_fixed_base(const char* val):V(0) { + ap_private<_AP_W, _AP_S> Tmp(val); + V = Tmp; + } + + INLINE ap_fixed_base(const char* val, signed char rd): V(0) { + ap_private<_AP_W, _AP_S> Tmp(val, rd); + V = Tmp; + } + +#endif + + INLINE ap_fixed_base(const std::string& val) { + ap_private<_AP_W, _AP_S> Tmp(val, 2); + V = Tmp; + report(); + } + + template + INLINE ap_fixed_base(const ap_bit_ref<_AP_W2, _AP_S2>& op) { + *this = ((bool)op); + report(); + } + + template + INLINE ap_fixed_base(const ap_range_ref<_AP_W2, _AP_S2>& op) { + *this = ap_private<_AP_W2, _AP_S2>(op); + report(); + } + + template + INLINE ap_fixed_base(const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& op) { + *this = ((const ap_private<_AP_W2 + _AP_W3, false>&)(op)); + report(); + } + + template + INLINE ap_fixed_base(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op) { + *this = (bool(op)); + report(); + } + + template + INLINE ap_fixed_base(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op) { + *this = (ap_private<_AP_W2, false>(op)); + report(); + } + + //helper function + INLINE unsigned long long doubleToRawBits(double pf)const { + union { + unsigned long long __L; + double __D; + }LD; + LD.__D=pf; + return LD.__L; + } + + + INLINE double rawBitsToDouble(unsigned long long pi) const { + union { + unsigned long long __L; + double __D; + }LD; + LD.__L=pi; + return LD.__D; + } + + INLINE float rawBitsToFloat(uint32_t pi) const { + union { + uint32_t __L; + float __D; + }LD; + LD.__L = pi; + return LD.__D; + } + + INLINE ap_fixed_base(double d):V(0) { + if (!d) return; + const bool isneg=d<0; + + const uint64_t ireg=doubleToRawBits(isneg?-d:d); + if ((ireg&0x7fffffffffffffffULL)!=0) { + const int32_t exp=(((ireg)>>DOUBLE_MAN)&0x07ff)-DOUBLE_BIAS; + ap_private man = ireg & DOUBLE_MAN_MASK; + man.clear(DOUBLE_MAN+1); + man.set(DOUBLE_MAN); + if (isneg) { + man.flip(); + man++; + } + + enum {_AP_S2=true, _AP_W2=DOUBLE_MAN+2,_AP_F=_AP_W -_AP_I }; + const int _AP_I2=exp+2; + const int F2=_AP_W2-_AP_I2; + const bool QUAN_INC=F2>_AP_F && !(_AP_Q==AP_TRN || (_AP_Q==AP_TRN_ZERO && + !_AP_S2)); + bool carry=false; + //handle quantization + const unsigned sh_amt=abs(F2-_AP_F); // sh_amt = F2>_AP_F ? F2 -_AP_F : _AP_F-F2; + if (F2==_AP_F ) + V=man; + else if (F2>_AP_F) { + if (sh_amt >= DOUBLE_MAN+2) + V=isneg?-1:0; + else + V=(man>>sh_amt) | ((man & 1ULL<<(DOUBLE_MAN+1)) ? (DOUBLE_MAN_MASK>>(DOUBLE_MAN+2-sh_amt) <<(DOUBLE_MAN+2-sh_amt)):0); + + if (_AP_Q!=AP_TRN && !(_AP_Q==AP_TRN_ZERO && !_AP_S2)) { + const bool qb=((F2-_AP_F > DOUBLE_MAN+2) ? isneg : (man & (1ULL<<(F2-_AP_F-1))) != 0); + const int pos3=F2-_AP_F-2; + const bool r = (pos3>= 0) ? (man << AP_MAX(0, _AP_W2-pos3-1)& DOUBLE_MAN_MASK)!=0 : false; + carry = quantization_adjust(qb,r,isneg); + } + } + else { //no quantization + // V=man; + if (sh_amt < _AP_W) { + V = man; + V <<= sh_amt; + } + } + //handle overflow/underflow + if ((_AP_O != AP_WRAP || _AP_N != 0) && + ((!_AP_S && _AP_S2) || _AP_I-_AP_S < + _AP_I2-_AP_S2+(QUAN_INC|| (_AP_S2 && + _AP_O==AP_SAT_SYM)) )) {// saturation + bool deleted_zeros = _AP_S2?true:!carry, + deleted_ones = true; + bool neg_src; + const bool lD=(_AP_I2>_AP_I) && (_AP_W2-_AP_I2+_AP_I>=0) && (man & (1ULL <<(DOUBLE_MAN+2-_AP_I2+_AP_I))); + int pos1=F2+_AP_W-_AP_F; + if (pos1 < _AP_W2) { + int pos2=pos1+1; + bool Range1_all_ones=true; + bool Range1_all_zeros=true; + if (pos1>=0) { + ap_private<_AP_W,_AP_S> Range1= + ap_private<_AP_W,_AP_S>((man >> pos1) | ((1ULL<<(DOUBLE_MAN+1)&man) ? (DOUBLE_MAN_MASK >> (DOUBLE_MAN+2-pos1) <<(DOUBLE_MAN+2-pos1)):0)); + Range1_all_ones = Range1.isAllOnesValue(); // Range1.isAllOnesValue(); + Range1_all_zeros = Range1.isMinValue(); // Range1.isMinValue(); + } else { + Range1_all_ones=false; + Range1_all_zeros = man==0; // man.isMinValue(); + } + bool Range2_all_ones=true; + if (pos2<_AP_W2 && pos2>=0) { + ap_private<_AP_W, _AP_S> Range2= + ap_private<_AP_W, _AP_S>((man >> pos2) | ((1ULL<<(DOUBLE_MAN+1)&man) ? (DOUBLE_MAN_MASK >> (DOUBLE_MAN+2-pos2) <<(DOUBLE_MAN+2-pos2)):0)); + Range2_all_ones=Range2.isAllOnesValue(); // Range2.isAllOnesValue(); + } else if (pos2<0) + Range2_all_ones=false; + deleted_zeros=deleted_zeros && (carry?Range1_all_ones:Range1_all_zeros); + deleted_ones=carry?Range2_all_ones&&(F2-_AP_F+_AP_W<0||!lD) : Range1_all_ones; + neg_src=isneg&&!(carry&Range1_all_ones); + } else + neg_src = isneg && V[_AP_W -1]; + + const bool neg_trg=V.isNegative(); + const bool overflow=(neg_trg||!deleted_zeros) && !isneg; + bool underflow=(!neg_trg||!deleted_ones)&&neg_src; + //printf("neg_src = %d, neg_trg = %d, deleted_zeros = %d, + // deleted_ones = %d, overflow = %d, underflow = %d\n", + // neg_src, neg_trg, deleted_zeros, deleted_ones, + // overflow, underflow); + if (_AP_O==AP_SAT_SYM && _AP_S2 && _AP_S) + underflow |= neg_src && (_AP_W>1?V.isMinSignedValue():true); + overflow_adjust(underflow,overflow,lD, neg_src); + } + } + report(); + } + + + ///assign operators + //------------------------------------------------------------------------- + + INLINE volatile ap_fixed_base& operator=(const ap_fixed_base<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& op) volatile { + V = op.V; + return *this; + } + + INLINE ap_fixed_base& operator=(const ap_fixed_base<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& op) { + V = op.V; + return *this; + } + + INLINE volatile ap_fixed_base& operator=(const volatile ap_fixed_base<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& op) volatile { + V = op.V; + return *this; + } + + INLINE ap_fixed_base& operator=(const volatile ap_fixed_base<_AP_W, _AP_I, _AP_S, + _AP_Q, _AP_O, _AP_N>& op) { + V = op.V; + return *this; + } + + // Set this ap_fixed_base with a bits string. That means the ssdm_int::V + // inside this ap_fixed_base is assigned by bv. + // Note the input parameter should be a fixed-point formatted bit string. + INLINE ap_fixed_base& setBits(unsigned long long bv) { + V=bv; + return *this; + } + + // Return a ap_fixed_base object whose ssdm_int::V is assigned by bv. + // Note the input parameter should be a fixed-point formatted bit string. + static INLINE ap_fixed_base bitsToFixed(unsigned long long bv) { + ap_fixed_base Tmp=bv; + return Tmp; + } + + // Explicit conversion functions to ap_private that captures + // all integer bits (bits are truncated) + INLINE ap_private + to_ap_private(bool Cnative = true) const { + ap_private ret = ap_private ((_AP_I >= 1) ? (_AP_S==true ? V.ashr(AP_MAX(0,_AP_W - _AP_I)) : V.lshr(AP_MAX(0,_AP_W - _AP_I))) : ap_private<_AP_W, _AP_S>(0)); + + if (Cnative) { + bool r = false; + if (_AP_I < _AP_W) { + if (_AP_I > 0) r = !(V.getLoBits(_AP_W - _AP_I).isMinValue()); + else r = !(V.isMinValue()); + } + if (r && V.isNegative()) { // if this is negative integer + ++ret;//ap_private(1,_AP_S); + } + } else { + //Follow OSCI library, conversion from sc_fixed to sc_int + } + return ret; + } + + template + INLINE operator ap_private<_AP_W2,_AP_S2> () const { + return (ap_private<_AP_W2,_AP_S2>)to_ap_private(); + } + + template + INLINE operator ap_private<_AP_W2,_AP_S2,_AP_N2> () const { + return (ap_private<_AP_W2,_AP_S2,_AP_N2>)to_ap_private(); + } + + //Explict conversion function to C built-in integral type + INLINE int to_int() const { + return to_ap_private().to_int(); + } + + INLINE int to_uint() const { + return to_ap_private().to_uint(); + } + + INLINE ap_slong to_int64() const { + return to_ap_private().to_int64(); + } + + INLINE ap_ulong to_uint64() const { + return to_ap_private().to_uint64(); + } + + INLINE double to_double() const { + if (!V) + return 0; + if (_AP_W>64 || (_AP_W - _AP_I) > 0) { + bool isneg = _AP_S && V[_AP_W-1]; + uint64_t res = isneg ? 0x8000000000000000ULL : 0; + ap_private<_AP_W, false> tmp = V; + if (isneg) tmp = -tmp; + int i = _AP_W -1 - tmp.countLeadingZeros(); + int exp = _AP_I-(_AP_W-i); + res|=((uint64_t)(exp+DOUBLE_BIAS))<DOUBLE_MAN)?tmp.lshr(i-DOUBLE_MAN):tmp).to_uint64() & DOUBLE_MAN_MASK; + res |= i 0) { + /* This specialization is disabled. It is giving wrong results in some cases. + bool isneg=V.isNegative(); + double dp = V.get(); + dp /= (1<< (_AP_W - _AP_I)); + return dp;*/ + } else + return double(to_int64()); + } + + INLINE float to_float() const { + uint32_t res=0; + if (V==0) + return 0; + bool isneg=V.isNegative(); + ap_private<_AP_W, _AP_S> tmp=V; + if (isneg) tmp = -tmp; + if (_AP_W-_AP_I>0||_AP_W>64) { + if (isneg) + res=0x80000000; + int i=_AP_W-1; + i-=tmp.countLeadingZeros(); + int exp=_AP_I-(_AP_W-i); + res|=(exp+FLOAT_BIAS)< man = 0; + if (i!=0) { + tmp.clear(i); + if (i>FLOAT_MAN) + man=tmp.lshr(i-FLOAT_MAN); + else + man=tmp; + res |= i < FLOAT_MAN?man.getZExtValue()<<(FLOAT_MAN-i):man.getZExtValue(); + } + } else { + return float(to_int64()); + } + float dp=rawBitsToFloat(res); + return dp; + } + + INLINE operator double () const { + return to_double(); + } +#ifndef __SC_COMPATIBLE__ + INLINE operator float () const { + return to_float(); + } + + INLINE operator char () const { + return (char) to_int(); + } + + INLINE operator unsigned char () const { + return (unsigned char) to_uint(); + } + + INLINE operator short () const { + return (short) to_int(); + } + + INLINE operator unsigned short () const { + return (unsigned short) to_uint(); + } + + INLINE operator int () const { + return to_int(); + } + + INLINE operator unsigned int () const { + return to_uint(); + } +#if 1 +#ifdef __x86_64__ + INLINE operator long () const { + return (long)to_int64(); + } + + INLINE operator unsigned long () const { + return (unsigned long) to_uint64(); + } +#else + INLINE operator long () const { + return to_int64(); + } + + INLINE operator unsigned long () const { + return to_uint64(); + } + +#endif +#endif + INLINE operator unsigned long long () const { + return to_uint64(); + } + + INLINE operator long long () const { + return to_int64(); + } +#endif + + INLINE std::string to_string(uint8_t radix=2, bool sign=false) const; + + INLINE ap_slong bits_to_int64() const { + ap_private res(V); + return (ap_slong) res; + } + + INLINE ap_ulong bits_to_uint64() const { + ap_private res(V); + return (ap_ulong) res; + } + + INLINE int length() const {return _AP_W;} + + // Count the number of zeros from the most significant bit + // to the first one bit. Note this is only for ap_fixed_base whose + // _AP_W <= 64, otherwise will incur assertion. + INLINE int countLeadingZeros() { + return V.countLeadingZeros(); + } + + ///Arithmetic:Binary + //------------------------------------------------------------------------- + template + INLINE typename RType<_AP_W2,_AP_I2,_AP_S2>::mult + operator * (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + typename RType<_AP_W2,_AP_I2,_AP_S2>::mult r; + r.V = V * op2.V; + return r; + } + + template + static INLINE ap_fixed_base multiply(const ap_fixed_base<_AP_W1,_AP_I1,_AP_S1>& op1, const + ap_fixed_base<_AP_W2,_AP_I2,_AP_S2>& op2) { + ap_private<_AP_W+_AP_W2, _AP_S> OP1=op1.V; + ap_private<_AP_W2,_AP_S2> OP2=op2.V; + return OP1*OP2; + } + + template + INLINE typename RType<_AP_W2,_AP_I2,_AP_S2>::div + operator / (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + enum {F2 = _AP_W2-_AP_I2, _W1=AP_MAX(_AP_W + AP_MAX(F2, 0), _AP_W2), + _W2=AP_MAX(_AP_W2,AP_MAX(_AP_W + AP_MAX(F2, 0), _AP_W2))}; + ap_private<_W1, _AP_S> dividend = (ap_private<_W1, _AP_S>(V)) << ((_W1>_AP_W)?F2:0); + ap_private<_W1, _AP_S2> divisior = ap_private<_W2, _AP_S2>(op2.V); + ap_private<_W1, _AP_S> ret = ap_private<_W1,_AP_S> ((_AP_S||_AP_S2) ? dividend.sdiv(divisior): dividend.udiv(divisior)); + typename RType<_AP_W2, _AP_I2, _AP_S2>::div r; + r.V = ret; + return r; + } +#define OP_BIN_AF(Sym, Rty, Width, Sign, Fun) \ + template \ + INLINE typename RType<_AP_W2,_AP_I2,_AP_S2>::Rty \ + operator Sym (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const \ + { \ + enum {_AP_F=_AP_W-_AP_I, F2=_AP_W2-_AP_I2}; \ + typename RType<_AP_W2,_AP_I2,_AP_S2>::Rty r, lhs(*this), rhs(op2); \ + r.V = lhs.V.Fun(rhs.V); \ + return r; \ + } \ + INLINE typename RType<_AP_W,_AP_I,_AP_S>::Rty \ + operator Sym (const ap_fixed_base& op2) const \ + { \ + typename RType<_AP_W,_AP_I,_AP_S>::Rty r; \ + r.V = V Sym op2.V; \ + return r; \ + } \ + + OP_BIN_AF(+, plus, plus_w, plus_s, Add) + OP_BIN_AF(-, minus, minus_w, minus_s, Sub) + +#define OP_LOGIC_BIN_AF(Sym, Rty, Width, Sign) \ + template \ + INLINE typename RType<_AP_W2,_AP_I2,_AP_S2>::Rty \ + operator Sym (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const \ + { \ + typename RType<_AP_W2,_AP_I2,_AP_S2>::Rty r, lhs(*this), rhs(op2); \ + r.V=lhs.V Sym rhs.V; \ + return r; \ + } \ + INLINE typename RType<_AP_W,_AP_I,_AP_S>::Rty \ + operator Sym (const ap_fixed_base& op2) const \ + { \ + typename RType<_AP_W,_AP_I,_AP_S>::Rty r; \ + r.V = V Sym op2.V; \ + return r; \ + } \ + INLINE typename RType<_AP_W,_AP_I,_AP_S>::Rty operator Sym(int op2) const \ + { \ + return V Sym (op2<<(_AP_W - _AP_I)); \ + } + OP_LOGIC_BIN_AF(&, logic, logic_w, logic_s) + OP_LOGIC_BIN_AF(|, logic, logic_w, logic_s) + OP_LOGIC_BIN_AF(^, logic, logic_w, logic_s) + + ///Arithmic : assign + //------------------------------------------------------------------------- +#define OP_ASSIGN_AF(Sym) \ + template \ + INLINE ap_fixed_base& operator Sym##= (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) \ + { \ + *this=operator Sym (op2) ; \ + return *this; \ + } + + OP_ASSIGN_AF(+) + OP_ASSIGN_AF(-) + OP_ASSIGN_AF(&) + OP_ASSIGN_AF(|) + OP_ASSIGN_AF(^) + OP_ASSIGN_AF(*) + OP_ASSIGN_AF(/) + + ///Prefix increment, decrement + //------------------------------------------------------------------------- + INLINE ap_fixed_base& operator ++() { + operator+=(ap_fixed_base<1,1,false>(1)); //SystemC's semantics + return *this; + } + + INLINE ap_fixed_base& operator --() { + operator-=(ap_fixed_base<1,1,false>(1)); //SystemC's semantics + return *this; + } + + //Postfix increment, decrement + //------------------------------------------------------------------------- + INLINE const ap_fixed_base operator ++(int) { + ap_fixed_base t(*this); + operator++(); + return t; + } + + INLINE const ap_fixed_base operator --(int) { + ap_fixed_base t = *this; + operator--(); + return t; + } + + ///Unary arithmetic + //------------------------------------------------------------------------- + INLINE ap_fixed_base operator +() {return *this;} + + INLINE ap_fixed_base<_AP_W + 1, _AP_I + 1, true> operator -() const { + ap_fixed_base<_AP_W + 1, _AP_I + 1, true> Tmp(*this); + Tmp.V = - Tmp.V; + return Tmp; + } + + INLINE ap_fixed_base<_AP_W,_AP_I,true,_AP_Q,_AP_O, _AP_N> getNeg() { + ap_fixed_base<_AP_W,_AP_I,true,_AP_Q,_AP_O, _AP_N> Tmp(*this); + Tmp.V=-Tmp.V; + return Tmp; + } + + ///Not (!) + //------------------------------------------------------------------------- + INLINE bool operator !() const { + return !V; + } + + ///Bitwise complement + //------------------------------------------------------------------------- + INLINE ap_fixed_base<_AP_W, _AP_I, _AP_S> + operator ~() const { + ap_fixed_base<_AP_W, _AP_I, _AP_S> res(*this); + res.V.flip(); + return res; + } + + ///Shift + ///template argument as shift value + template + INLINE ap_fixed_base<_AP_W, _AP_I + _AP_SHIFT, _AP_S> lshift () const { + ap_fixed_base<_AP_W, _AP_I + _AP_SHIFT, _AP_S> r; + r.V = V; + return r; + } + + template + INLINE ap_fixed_base<_AP_W, _AP_I - _AP_SHIFT, _AP_S> rshift () const { + ap_fixed_base<_AP_W, _AP_I - _AP_SHIFT, _AP_S> r; + r.V = V; + return r; + } + + //Because the return type is the type of the the first operand, shift assign + //operators do not carry out any quantization or overflow + //While systemc, shift assigns for sc_fixed/sc_ufixed will result in + //quantization or overflow (depending on the mode of the first operand) + //------------------------------------------------------------------------- + INLINE ap_fixed_base operator << (int sh) const { + ap_fixed_base r; + bool isNeg=(sh&0x80000000) != 0; + sh=isNeg?-sh:sh; + bool shiftoverflow = sh >= _AP_W; + bool NegSrc = V.isNegative(); + if (isNeg) { + if (shiftoverflow) + NegSrc?r.V.set():r.V.clear(); + else + r.V=_AP_S?V.ashr(sh):V.lshr(sh); + } else { + if (shiftoverflow) + r.V.clear(); + else + r.V=V< 1 && sh <= _AP_W) + rb = (V << (_AP_W - sh + 1 )) != 0; + else if (sh > _AP_W) + rb = V != 0; + r.quantization_adjust(qb, rb, NegSrc); + } else if (isNeg == false && _AP_O != AP_WRAP) { + bool allones, allzeros; + if (sh < _AP_W ) { + ap_private<_AP_W, _AP_S > range1 = V.lshr(_AP_W - sh - 1); + allones = range1.isAllOnesValue(); + allzeros = range1.isMinValue(); + } else { + allones = false; + allzeros = V.isMinValue(); + } + bool overflow = !allzeros && !NegSrc; + bool underflow = !allones && NegSrc; + if (_AP_O == AP_SAT_SYM && _AP_S) + underflow |= NegSrc && (_AP_W > 1 ? r.V.isMinSignedValue():true); + bool lD = false; + if ( sh < _AP_W ) lD = V[_AP_W - sh - 1]; + r.overflow_adjust(underflow, overflow, lD, NegSrc); + } +#endif + return r; + } + + template + INLINE ap_fixed_base operator<<(const ap_private<_AP_W2,true>& op2) const { + int sh = op2.to_int(); + return operator << (sh); + } + + INLINE ap_fixed_base operator << (unsigned int sh ) const { + ap_fixed_base r; + bool shiftoverflow = sh >= _AP_W; + r.V = shiftoverflow ? ap_private<_AP_W, _AP_S >(0) : V << sh; + if (sh == 0) return r; +#ifdef __SC_COMPATIBLE__ + bool NegSrc = V.isNegative(); + if (_AP_O != AP_WRAP) { + bool allones, allzeros; + if (sh < _AP_W ) { + ap_private<_AP_W, _AP_S > range1 = V.lshr(_AP_W - sh -1); + allones = range1.isAllOnesValue(); + allzeros = range1.isMinValue(); + } else { + allones = false; + allzeros = V.isMinValue(); + } + bool overflow = !allzeros && !NegSrc; + bool underflow = !allones && NegSrc; + if (_AP_O == AP_SAT_SYM && _AP_S) + underflow |= NegSrc && (_AP_W > 1 ? r.V.isMinSignedValue():true); + bool lD = false; + if ( sh < _AP_W ) lD = V[_AP_W - sh - 1]; + r.overflow_adjust(underflow, overflow, lD, NegSrc); + } +#endif + return r; + } + + template + INLINE ap_fixed_base operator << (const ap_private<_AP_W2,false>& op2) const { + unsigned int sh = op2.to_uint(); + return operator << (sh); + } + + INLINE ap_fixed_base operator >> (int sh) const { + ap_fixed_base r; + bool isNeg=(sh&0x80000000) != 0; + bool NegSrc = V.isNegative(); + sh=isNeg?-sh:sh; + bool shiftoverflow = sh >= _AP_W; + if (isNeg && !shiftoverflow) r.V=V< 1 && sh <= _AP_W) + rb = (V << (_AP_W - sh + 1 )) != 0; + else if (sh > _AP_W) + rb = V != 0; + r.quantization_adjust(qb, rb, NegSrc); + } else if (isNeg == true && _AP_O != AP_WRAP) { + bool allones, allzeros; + if (sh < _AP_W ) { + ap_private<_AP_W, _AP_S > range1 = V.lshr(_AP_W - sh - 1); + allones = range1.isAllOnesValue(); + allzeros = range1.isMinValue(); + } else { + allones = false; + allzeros = V.isMinValue(); + } + bool overflow = !allzeros && !NegSrc; + bool underflow = !allones && NegSrc; + if (_AP_O == AP_SAT_SYM && _AP_S) + underflow |= NegSrc && (_AP_W > 1 ? r.V.isMinSignedValue():true); + bool lD = false; + if ( sh < _AP_W ) lD = V[_AP_W - sh - 1]; + r.overflow_adjust(underflow, overflow, lD, NegSrc); + } +#endif + return r; + } + + template + INLINE ap_fixed_base operator >> (const ap_private<_AP_W2,true>& op2) const { + int sh = op2.to_int(); + return operator >> (sh); + } + + INLINE ap_fixed_base operator >> (unsigned int sh) const { + ap_fixed_base r; + bool NegSrc = V.isNegative(); + bool shiftoverflow = sh >= _AP_W; + if (shiftoverflow) + NegSrc?r.V.set():r.V.clear(); + else + r.V=_AP_S?V.ashr(sh):V.lshr(sh); +#ifdef __SC_COMPATIBLE__ + if (sh == 0) return r; + if (_AP_Q != AP_TRN) { + bool qb = false; + if (sh <= _AP_W) qb = V[sh - 1]; + bool rb = false; + if (sh > 1 && sh <= _AP_W) + rb = (V << (_AP_W - sh + 1 )) != 0; + else if (sh > _AP_W) + rb = V != 0; + r.quantization_adjust(qb, rb, NegSrc); + } +#endif + return r; + } + + template + INLINE ap_fixed_base operator >> (const ap_private<_AP_W2,false>& op2) const { + unsigned int sh = op2.to_uint(); + return operator >> (sh); + } + + ///shift assign + //------------------------------------------------------------------------- +#define OP_AP_SHIFT_AP_ASSIGN_AF(Sym) \ + template \ + INLINE ap_fixed_base& operator Sym##=(const ap_private<_AP_W2,_AP_S2>& op2) \ + { \ + *this=operator Sym (op2); \ + return *this; \ + } + + OP_AP_SHIFT_AP_ASSIGN_AF(<<) + OP_AP_SHIFT_AP_ASSIGN_AF(>>) + + ///Support shift(ap_fixed_base) +#define OP_AP_SHIFT_AF(Sym) \ + template \ + INLINE ap_fixed_base operator Sym (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const \ + { \ + return operator Sym (op2.to_ap_private()); \ + } \ + template \ + INLINE ap_fixed_base& operator Sym##= (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) \ + { \ + *this=operator Sym (op2); \ + return *this; \ + } + + OP_AP_SHIFT_AF(<<) + OP_AP_SHIFT_AF(>>) + + INLINE ap_fixed_base& operator >>= (unsigned int sh) { + *this = operator >> (sh); + return *this; + } + + INLINE ap_fixed_base& operator <<= (unsigned int sh) { + *this = operator << (sh); + return *this; + } + + INLINE ap_fixed_base& operator >>= (int sh) { + *this = operator >> (sh); + return *this; + } + + INLINE ap_fixed_base& operator <<= (int sh) { + *this = operator << (sh); + return *this; + } + + ///Comparisons + //------------------------------------------------------------------------- + template + INLINE bool operator == (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + enum {_AP_F=_AP_W-_AP_I,F2=_AP_W2-_AP_I2, shAmt1 = AP_MAX(F2-_AP_F, 0), shAmt2 = AP_MAX(_AP_F-F2,0), _AP_W3 = (_AP_F==F2) ? AP_MAX(_AP_W,_AP_W2) : AP_MAX(_AP_W+shAmt1, _AP_W2+shAmt2)}; + ap_private<_AP_W3, _AP_S > OP1= ap_private<_AP_W3, _AP_S >(V)< OP2=ap_private<_AP_W3,_AP_S2 >(op2.V)< + INLINE bool operator != (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + return !(*this==op2); + } + + template + INLINE bool operator > (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + enum {_AP_F=_AP_W-_AP_I,F2=_AP_W2-_AP_I2, shAmt1 = AP_MAX(F2-_AP_F, 0), shAmt2 = AP_MAX(_AP_F-F2,0), _AP_W3 = (_AP_F==F2) ? AP_MAX(_AP_W,_AP_W2) : AP_MAX(_AP_W+shAmt1, _AP_W2+shAmt2)}; + ap_private<_AP_W3, _AP_S > OP1= ap_private<_AP_W3, _AP_S >(V)< OP2=ap_private<_AP_W3,_AP_S2 >(op2.V)< + INLINE bool operator <= (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + return !(*this>op2); + } + + template + INLINE bool operator < (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + enum {_AP_F=_AP_W-_AP_I,F2=_AP_W2-_AP_I2, shAmt1 = AP_MAX(F2-_AP_F, 0), shAmt2 = AP_MAX(_AP_F-F2,0), _AP_W3 = (_AP_F==F2) ? AP_MAX(_AP_W,_AP_W2) : AP_MAX(_AP_W+shAmt1, _AP_W2+shAmt2)}; + ap_private<_AP_W3, _AP_S > OP1= ap_private<_AP_W3, _AP_S >(V)< OP2=ap_private<_AP_W3,_AP_S2 >(op2.V)< + INLINE bool operator >= (const ap_fixed_base<_AP_W2,_AP_I2,_AP_S2,_AP_Q2,_AP_O2, _AP_N2>& op2) const { + return !(*this) + DOUBLE_CMP_AF(>=) + DOUBLE_CMP_AF(<) + DOUBLE_CMP_AF(<=) + + // Bit and Slice Select + INLINE af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N> operator [] (unsigned int index) { + assert(index<_AP_W&&"Attemping to read bit beyond MSB"); + return af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(this, index); + } + + INLINE af_bit_ref<_AP_W, _AP_I,_AP_S,_AP_Q,_AP_O, _AP_N> bit(unsigned int index) { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(this, index); + } + + template + INLINE af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N> bit (const ap_private<_AP_W2,_AP_S2>& index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(this, index.to_int()); + } + + INLINE bool bit (unsigned int index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return V[index]; + } + + INLINE bool operator [] (unsigned int index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return V[index]; + } + + template + INLINE bool bit (const ap_private<_AP_W2, _AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return V[index.to_uint()]; + } + + template + INLINE bool operator [] (const ap_private<_AP_W2, _AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return V[index.to_uint()]; + } + + INLINE af_bit_ref<_AP_W, _AP_I,_AP_S,_AP_Q,_AP_O, _AP_N> get_bit(int index) { + assert(index < _AP_I && "Attempting to read bit beyond MSB"); + assert(index >= _AP_I - _AP_W&& "Attempting to read bit beyond MSB"); + return af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(this, index + _AP_W - _AP_I); + } + + template + INLINE af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N> get_bit (const ap_private<_AP_W2, true>& index) { + assert(index >= _AP_I - _AP_W && "Attempting to read bit with negative index"); + assert(index < _AP_I && "Attempting to read bit beyond MSB"); + return af_bit_ref<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(this, index.to_int() + _AP_W - _AP_I); + } + + INLINE bool get_bit (int index) const { + assert(index >= _AP_I - _AP_W && "Attempting to read bit with negative index"); + assert(index < _AP_I && "Attempting to read bit beyond MSB"); + return V[index + _AP_W - _AP_I]; + } + + template + INLINE bool get_bit (const ap_private<_AP_W2, true>& index) const { + assert(index >= _AP_I - _AP_W && "Attempting to read bit with negative index"); + assert(index < _AP_I && "Attempting to read bit beyond MSB"); + return V[index.to_int() + _AP_W - _AP_I]; + } + + INLINE af_range_ref<_AP_W,_AP_I,_AP_S, _AP_Q, _AP_O, _AP_N> + range(int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(this, Hi, Lo); + } + + INLINE af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> + operator () (int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(this, Hi, Lo); + } + + INLINE af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> + range(int Hi, int Lo) const { + assert((Hi < _AP_W) && (Lo < _AP_W) &&"Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(const_cast(this), Hi, Lo); + } + + INLINE af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> + operator () (int Hi, int Lo) const { + return this->range(Hi, Lo); + } + + template + INLINE af_range_ref<_AP_W,_AP_I,_AP_S, _AP_Q, _AP_O, _AP_N> + range(const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(this, Hi, Lo); + } + + template + INLINE af_range_ref<_AP_W,_AP_I,_AP_S, _AP_Q, _AP_O, _AP_N> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(this, Hi, Lo); + } + + template + INLINE af_range_ref<_AP_W,_AP_I,_AP_S, _AP_Q, _AP_O, _AP_N> + range(const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>(const_cast< + ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>*>(this), + Hi, Lo); + } + + template + INLINE af_range_ref<_AP_W,_AP_I,_AP_S, _AP_Q, _AP_O, _AP_N> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + return this->range(Hi, Lo); + } + + INLINE af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> + range() { + return this->range(_AP_W - 1, 0); + } + + INLINE af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> + range() const { + return this->range(_AP_W - 1, 0); + } + + INLINE bool is_zero () const { + return V.isMinValue(); + } + + INLINE bool is_neg () const { + if (V.isNegative()) + return true; + return false; + } + + INLINE int wl () const { + return _AP_W; + } + + INLINE int iwl () const { + return _AP_I; + } + + INLINE ap_q_mode q_mode () const { + return _AP_Q; + } + + INLINE ap_o_mode o_mode () const { + return _AP_O; + } + + INLINE int n_bits () const { + return 0; + } + + //private: +public: + ap_private<_AP_W, _AP_S> V; +}; + +template +std::string ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>::to_string( + uint8_t radix, bool sign) const { + std::string str; + str.clear(); + char step; + std::string prefix; + switch (radix) { + case 2 : prefix = "0b"; step = 1; break; + case 8 : prefix = "0o"; step = 3; break; + case 16 : prefix = "0x"; step = 4; break; + default : break; + } + if (_AP_W <= _AP_I) + str = this->to_ap_private().to_string(radix, + radix == 10 ? _AP_S : sign); + else { + if (radix == 10) { + bool isNeg = _AP_S && V.isNegative(); + if (_AP_I > 0) { + ap_private int_part(0); + int_part = this->to_ap_private(); + str += int_part.to_string(radix, false); + } else { + if (isNeg) str += '-'; + } + ap_fixed_base<_AP_W, _AP_I, _AP_S> tmp(*this); + if (isNeg && _AP_I <= 0) tmp = -tmp; + ap_fixed_base<_AP_W - AP_MIN(_AP_I, 0), 0, false> frac_part = tmp; + if (frac_part == 0) return str; + str += "."; + while (frac_part != 0) { + char digit = (frac_part * radix).to_ap_private(); + str += static_cast(digit + '0'); + frac_part *= radix; + } + } else { + if (_AP_I > 0) { + for (signed i = _AP_W - _AP_I; i < _AP_W; i += step) { + + char digit = (char)(this->range(AP_MIN(i + step - 1, _AP_W - 1), i)); + str = (digit < 10 ? static_cast(digit + '0') : + static_cast(digit - 10 + 'a')) + str; + } + } + str += '.'; + ap_fixed_base tmp(*this); + for (signed i = _AP_W - _AP_I - 1; i >= 0; i -= step) { + char digit = (char)(tmp.range(i, AP_MAX(0, i - step + 1))); + str += digit < 10 ? static_cast(digit + '0') : + static_cast(digit - 10 + 'a'); + } + } + } + str = prefix + str; + return str; +} + +template +INLINE void b_not(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op) { + ret.V = op.V; + ret.V.flip(); +} + +template +INLINE void b_and(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op1, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op2) { + ret.V = op1.V & op2.V; +} + +template +INLINE void b_or(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op1, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op2) { + ret.V = op1.V | op2.V; +} + +template +INLINE void b_xor(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op1, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op2) { + ret.V = op1.V ^ op2.V; +} + +template +INLINE void neg(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op) { + ap_fixed_base<_AP_W2+!_AP_S2, _AP_I2+!_AP_S2, true, _AP_Q2, _AP_O2, _AP_N2> Tmp; + Tmp.V = - op.V; + ret = Tmp; +} + +template +INLINE void neg(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op) { + ret.V = -op.V; +} + +template +INLINE void lshift(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op, + int i) { + ap_fixed_base<_AP_W2 - _AP_I2 + AP_MAX(_AP_I, _AP_I2), AP_MAX(_AP_I, _AP_I2), _AP_S2, _AP_Q2, _AP_O2, _AP_N2> Tmp; + Tmp = op; + Tmp.V <<= i; + ret = Tmp; +} + +template +INLINE void lshift(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op, + int i) { + ret.V = op.V << i; +} + +template +INLINE void rshift(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2>& op, + int i) { + ap_fixed_base<_AP_I2 + AP_MAX(_AP_W - _AP_I, _AP_W2 - _AP_I2), _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> Tmp; + Tmp = op; + Tmp.V = _AP_S2 ? Tmp.V.ashr(i): Tmp.V.lshr(i); + ret = Tmp; +} + +template +INLINE void rshift(ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& ret, + const ap_fixed_base<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N>& op, + int i) { + ret.V = _AP_S ? op.V.ashr(i): op.V.lshr(i); +} + +#define AF_CTOR_SPEC_BASE(_AP_W,_AP_S,C_TYPE) \ + template<> INLINE ap_fixed_base<_AP_W,_AP_W,_AP_S,AP_TRN,AP_WRAP>::ap_fixed_base(C_TYPE i_op):V(i_op) \ + { \ + } + +#define AF_CTOR_SPEC(__W,C_TYPE) \ + AF_CTOR_SPEC_BASE(__W,true,C_TYPE) \ + AF_CTOR_SPEC_BASE(__W,false,C_TYPE) + +AF_CTOR_SPEC(1,bool) +AF_CTOR_SPEC(8, signed char) +AF_CTOR_SPEC(8, unsigned char) +AF_CTOR_SPEC(16, signed short) +AF_CTOR_SPEC(16, unsigned short) +AF_CTOR_SPEC(32, signed int) +AF_CTOR_SPEC(32, unsigned int) +AF_CTOR_SPEC(64, ap_slong) +AF_CTOR_SPEC(64, ap_ulong) + +///Output streaming +//----------------------------------------------------------------------------- +template +INLINE std::ostream& +operator <<(std::ostream& os, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& x) { + os << x.to_double(); + return os; +} + +///Input streaming +//----------------------------------------------------------------------------- +template +INLINE std::istream& +operator >> (std::istream& os, ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& x) { + double d; + os >> d; + x = ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>(x); + return os; +} + +template +INLINE void print(const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& x) { + ap_private<_AP_W,_AP_S> data=x.V; + if (_AP_I>0) { + const ap_private<_AP_I,_AP_S> p1=data>>(_AP_W-_AP_I); + print(p1); + + } else + printf("0"); + printf("."); + if (_AP_I<_AP_W) { + const ap_private<_AP_W-_AP_I,false> p2=data; + print(p2,false); + } +} + +///Operators mixing Integers with ap_fixed_base +//----------------------------------------------------------------------------- +#if 1 +#define AF_BIN_OP_WITH_INT_SF(BIN_OP,C_TYPE,_AP_W2,_AP_S2,RTYPE) \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op.operator BIN_OP(ap_private<_AP_W2,_AP_S2>(i_op)); \ + } +#define AF_BIN_OP_WITH_INT(BIN_OP, C_TYPE, _AP_W2,_AP_S2,RTYPE) \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op.operator BIN_OP (ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } \ + \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (C_TYPE i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) \ + { \ + return ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op).operator BIN_OP (op); \ + } + +#else +#define AF_BIN_OP_WITH_INT_SF(BIN_OP,C_TYPE,_AP_W2,_AP_S2,RTYPE) \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op BIN_OP (i_op); \ + } +#define AF_BIN_OP_WITH_INT(BIN_OP, C_TYPE, _AP_W2,_AP_S2,RTYPE) \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op.V BIN_OP (i_op<<(_AP_W-_AP_I)); \ + } \ + \ + \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP (C_TYPE i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) \ + { \ + return ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op).operator BIN_OP (op); \ + } + +#endif +#if 1 +#define AF_REL_OP_WITH_INT(REL_OP, C_TYPE, _AP_W2,_AP_S2) \ + template \ + INLINE bool operator REL_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op.operator REL_OP (ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } \ + \ + \ + template \ + INLINE bool operator REL_OP (C_TYPE i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) \ + { \ + return ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op).operator REL_OP (op); \ + } +#else +#define AF_REL_OP_WITH_INT(REL_OP, C_TYPE, _AP_W2,_AP_S2) \ + template \ + INLINE bool operator REL_OP (const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) \ + { \ + return op.V.operator REL_OP (i_op<<(_AP_W-_AP_I)); \ + } \ + \ + \ + template \ + INLINE bool operator REL_OP (C_TYPE i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) \ + { \ + return (i_op<<(_AP_W-_AP_I)) REL_OP (op.V.VAL); \ + } +#endif +#if 1 +#define AF_ASSIGN_OP_WITH_INT(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& operator ASSIGN_OP ( ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) { \ + return op.operator ASSIGN_OP (ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } +#define AF_ASSIGN_OP_WITH_INT_SF(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& operator ASSIGN_OP ( ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) { \ + return op.operator ASSIGN_OP (ap_private<_AP_W2,_AP_S2>(i_op)); \ + } +#else +#define AF_ASSIGN_OP_WITH_INT(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& operator ASSIGN_OP ( ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) { \ + return op.V.operator ASSIGN_OP (i_op); \ + } +#define AF_ASSIGN_OP_WITH_INT_SF(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& operator ASSIGN_OP ( ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, C_TYPE i_op) { \ + return op.V.operator ASSIGN_OP (i_op); \ + } +#endif + +#define AF_OPS_WITH_INT(C_TYPE, WI, SI) \ + AF_BIN_OP_WITH_INT(+, C_TYPE, WI, SI, plus) \ + AF_BIN_OP_WITH_INT(-, C_TYPE, WI, SI, minus) \ + AF_BIN_OP_WITH_INT(*, C_TYPE, WI, SI, mult) \ + AF_BIN_OP_WITH_INT(/, C_TYPE, WI, SI, div) \ + AF_BIN_OP_WITH_INT_SF(>>, C_TYPE, WI, SI, arg1) \ + AF_BIN_OP_WITH_INT_SF(<<, C_TYPE, WI, SI, arg1) \ + AF_BIN_OP_WITH_INT(&, C_TYPE, WI, SI, logic) \ + AF_BIN_OP_WITH_INT(|, C_TYPE, WI, SI, logic) \ + AF_BIN_OP_WITH_INT(^, C_TYPE, WI, SI, logic) \ + \ + AF_REL_OP_WITH_INT(==, C_TYPE, WI, SI) \ + AF_REL_OP_WITH_INT(!=, C_TYPE, WI, SI) \ + AF_REL_OP_WITH_INT(>, C_TYPE, WI, SI) \ + AF_REL_OP_WITH_INT(>=, C_TYPE, WI, SI) \ + AF_REL_OP_WITH_INT(<, C_TYPE, WI, SI) \ + AF_REL_OP_WITH_INT(<=, C_TYPE, WI, SI) \ + \ + AF_ASSIGN_OP_WITH_INT(+=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(-=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(*=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(/=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT_SF(>>=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT_SF(<<=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(&=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(|=, C_TYPE, WI, SI) \ + AF_ASSIGN_OP_WITH_INT(^=, C_TYPE, WI, SI) + +AF_OPS_WITH_INT(bool, 1, false) +AF_OPS_WITH_INT(char, 8, true) +AF_OPS_WITH_INT(signed char, 8, true) +AF_OPS_WITH_INT(unsigned char, 8, false) +AF_OPS_WITH_INT(short, 16, true) +AF_OPS_WITH_INT(unsigned short, 16, false) +AF_OPS_WITH_INT(int, 32, true) +AF_OPS_WITH_INT(unsigned int, 32, false) +# if defined __x86_64__ +AF_OPS_WITH_INT(long, 64, true) +AF_OPS_WITH_INT(unsigned long, 64, false) +# else +AF_OPS_WITH_INT(long, 32, true) +AF_OPS_WITH_INT(unsigned long, 32, false) +# endif +AF_OPS_WITH_INT(ap_slong, 64, true) +AF_OPS_WITH_INT(ap_ulong, 64, false) + +#define AF_BIN_OP_WITH_AP_INT(BIN_OP, RTYPE) \ + template \ + INLINE typename ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>::template RType<_AP_W,_AP_I,_AP_S>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W2,_AP_S2>& i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) { \ + return ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op).operator BIN_OP (op); \ + } \ + template \ + INLINE typename ap_fixed_base<_AP_W,_AP_I,_AP_S>::template RType<_AP_W2,_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP ( const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, const ap_private<_AP_W2,_AP_S2>& i_op) { \ + return op.operator BIN_OP (ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } + +#define AF_REL_OP_WITH_AP_INT(REL_OP) \ + template \ + INLINE bool operator REL_OP ( const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, const ap_private<_AP_W2,_AP_S2>& i_op) { \ + return op.operator REL_OP ( ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } \ + template \ + INLINE bool operator REL_OP ( const ap_private<_AP_W2,_AP_S2>& i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) { \ + return ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op).operator REL_OP (op); \ + } + +#define AF_ASSIGN_OP_WITH_AP_INT(ASSIGN_OP) \ + template \ + INLINE ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& operator ASSIGN_OP ( ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op, const ap_private<_AP_W2,_AP_S2>& i_op) { \ + return op.operator ASSIGN_OP (ap_fixed_base<_AP_W2,_AP_W2,_AP_S2>(i_op)); \ + } \ + template \ + INLINE ap_private<_AP_W2,_AP_S2>& operator ASSIGN_OP ( ap_private<_AP_W2,_AP_S2>& i_op, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op) { \ + return i_op.operator ASSIGN_OP (op.to_ap_private()); \ + } + +AF_BIN_OP_WITH_AP_INT(+, plus) +AF_BIN_OP_WITH_AP_INT(-, minus) +AF_BIN_OP_WITH_AP_INT(*, mult) +AF_BIN_OP_WITH_AP_INT(/, div) +AF_BIN_OP_WITH_AP_INT(&, logic) +AF_BIN_OP_WITH_AP_INT(|, logic) +AF_BIN_OP_WITH_AP_INT(^, logic) + +AF_REL_OP_WITH_AP_INT(==) +AF_REL_OP_WITH_AP_INT(!=) +AF_REL_OP_WITH_AP_INT(>) +AF_REL_OP_WITH_AP_INT(>=) +AF_REL_OP_WITH_AP_INT(<) +AF_REL_OP_WITH_AP_INT(<=) + +AF_ASSIGN_OP_WITH_AP_INT(+=) +AF_ASSIGN_OP_WITH_AP_INT(-=) +AF_ASSIGN_OP_WITH_AP_INT(*=) +AF_ASSIGN_OP_WITH_AP_INT(/=) +AF_ASSIGN_OP_WITH_AP_INT(&=) +AF_ASSIGN_OP_WITH_AP_INT(|=) +AF_ASSIGN_OP_WITH_AP_INT(^=) + +#define AF_REF_REL_OP_MIX_INT(REL_OP, C_TYPE, _AP_W2, _AP_S2) \ +template \ + INLINE bool operator REL_OP ( const af_range_ref<_AP_W,_AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op, C_TYPE op2) { \ + return (ap_private<_AP_W, false>(op)).operator REL_OP (ap_private<_AP_W2,_AP_S2>(op2)); \ + } \ +template \ + INLINE bool operator REL_OP ( C_TYPE op2, const af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op) { \ + return ap_private<_AP_W2,_AP_S2>(op2).operator REL_OP (ap_private<_AP_W, false>(op)); \ + } \ +template \ + INLINE bool operator REL_OP ( const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op, C_TYPE op2) { \ + return (bool(op)) REL_OP op2; \ + } \ +template \ + INLINE bool operator REL_OP ( C_TYPE op2, const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op) { \ + return op2 REL_OP (bool(op)); \ + } + +#define AF_REF_REL_MIX_INT(C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(>, C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(<, C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(>=, C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(<=, C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(==, C_TYPE, _AP_WI, _AP_SI) \ +AF_REF_REL_OP_MIX_INT(!=, C_TYPE, _AP_WI, _AP_SI) + +AF_REF_REL_MIX_INT(bool, 1, false) +AF_REF_REL_MIX_INT(char, 8, true) +AF_REF_REL_MIX_INT(signed char, 8, true) +AF_REF_REL_MIX_INT(unsigned char, 8, false) +AF_REF_REL_MIX_INT(short, 16, true) +AF_REF_REL_MIX_INT(unsigned short, 16, false) +AF_REF_REL_MIX_INT(int, 32, true) +AF_REF_REL_MIX_INT(unsigned int, 32, false) +# if defined __x86_64__ +AF_REF_REL_MIX_INT(long, 64, true) +AF_REF_REL_MIX_INT(unsigned long, 64, false) +# else +AF_REF_REL_MIX_INT(long, 32, true) +AF_REF_REL_MIX_INT(unsigned long, 32, false) +# endif +AF_REF_REL_MIX_INT(ap_slong, 64, true) +AF_REF_REL_MIX_INT(ap_ulong, 64, false) + +#define AF_REF_REL_OP_AP_INT(REL_OP) \ +template \ + INLINE bool operator REL_OP ( const af_range_ref<_AP_W,_AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op, const ap_private<_AP_W2, _AP_S> &op2) { \ + return (ap_private<_AP_W, false>(op)).operator REL_OP (op2); \ + } \ +template \ + INLINE bool operator REL_OP (const ap_private<_AP_W2, _AP_S2> &op2, const af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op) { \ + return op2.operator REL_OP (ap_private<_AP_W, false>(op)); \ + } \ +template \ + INLINE bool operator REL_OP ( const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op, const ap_private<_AP_W2, _AP_S2> &op2) { \ + return (ap_private<1, false>(op)).operator REL_OP (op2); \ + } \ +template \ + INLINE bool operator REL_OP ( const ap_private<_AP_W2, _AP_S2> &op2, const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op) { \ + return op2.operator REL_OP (ap_private<1,false>(op)); \ + } + +AF_REF_REL_OP_AP_INT(>) +AF_REF_REL_OP_AP_INT(<) +AF_REF_REL_OP_AP_INT(>=) +AF_REF_REL_OP_AP_INT(<=) +AF_REF_REL_OP_AP_INT(==) +AF_REF_REL_OP_AP_INT(!=) + +// Relational Operators with double +template +INLINE bool operator == ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator == (op1); +} + +template +INLINE bool operator != ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator != (op1); +} + +template +INLINE bool operator > ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator < (op1); +} + +template +INLINE bool operator >= ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator <= (op1); +} + +template +INLINE bool operator < ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator > (op1); +} + +template +INLINE bool operator <= ( double op1, const ap_fixed_base<_AP_W,_AP_I,_AP_S,_AP_Q,_AP_O, _AP_N>& op2) { + return op2.operator >= (op1); +} + +#endif /* #ifndef __AESL_GCC_AP_FIXED_H__ */ \ No newline at end of file diff --git a/hls_2018/router_05/etc/ap_int_sim.h b/hls_2018/router_05/etc/ap_int_sim.h new file mode 100755 index 0000000..887ccd8 --- /dev/null +++ b/hls_2018/router_05/etc/ap_int_sim.h @@ -0,0 +1,1629 @@ +/* + * Copyright 2012 Xilinx, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __AESL_GCC_AP_INT_H__ +#define __AESL_GCC_AP_INT_H__ + +#ifndef __cplusplus +#error C++ is required to include this header file +#endif /* #ifndef __cplusplus */ + +#undef _AP_DEBUG_ +#include +#include + +// for safety +#if (defined(_AP_N)|| defined(_AP_C)) +#error One or more of the following is defined: _AP_N, _AP_C. Definition conflicts with their usage as template parameters. +#endif /* #if (defined(_AP_N)|| defined(_AP_C)) */ + +// for safety +#if (defined(_AP_W) || defined(_AP_I) || defined(_AP_S) || defined(_AP_Q) || defined(_AP_O) || defined(_AP_W2) || defined(_AP_I2) || defined(_AP_S2) || defined(_AP_Q2) || defined(_AP_O2)) +#error One or more of the following is defined: _AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2. Definition conflicts with their usage as template parameters. +#endif /* #if (defined(_AP_W) || defined(_AP_I) || defined(_AP_S) || defined(_AP_Q) || defined(_AP_O) || defined(_AP_W2) || defined(_AP_I2) || defined(_AP_S2) || defined(_AP_Q2) || defined(_AP_O2)) */ + +//for safety +#if (defined(_AP_W3) || defined(_AP_S3) || defined(_AP_W4) || defined(_AP_S4)) +#error One or more of the following is defined: _AP_W3, _AP_S3, _AP_W4,_AP_S4. Definition conflicts with their usage as template parameters. +#endif /* #if (defined(_AP_W3) || defined(_AP_S3) || defined(_AP_W4) || defined(_AP_S4)) */ + +//for safety +#if (defined(_AP_W1) || defined(_AP_S1) || defined(_AP_I1) || defined(_AP_T) || defined(_AP_T1) || defined(_AP_T2) || defined(_AP_T3) || defined(_AP_T4)) +#error One or more of the following is defined: _AP_W1, _AP_S1, _AP_I1, _AP_T, _AP_T1, _AP_T2, _AP_T3, _AP_T4. Definition conflicts with their usage as template parameters. +#endif /* #if (defined(_AP_W1) || defined(_AP_S1) || defined(_AP_I1) || defined(_AP_T) || defined(_AP_T1) || defined(_AP_T2) || defined(_AP_T3) || defined(_AP_T4)) */ + +#define __AESL_APDT_IN_SCFLOW__ +#ifndef __AESL_APDT_IN_SCFLOW__ + #include "etc/ap_private.h" +#else + #include "../etc/ap_private.h" +#endif /* #ifndef __AESL_APDT_IN_SCFLOW__ */ + +#ifdef _AP_DEBUG_ + #define AP_DEBUG(s) s +#else + #define AP_DEBUG(s) +#endif /* #ifdef _AP_DEBUG_ */ + +#ifndef __SIMULATION__ + #define __SIMULATION__ +#endif /* #ifndef __SIMULATION__ */ + +#if !(defined SYSTEMC_H) && !(defined SYSTEMC_INCLUDED) + #ifndef SC_TRN + #define SC_TRN AP_TRN + #endif /* #ifndef SC_TRN */ + #ifndef SC_RND + #define SC_RND AP_RND + #endif /* #ifndef SC_RND */ + #ifndef SC_TRN_ZERO + #define SC_TRN_ZERO AP_TRN_ZERO + #endif /* #ifndef SC_TRN_ZERO */ + #ifndef SC_RND_ZERO + #define SC_RND_ZERO AP_RND_ZERO + #endif /* #ifndef SC_RND_ZERO */ + #ifndef SC_RND_INF + #define SC_RND_INF AP_RND_INF + #endif /* #ifndef SC_RND_INF */ + #ifndef SC_RND_MIN_INF + #define SC_RND_MIN_INF AP_RND_MIN_INF + #endif /* #ifndef SC_RND_MIN_INF */ + #ifndef SC_RND_CONV + #define SC_RND_CONV AP_RND_CONV + #endif /* #ifndef SC_RND_CONV */ + #ifndef SC_WRAP + #define SC_WRAP AP_WRAP + #endif /* #ifndef SC_WRAP */ + #ifndef SC_SAT + #define SC_SAT AP_SAT + #endif /* #ifndef SC_SAT */ + #ifndef SC_SAT_ZERO + #define SC_SAT_ZERO AP_SAT_ZERO + #endif /* #ifndef SC_SAT_ZERO */ + #ifndef SC_SAT_SYM + #define SC_SAT_SYM AP_SAT_SYM + #endif /* #ifndef SC_SAT_SYM */ + #ifndef SC_WRAP_SM + #define SC_WRAP_SM AP_WRAP_SM + #endif /* #ifndef SC_WRAP_SM */ + #ifndef SC_BIN + #define SC_BIN AP_BIN + #endif /* #ifndef SC_BIN */ + #ifndef SC_OCT + #define SC_OCT AP_OCT + #endif /* #ifndef SC_OCT */ + #ifndef SC_DEC + #define SC_DEC AP_DEC + #endif /* #ifndef SC_DEC */ + #ifndef SC_HEX + #define SC_HEX AP_HEX + #endif /* #ifndef SC_HEX */ +#endif /* #if !(defined SYSTEMC_H) && !(defined SYSTEMC_INCLUDED) */ +#ifndef AP_INT_MAX_W +#define AP_INT_MAX_W 1024 +#endif +#define BIT_WIDTH_UPPER_LIMIT (1 << 15) +#if AP_INT_MAX_W > BIT_WIDTH_UPPER_LIMIT +#error "Bitwidth exceeds 32768 (1 << 15), the maximum allowed value" +#endif +#define MAX_MODE(BITS) ((BITS + 1023) / 1024) + +///Forward declaration +template struct ap_range_ref; +template struct ap_bit_ref; + +template struct ap_fixed_base; +template struct af_range_ref; +template struct af_bit_ref; +template class ap_uint; + +enum { + AP_BIN = 2, + AP_OCT = 8, + AP_DEC = 10, + AP_HEX = 16 +}; + +///Why to use reference? +///Because we will operate the original object indirectly by operating the +///result object directly after concating or part selecting + +///Proxy class which allows concatination to be used as rvalue(for reading) and +//lvalue(for writing) + +/// Concatination reference. +// ---------------------------------------------------------------- +template +struct ap_concat_ref { +#ifdef _MSC_VER + #pragma warning(disable: 4521 4522) +#endif /* #ifdef _MSC_VER */ + enum {_AP_WR=_AP_W1+_AP_W2,}; + _AP_T1& mbv1; + _AP_T2& mbv2; + + INLINE ap_concat_ref(const ap_concat_ref<_AP_W1, _AP_T1, + _AP_W2, _AP_T2>& ref): + mbv1(ref.mbv1), mbv2(ref.mbv2) {} + + INLINE ap_concat_ref(_AP_T1& bv1, _AP_T2& bv2):mbv1(bv1),mbv2(bv2) {} + + template + INLINE ap_concat_ref& operator = (const ap_private<_AP_W3,_AP_S3>& val) { + ap_private<_AP_W1+_AP_W2, false> vval(val); + int W_ref1=mbv1.length(); + int W_ref2=mbv2.length(); + ap_private<_AP_W1,false> mask1(-1); + mask1>>=_AP_W1-W_ref1; + ap_private<_AP_W2,false> mask2(-1); + mask2>>=_AP_W2-W_ref2; + mbv1.set(ap_private<_AP_W1,false>((vval>>W_ref2)&mask1)); + mbv2.set(ap_private<_AP_W2,false>(vval&mask2)); + return *this; + } + + INLINE ap_concat_ref& operator = (unsigned long long val) { + ap_private<_AP_W1+_AP_W2, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE ap_concat_ref& operator = + (const ap_concat_ref <_AP_W3, _AP_T3, _AP_W4, _AP_T4>& val) { + ap_private<_AP_W1+_AP_W2, false> tmpVal(val); + return operator = (tmpVal); + } + + INLINE ap_concat_ref& operator = + (const ap_concat_ref <_AP_W1, _AP_T1, _AP_W2, _AP_T2>& val) { + ap_private<_AP_W1+_AP_W2, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE ap_concat_ref& operator =(const ap_bit_ref<_AP_W3, _AP_S3>& val) { + ap_private<_AP_W1+_AP_W2, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE ap_concat_ref& operator =(const ap_range_ref<_AP_W3,_AP_S3>& val) { + ap_private<_AP_W1+_AP_W2, false> tmpVal(val); + return operator =(tmpVal); + } + + template + INLINE ap_concat_ref& operator= (const af_range_ref<_AP_W3, _AP_I3, _AP_S3, + _AP_Q3, _AP_O3, _AP_N3>& val) { + return operator = ((const ap_private<_AP_W3, false>)(val)); + } + + template + INLINE ap_concat_ref& operator= (const ap_fixed_base<_AP_W3, _AP_I3, _AP_S3, + _AP_Q3, _AP_O3, _AP_N3>& val) { + return operator = (val.to_ap_private()); + } + + template + INLINE ap_concat_ref& operator= (const af_bit_ref<_AP_W3, _AP_I3, _AP_S3, + _AP_Q3, _AP_O3, _AP_N3>& val) { + return operator=((unsigned long long)(bool)(val)); + } + + + INLINE operator ap_private<_AP_WR, false> () const { + return get(); + } + + INLINE operator unsigned long long () const { + return get().to_uint64(); + } + + template + INLINE ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3, ap_range_ref<_AP_W3, _AP_S3> > + operator, (const ap_range_ref<_AP_W3, _AP_S3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, + _AP_W3, ap_range_ref<_AP_W3, _AP_S3> >(*this, + const_cast &>(a2)); + } + + template + INLINE ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3, ap_private<_AP_W3, _AP_S3> > + operator, (ap_private<_AP_W3, _AP_S3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, + _AP_W3, ap_private<_AP_W3, _AP_S3> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3, ap_private<_AP_W3, _AP_S3> > + operator, (const ap_private<_AP_W3, _AP_S3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, + _AP_W3, ap_private<_AP_W3, _AP_S3> >(*this, + const_cast&>(a2)); + } + + template + INLINE ap_concat_ref<_AP_WR, ap_concat_ref, 1, ap_bit_ref<_AP_W3, _AP_S3> > + operator, (const ap_bit_ref<_AP_W3, _AP_S3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, + 1, ap_bit_ref<_AP_W3, _AP_S3> >(*this, + const_cast &>(a2)); + } + + template + INLINE ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3+_AP_W4, ap_concat_ref<_AP_W3,_AP_T3,_AP_W4,_AP_T4> > + operator, (const ap_concat_ref<_AP_W3,_AP_T3,_AP_W4,_AP_T4> &a2) + { + return ap_concat_ref<_AP_WR, ap_concat_ref, + _AP_W3+_AP_W4, ap_concat_ref<_AP_W3,_AP_T3,_AP_W4, + _AP_T4> >(*this, const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3, af_range_ref<_AP_W3, _AP_I3, _AP_S3, _AP_Q3, _AP_O3, _AP_N3> > + operator, (const af_range_ref<_AP_W3, _AP_I3, _AP_S3, _AP_Q3, + _AP_O3, _AP_N3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, _AP_W3, af_range_ref<_AP_W3, + _AP_I3, _AP_S3, _AP_Q3, _AP_O3, _AP_N3> >(*this, + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<_AP_WR, ap_concat_ref, 1, af_bit_ref<_AP_W3, _AP_I3, _AP_S3, _AP_Q3, _AP_O3, _AP_N3> > + operator, (const af_bit_ref<_AP_W3, _AP_I3, _AP_S3, _AP_Q3, + _AP_O3, _AP_N3> &a2) { + return ap_concat_ref<_AP_WR, ap_concat_ref, 1, af_bit_ref<_AP_W3, + _AP_I3, _AP_S3, _AP_Q3, _AP_O3, _AP_N3> >(*this, + const_cast& >(a2)); + } + + template + INLINE ap_private + operator & (const ap_private<_AP_W3,_AP_S3>& a2) { + return get() & a2; + } + + + template + INLINE ap_private + operator | (const ap_private<_AP_W3,_AP_S3>& a2) { + return get() | a2; + } + + + template + INLINE ap_private + operator ^ (const ap_private<_AP_W3,_AP_S3>& a2) { + return ap_private(get() ^ a2); + } + + INLINE const ap_private<_AP_WR, false> get() const + { + ap_private<_AP_W1+_AP_W2, false> tmpVal = ap_private<_AP_W1+_AP_W2, false> (mbv1.get()); + ap_private<_AP_W1+_AP_W2, false> tmpVal2 = ap_private<_AP_W1+_AP_W2, false> (mbv2.get()); + int W_ref2 = mbv2.length(); + tmpVal <<= W_ref2; + tmpVal |= tmpVal2; + return tmpVal; + } + + INLINE const ap_private<_AP_WR, false> get() { + ap_private<_AP_W1+_AP_W2, false> tmpVal = ap_private<_AP_W1+_AP_W2, false> ( mbv1.get()); + ap_private<_AP_W1+_AP_W2, false> tmpVal2 = ap_private<_AP_W1+_AP_W2, false> (mbv2.get()); + int W_ref2 = mbv2.length(); + tmpVal <<= W_ref2; + tmpVal |= tmpVal2; + return tmpVal; + } + + template + INLINE void set(const ap_private<_AP_W3,false> & val) { + ap_private<_AP_W1+_AP_W2, false> vval(val); + int W_ref1=mbv1.length(); + int W_ref2=mbv2.length(); + ap_private<_AP_W1,false> mask1(-1); + mask1>>=_AP_W1-W_ref1; + ap_private<_AP_W2,false> mask2(-1); + mask2>>=_AP_W2-W_ref2; + mbv1.set(ap_private<_AP_W1,false>((vval>>W_ref2)&mask1)); + mbv2.set(ap_private<_AP_W2,false>(vval&mask2)); + } + + INLINE int length() const { + return mbv1.length()+mbv2.length(); + } + + INLINE std::string to_string(uint8_t radix=2) const { + return get().to_string(radix); + } +}; + +///Proxy class, which allows part selection to be used as rvalue(for reading) and +//lvalue(for writing) + +///Range(slice) reference +//------------------------------------------------------------ +template +struct ap_range_ref { +#ifdef _MSC_VER + #pragma warning( disable : 4521 4522 ) +#endif /* #ifdef _MSC_VER */ + ap_private<_AP_W,_AP_S> &d_bv; + int l_index; + int h_index; + +public: + INLINE ap_range_ref(const ap_range_ref<_AP_W, _AP_S>& ref): + d_bv(ref.d_bv), l_index(ref.l_index), h_index(ref.h_index) {} + + INLINE ap_range_ref(ap_private<_AP_W,_AP_S>* bv, int h, int l): + d_bv(*bv),l_index(l),h_index(h) { + //if (h < l) + //fprintf(stderr, "Warning! The bits selected will be returned in reverse order\n"); + } + + INLINE operator ap_private<_AP_W, false> () const { + ap_private<_AP_W, false> val(0); + if(h_index>=l_index) { + if (_AP_W > 64) { + val=d_bv; + ap_private<_AP_W,false> mask(-1); + mask>>=_AP_W-(h_index-l_index+1); + val>>=l_index; + val&=mask; + } else { + const static uint64_t mask = (~0ULL>> (64>_AP_W ? (64-_AP_W):0)); + val = (d_bv >> l_index) & (mask >>(_AP_W-(h_index-l_index+1))); + } + } else { + for(int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + if((d_bv)[j]) val.set(i); + } + return val; + } + + INLINE operator unsigned long long () const { + return to_uint64(); + } + + template + INLINE ap_range_ref& operator =(const ap_private<_AP_W2,_AP_S2>& val) { + ap_private<_AP_W,false> vval=ap_private<_AP_W,false>(val); + if (l_index>h_index) { + for (int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + (vval)[i]? d_bv.set(j):d_bv.clear(j); + } else { + if (_AP_W > 64) { + ap_private<_AP_W,false> mask(-1); + if (l_index>0) { + mask<<=l_index; + vval<<=l_index; + } + if(h_index<_AP_W-1) + { + ap_private<_AP_W,false> mask2(-1); + mask2>>=_AP_W-h_index-1; + mask&=mask2; + vval&=mask2; + } + mask.flip(); + d_bv&=mask; + d_bv|=vval; + } else { + unsigned shift = 64-_AP_W; + uint64_t mask = ~0ULL>>(shift); + if(l_index>0) + { + vval = mask & vval << l_index; + mask = mask & mask << l_index; + } + if(h_index<_AP_W-1) + { + uint64_t mask2 = mask; + mask2 >>= (_AP_W-h_index-1); + mask&=mask2; + vval&=mask2; + } + mask = ~mask; + d_bv&=mask; + d_bv|=vval; + } + } + return *this; + } + + INLINE ap_range_ref& operator = (unsigned long long val) + { + const ap_private<_AP_W,_AP_S> vval=val; + return operator = (vval); + } + + + INLINE ap_range_ref& operator =(const ap_range_ref<_AP_W, _AP_S>& val) + { + const ap_private<_AP_W, false> tmpVal(val); + return operator =(tmpVal); + } + + + + template + INLINE ap_range_ref& operator = + (const ap_concat_ref <_AP_W3, _AP_T3, _AP_W4, _AP_T4>& val) + { + const ap_private<_AP_W, false> tmpVal(val); + return operator = (tmpVal); + } + + template + INLINE ap_range_ref& operator =(const ap_range_ref<_AP_W3,_AP_S3>& val) + { + const ap_private<_AP_W, false> tmpVal(val); + return operator =(tmpVal); + } + + template + INLINE ap_range_ref& operator= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=((const ap_private<_AP_W2, _AP_S2>)(val)); + } + + template + INLINE ap_range_ref& operator= (const ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=(val.to_ap_private()); + } + + template + INLINE ap_range_ref& operator= (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=((unsigned long long)(bool)(val)); + } + + template + INLINE ap_range_ref& operator= (const ap_bit_ref<_AP_W2, _AP_S2>& val) { + return operator=((unsigned long long)(bool)(val)); + } + + template + INLINE + ap_concat_ref<_AP_W,ap_range_ref,_AP_W2,ap_range_ref<_AP_W2,_AP_S2> > + operator, (const ap_range_ref<_AP_W2,_AP_S2> &a2) + { + return + ap_concat_ref<_AP_W, ap_range_ref, _AP_W2, + ap_range_ref<_AP_W2,_AP_S2> >(*this, + const_cast& >(a2)); + } + + + template + INLINE ap_concat_ref<_AP_W,ap_range_ref,_AP_W2,ap_private<_AP_W2,_AP_S2> > + operator , (ap_private<_AP_W2,_AP_S2>& a2) + { + return + ap_concat_ref<_AP_W, ap_range_ref, _AP_W2, ap_private<_AP_W2,_AP_S2> >(*this, a2); + } + + INLINE ap_concat_ref<_AP_W,ap_range_ref,_AP_W,ap_private<_AP_W,_AP_S> > + operator , (ap_private<_AP_W, _AP_S>& a2) + { + return + ap_concat_ref<_AP_W, ap_range_ref, _AP_W, + ap_private<_AP_W,_AP_S> >(*this, a2); + } + + + + template + INLINE + ap_concat_ref<_AP_W,ap_range_ref,1,ap_bit_ref<_AP_W2,_AP_S2> > + operator, (const ap_bit_ref<_AP_W2,_AP_S2> &a2) + { + return + ap_concat_ref<_AP_W, ap_range_ref, 1, + ap_bit_ref<_AP_W2,_AP_S2> >(*this, const_cast& >(a2)); + } + + + template + INLINE + ap_concat_ref<_AP_W, ap_range_ref, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &a2) + { + return ap_concat_ref<_AP_W, ap_range_ref, _AP_W2+_AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(*this, + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<_AP_W, ap_range_ref, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_range_ref, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<_AP_W, ap_range_ref, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_range_ref, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(a2)); + } + + template + INLINE bool operator == (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs==rhs; + } + + + template + INLINE bool operator != (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs!=rhs; + } + + + template + INLINE bool operator > (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>rhs; + } + + + template + INLINE bool operator >= (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs>=rhs; + } + + + template + INLINE bool operator < (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs + INLINE bool operator <= (const ap_range_ref<_AP_W2, _AP_S2>& op2) + { + ap_private<_AP_W,false> lhs=get(); + ap_private<_AP_W2,false> rhs=op2.get(); + return lhs<=rhs; + } + + + template + INLINE void set(const ap_private<_AP_W2,false>& val) + { + ap_private<_AP_W,_AP_S> vval=val; + if(l_index>h_index) + { + for(int i=0, j=l_index;j>=0&&j>=h_index;j--,i++) + (vval)[i]? d_bv.set(j):d_bv.clear(j); + } else { + if (_AP_W>64 ) { + ap_private<_AP_W,_AP_S> mask(-1); + if(l_index>0) + { + ap_private<_AP_W,false> mask1(-1); + mask1>>=_AP_W-l_index; + mask1.flip(); + mask=mask1; + //vval&=mask1; + vval<<=l_index; + } + if(h_index<_AP_W-1) + { + ap_private<_AP_W,false> mask2(-1); + mask2<<=h_index+1; + mask2.flip(); + mask&=mask2; + vval&=mask2; + } + mask.flip(); + d_bv&=mask; + d_bv|=vval; + } else { + uint64_t mask = ~0ULL >> (64-_AP_W); + if(l_index>0) + { + uint64_t mask1 = mask; + mask1=mask & (mask1>>(_AP_W-l_index)); + vval =mask&( vval <> (64-_AP_W); + mask2 = mask &(mask2<<(h_index+1)); + mask&=~mask2; + vval&=~mask2; + } + d_bv&=(~mask&(~0ULL >> (64-_AP_W))); + d_bv|=vval; + } + } + } + + + INLINE ap_private<_AP_W,false> get() const + { + ap_private<_AP_W,false> val(0); + if(h_index=0&&j>=h_index;j--,i++) + if((d_bv)[j]) val.set(i); + } else { + val=d_bv; + val>>=l_index; + if(h_index<_AP_W-1) + { + if (_AP_W <= 64) { + const static uint64_t mask = (~0ULL>> (64>_AP_W ? (64-_AP_W):0)); + val &= (mask>> (_AP_W-(h_index-l_index+1))); + } else { + ap_private<_AP_W,false> mask(-1); + mask>>=_AP_W-(h_index-l_index+1); + val&=mask; + } + } + } + return val; + } + + + INLINE ap_private<_AP_W,false> get() + { + ap_private<_AP_W,false> val(0); + if(h_index=0&&j>=h_index;j--,i++) + if((d_bv)[j]) val.set(i); + } else { + val=d_bv; + val>>=l_index; + if(h_index<_AP_W-1) + { + if (_AP_W <= 64 ) { + static const uint64_t mask = ~0ULL>> (64>_AP_W ? (64-_AP_W):0); + return val &= ( (mask) >> (_AP_W - (h_index-l_index+1))); + } else { + ap_private<_AP_W,false> mask(-1); + mask>>=_AP_W-(h_index-l_index+1); + val&=mask; + } + } + } + return val; + } + + + INLINE int length() const + { + return h_index>=l_index?h_index-l_index+1:l_index-h_index+1; + } + + + INLINE int to_int() const + { + ap_private<_AP_W,false> val=get(); + return val.to_int(); + } + + + INLINE unsigned int to_uint() const + { + ap_private<_AP_W,false> val=get(); + return val.to_uint(); + } + + + INLINE long to_long() const + { + ap_private<_AP_W,false> val=get(); + return val.to_long(); + } + + + INLINE unsigned long to_ulong() const + { + ap_private<_AP_W,false> val=get(); + return val.to_ulong(); + } + + + INLINE ap_slong to_int64() const + { + ap_private<_AP_W,false> val=get(); + return val.to_int64(); + } + + + INLINE ap_ulong to_uint64() const + { + ap_private<_AP_W,false> val=get(); + return val.to_uint64(); + } + + INLINE std::string to_string(uint8_t radix=2) const { + return get().to_string(radix); + } + +}; + +///Proxy class, which allows bit selection to be used as rvalue(for reading) and +//lvalue(for writing) + +///Bit reference +//-------------------------------------------------------------- +template +struct ap_bit_ref { +#ifdef _MSC_VER +#pragma warning( disable : 4521 4522 ) +#endif + ap_private<_AP_W,_AP_S>& d_bv; + int d_index; + +public: + INLINE ap_bit_ref(const ap_bit_ref<_AP_W, _AP_S>& ref): + d_bv(ref.d_bv), d_index(ref.d_index) {} + + INLINE ap_bit_ref(ap_private<_AP_W,_AP_S>& bv, int index=0): + d_bv(bv),d_index(index) + { +#ifdef _AP_DEBUG_ + assert(d_index<_AP_W&&"index out of bound"); +#endif + } + + + INLINE operator bool () const + { + return d_bv.get_bit(d_index); + } + + + INLINE bool to_bool() const + { + return operator bool (); + } + + + INLINE ap_bit_ref& operator = (unsigned long long val) + { + if(val) + d_bv.set(d_index); + else + d_bv.clear(d_index); + return *this; + } + + +#if 0 + INLINE ap_bit_ref& operator = (bool val) + { + if(val) + d_bv.set(d_index); + else + d_bv.clear(d_index); + return *this; + } +#endif + template + INLINE ap_bit_ref& operator =(const ap_private<_AP_W2,_AP_S2>& val) + { + return operator =((unsigned long long)(val != 0)); + } + + + template + INLINE ap_bit_ref& operator =(const ap_bit_ref<_AP_W2,_AP_S2>& val) + { + return operator =((unsigned long long)(bool)val); + } + + INLINE ap_bit_ref& operator =(const ap_bit_ref<_AP_W,_AP_S>& val) + { + return operator =((unsigned long long)(bool)val); + } + + template + INLINE ap_bit_ref& operator =(const ap_range_ref<_AP_W2,_AP_S2>& val) + { + return operator =((unsigned long long)(bool) val); + } + + + template + INLINE ap_bit_ref& operator= (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=((const ap_private<_AP_W2, false>)(val)); + } + + template + INLINE ap_bit_ref& operator= (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2>& val) { + return operator=((unsigned long long)(bool)(val)); + } + + template + INLINE ap_bit_ref& operator= (const ap_concat_ref<_AP_W2, _AP_T3, _AP_W3, _AP_T3>& val) { + return operator=((const ap_private<_AP_W2 + _AP_W3, false>)(val)); + } + + + + template + INLINE ap_concat_ref<1, ap_bit_ref, _AP_W2, ap_private<_AP_W2,_AP_S2> > + operator , (ap_private<_AP_W2, _AP_S2>& a2) + { + return ap_concat_ref<1, ap_bit_ref, _AP_W2, ap_private<_AP_W2,_AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<1, ap_bit_ref, _AP_W2, ap_range_ref<_AP_W2,_AP_S2> > + operator, (const ap_range_ref<_AP_W2, _AP_S2> &a2) + { + return + ap_concat_ref<1, ap_bit_ref, _AP_W2, ap_range_ref<_AP_W2,_AP_S2> >(*this, + const_cast &>(a2)); + } + + + template + INLINE ap_concat_ref<1, ap_bit_ref, 1, ap_bit_ref<_AP_W2,_AP_S2> > + operator, (const ap_bit_ref<_AP_W2, _AP_S2> &a2) + { + return + ap_concat_ref<1, ap_bit_ref, 1, ap_bit_ref<_AP_W2,_AP_S2> >(*this, + const_cast &>(a2)); + } + + + INLINE ap_concat_ref<1, ap_bit_ref, 1, ap_bit_ref > + operator, (const ap_bit_ref &a2) + { + return + ap_concat_ref<1, ap_bit_ref, 1, ap_bit_ref >(*this, + const_cast(a2)); + } + + + template + INLINE ap_concat_ref<1, ap_bit_ref, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2,_AP_T2,_AP_W3,_AP_T3> > + operator, (const ap_concat_ref<_AP_W2,_AP_T2,_AP_W3,_AP_T3> &a2) + { + return + ap_concat_ref<1,ap_bit_ref,_AP_W2+_AP_W3, + ap_concat_ref<_AP_W2,_AP_T2,_AP_W3,_AP_T3> >(*this, + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<1, ap_bit_ref, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<1, ap_bit_ref, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<1, ap_bit_ref, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<1, ap_bit_ref, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, + const_cast& >(a2)); + } + + template + INLINE bool operator == (const ap_bit_ref<_AP_W2, _AP_S2>& op) { + return get() == op.get(); + } + + template + INLINE bool operator != (const ap_bit_ref<_AP_W2, _AP_S2>& op) { + return get() != op.get(); + } + + + INLINE bool get() const + { + return operator bool (); + } + + + INLINE bool get() + { + return operator bool (); + } + + + template + INLINE void set(const ap_private<_AP_W3, false>& val) + { + operator = (val); + } + + INLINE bool operator ~ () const { + bool bit = (d_bv)[d_index]; + return bit ? false : true; + } + + INLINE int length() const { return 1; } + + INLINE std::string to_string() const { + bool val = get(); + return val ? "1" : "0"; + } +}; + +/// Operators mixing Integers with AP_Int +// ---------------------------------------------------------------- +#if 1 +#define OP_BIN_MIX_INT(BIN_OP, C_TYPE, _AP_WI, _AP_SI, RTYPE) \ + template \ + INLINE typename ap_private<_AP_WI,_AP_SI>::template RType<_AP_W,_AP_S>::RTYPE \ + operator BIN_OP ( C_TYPE i_op, const ap_private<_AP_W,_AP_S> &op) { \ + return ap_private<_AP_WI,_AP_SI>(i_op).operator BIN_OP (op); \ + } \ + template \ + INLINE typename ap_private<_AP_W,_AP_S>::template RType<_AP_WI,_AP_SI>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W,_AP_S> &op, C_TYPE i_op) { \ + return op.operator BIN_OP (ap_private<_AP_WI,_AP_SI>(i_op)); \ + } +#else +#define OP_BIN_MIX_INT(BIN_OP, C_TYPE, _AP_WI, _AP_SI, RTYPE) \ + template \ + INLINE typename ap_private<_AP_WI,_AP_SI>::template RType<_AP_W,_AP_S>::RTYPE \ + operator BIN_OP ( C_TYPE i_op, const ap_private<_AP_W,_AP_S> &op) { \ + return ap_private<_AP_WI,_AP_SI>(i_op).operator BIN_OP (op); \ + } \ + template \ + INLINE typename ap_private<_AP_W,_AP_S>::template RType<_AP_WI,_AP_SI>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W,_AP_S> &op, C_TYPE i_op) { \ + return op.operator BIN_OP (ap_private<_AP_WI,_AP_SI>(i_op)); \ + } +#endif +#define OP_REL_MIX_INT(REL_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE bool operator REL_OP ( const ap_private<_AP_W,_AP_S> &op, C_TYPE op2) { \ + return op.operator REL_OP (ap_private<_AP_W2, _AP_S2>(op2)); \ + } \ + template \ + INLINE bool operator REL_OP ( C_TYPE op2, const ap_private<_AP_W,_AP_S> &op) { \ + return ap_private<_AP_W2,_AP_S2>(op2).operator REL_OP (op); \ + } +#define OP_ASSIGN_MIX_INT(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_private<_AP_W,_AP_S> &operator ASSIGN_OP ( ap_private<_AP_W,_AP_S> &op, C_TYPE op2) { \ + return op.operator ASSIGN_OP (ap_private<_AP_W2,_AP_S2>(op2)); \ + } + +#define OP_BIN_SHIFT_INT(BIN_OP, C_TYPE, _AP_WI, _AP_SI, RTYPE) \ + template \ + C_TYPE operator BIN_OP ( C_TYPE i_op, const ap_private<_AP_W,_AP_S> &op) { \ + return i_op BIN_OP (op.getVal()); \ + } \ + template \ + INLINE typename ap_private<_AP_W,_AP_S>::template RType<_AP_WI,_AP_SI>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W,_AP_S> &op, C_TYPE i_op) { \ + return op.operator BIN_OP (i_op); \ + } +#define OP_ASSIGN_RSHIFT_INT(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_private<_AP_W,_AP_S> &operator ASSIGN_OP ( ap_private<_AP_W,_AP_S> &op, C_TYPE op2) { \ + op = op.operator >> (op2); \ + return op; \ + } +#define OP_ASSIGN_LSHIFT_INT(ASSIGN_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE ap_private<_AP_W,_AP_S> &operator ASSIGN_OP ( ap_private<_AP_W,_AP_S> &op, C_TYPE op2) { \ + op = op.operator << (op2); \ + return op; \ + } + +#define OPS_MIX_INT(C_TYPE, WI, SI) \ + OP_BIN_MIX_INT(*, C_TYPE, WI, SI, mult) \ + OP_BIN_MIX_INT(+, C_TYPE, WI, SI, plus) \ + OP_BIN_MIX_INT(-, C_TYPE, WI, SI, minus) \ + OP_BIN_MIX_INT(/, C_TYPE, WI, SI, div) \ + OP_BIN_MIX_INT(%, C_TYPE, WI, SI, mod) \ + OP_BIN_MIX_INT(&, C_TYPE, WI, SI, logic) \ + OP_BIN_MIX_INT(|, C_TYPE, WI, SI, logic) \ + OP_BIN_MIX_INT(^, C_TYPE, WI, SI, logic) \ + OP_BIN_SHIFT_INT(>>, C_TYPE, WI, SI, arg1) \ + OP_BIN_SHIFT_INT(<<, C_TYPE, WI, SI, arg1) \ + \ + OP_REL_MIX_INT(==, C_TYPE, WI, SI) \ + OP_REL_MIX_INT(!=, C_TYPE, WI, SI) \ + OP_REL_MIX_INT(>, C_TYPE, WI, SI) \ + OP_REL_MIX_INT(>=, C_TYPE, WI, SI) \ + OP_REL_MIX_INT(<, C_TYPE, WI, SI) \ + OP_REL_MIX_INT(<=, C_TYPE, WI, SI) \ + \ + OP_ASSIGN_MIX_INT(+=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(-=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(*=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(/=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(%=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(&=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(|=, C_TYPE, WI, SI) \ + OP_ASSIGN_MIX_INT(^=, C_TYPE, WI, SI) \ + OP_ASSIGN_RSHIFT_INT(>>=, C_TYPE, WI, SI) \ + OP_ASSIGN_LSHIFT_INT(<<=, C_TYPE, WI, SI) + + +OPS_MIX_INT(bool, 1, false) +OPS_MIX_INT(char, 8, true) +OPS_MIX_INT(signed char, 8, true) +OPS_MIX_INT(unsigned char, 8, false) +OPS_MIX_INT(short, 16, true) +OPS_MIX_INT(unsigned short, 16, false) +OPS_MIX_INT(int, 32, true) +OPS_MIX_INT(unsigned int, 32, false) +# if defined __x86_64__ +OPS_MIX_INT(long, 64, true) +OPS_MIX_INT(unsigned long, 64, false) +# else +OPS_MIX_INT(long, 32, true) +OPS_MIX_INT(unsigned long, 32, false) +# endif +OPS_MIX_INT(ap_slong, 64, true) +OPS_MIX_INT(ap_ulong, 64, false) + +#define OP_BIN_MIX_RANGE(BIN_OP, RTYPE) \ + template \ + INLINE typename ap_private<_AP_W1,_AP_S1>::template RType<_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP ( const ap_range_ref<_AP_W1,_AP_S1>& op1, const ap_private<_AP_W2,_AP_S2>& op2) { \ + return ap_private<_AP_W1, false>(op1).operator BIN_OP (op2); \ + } \ + template \ + INLINE typename ap_private<_AP_W1,_AP_S1>::template RType<_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W1,_AP_S1>& op1, const ap_range_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator BIN_OP (ap_private<_AP_W2, false>(op2)); \ + } + +#define OP_REL_MIX_RANGE(REL_OP) \ + template \ + INLINE bool operator REL_OP ( const ap_range_ref<_AP_W1,_AP_S1>& op1, const ap_private<_AP_W2,_AP_S2>& op2) { \ + return ap_private<_AP_W1,false>(op1).operator REL_OP (op2); \ + } \ + template \ + INLINE bool operator REL_OP ( const ap_private<_AP_W1,_AP_S1>& op1, const ap_range_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator REL_OP (op2.operator ap_private<_AP_W2, false>()); \ + } + +#define OP_ASSIGN_MIX_RANGE(ASSIGN_OP) \ + template \ + INLINE ap_private<_AP_W1,_AP_S1>& operator ASSIGN_OP ( ap_private<_AP_W1,_AP_S1>& op1, const ap_range_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator ASSIGN_OP (ap_private<_AP_W2, false>(op2)); \ + } \ + template \ + INLINE ap_range_ref<_AP_W1,_AP_S1>& operator ASSIGN_OP (ap_range_ref<_AP_W1,_AP_S1>& op1, ap_private<_AP_W2,_AP_S2>& op2) { \ + ap_private<_AP_W1, false> tmp(op1); \ + tmp.operator ASSIGN_OP (op2); \ + op1 = tmp; \ + return op1; \ + } + + +OP_ASSIGN_MIX_RANGE(+=) +OP_ASSIGN_MIX_RANGE(-=) +OP_ASSIGN_MIX_RANGE(*=) +OP_ASSIGN_MIX_RANGE(/=) +OP_ASSIGN_MIX_RANGE(%=) +OP_ASSIGN_MIX_RANGE(>>=) +OP_ASSIGN_MIX_RANGE(<<=) +OP_ASSIGN_MIX_RANGE(&=) +OP_ASSIGN_MIX_RANGE(|=) +OP_ASSIGN_MIX_RANGE(^=) + +OP_REL_MIX_RANGE(==) +OP_REL_MIX_RANGE(!=) +OP_REL_MIX_RANGE(>) +OP_REL_MIX_RANGE(>=) +OP_REL_MIX_RANGE(<) +OP_REL_MIX_RANGE(<=) + +OP_BIN_MIX_RANGE(+, plus) +OP_BIN_MIX_RANGE(-, minus) +OP_BIN_MIX_RANGE(*, mult) +OP_BIN_MIX_RANGE(/, div) +OP_BIN_MIX_RANGE(%, mod) +OP_BIN_MIX_RANGE(>>, arg1) +OP_BIN_MIX_RANGE(<<, arg1) +OP_BIN_MIX_RANGE(&, logic) +OP_BIN_MIX_RANGE(|, logic) +OP_BIN_MIX_RANGE(^, logic) + +#define OP_BIN_MIX_BIT(BIN_OP, RTYPE) \ + template \ + INLINE typename ap_private<1, false>::template RType<_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP ( const ap_bit_ref<_AP_W1,_AP_S1>& op1, const ap_private<_AP_W2,_AP_S2>& op2) { \ + return ap_private<1, false>(op1).operator BIN_OP (op2); \ + } \ + template \ + INLINE typename ap_private<_AP_W1,_AP_S1>::template RType<1,false>::RTYPE \ + operator BIN_OP ( const ap_private<_AP_W1,_AP_S1>& op1, const ap_bit_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator BIN_OP (ap_private<1, false>(op2)); \ + } + +#define OP_REL_MIX_BIT(REL_OP) \ + template \ + INLINE bool operator REL_OP ( const ap_bit_ref<_AP_W1,_AP_S1>& op1, const ap_private<_AP_W2,_AP_S2>& op2) { \ + return ap_private<_AP_W1,false>(op1).operator REL_OP (op2); \ + } \ + template \ + INLINE bool operator REL_OP ( const ap_private<_AP_W1,_AP_S1>& op1, const ap_bit_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator REL_OP (ap_private<1, false>(op2)); \ + } + +#define OP_ASSIGN_MIX_BIT(ASSIGN_OP) \ + template \ + INLINE ap_private<_AP_W1,_AP_S1>& operator ASSIGN_OP ( ap_private<_AP_W1,_AP_S1>& op1, ap_bit_ref<_AP_W2,_AP_S2>& op2) { \ + return op1.operator ASSIGN_OP (ap_private<1, false>(op2)); \ + } \ + template \ + INLINE ap_bit_ref<_AP_W1,_AP_S1>& operator ASSIGN_OP ( ap_bit_ref<_AP_W1,_AP_S1>& op1, ap_private<_AP_W2,_AP_S2>& op2) { \ + ap_private<1, false> tmp(op1); \ + tmp.operator ASSIGN_OP (op2); \ + op1 = tmp; \ + return op1; \ + } + + +OP_ASSIGN_MIX_BIT(+=) +OP_ASSIGN_MIX_BIT(-=) +OP_ASSIGN_MIX_BIT(*=) +OP_ASSIGN_MIX_BIT(/=) +OP_ASSIGN_MIX_BIT(%=) +OP_ASSIGN_MIX_BIT(>>=) +OP_ASSIGN_MIX_BIT(<<=) +OP_ASSIGN_MIX_BIT(&=) +OP_ASSIGN_MIX_BIT(|=) +OP_ASSIGN_MIX_BIT(^=) + +OP_REL_MIX_BIT(==) +OP_REL_MIX_BIT(!=) +OP_REL_MIX_BIT(>) +OP_REL_MIX_BIT(>=) +OP_REL_MIX_BIT(<) +OP_REL_MIX_BIT(<=) + +OP_BIN_MIX_BIT(+, plus) +OP_BIN_MIX_BIT(-, minus) +OP_BIN_MIX_BIT(*, mult) +OP_BIN_MIX_BIT(/, div) +OP_BIN_MIX_BIT(%, mod) +OP_BIN_MIX_BIT(>>, arg1) +OP_BIN_MIX_BIT(<<, arg1) +OP_BIN_MIX_BIT(&, logic) +OP_BIN_MIX_BIT(|, logic) +OP_BIN_MIX_BIT(^, logic) + +#define REF_REL_OP_MIX_INT(REL_OP, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE bool operator REL_OP ( const ap_range_ref<_AP_W,_AP_S> &op, C_TYPE op2) { \ + return (ap_private<_AP_W, false>(op)).operator REL_OP (ap_private<_AP_W2,_AP_S2>(op2)); \ + } \ + template \ + INLINE bool operator REL_OP ( C_TYPE op2, const ap_range_ref<_AP_W,_AP_S> &op) { \ + return ap_private<_AP_W2,_AP_S2>(op2).operator REL_OP (ap_private<_AP_W, false>(op)); \ + } \ + template \ + INLINE bool operator REL_OP ( const ap_bit_ref<_AP_W,_AP_S> &op, C_TYPE op2) { \ + return (bool(op)) REL_OP op2; \ + } \ + template \ + INLINE bool operator REL_OP ( C_TYPE op2, const ap_bit_ref<_AP_W,_AP_S> &op) { \ + return op2 REL_OP (bool(op)); \ + } \ + template \ + INLINE bool operator REL_OP ( const ap_concat_ref<_AP_W,_AP_T, _AP_W1, _AP_T1> &op, C_TYPE op2) { \ + return (ap_private<_AP_W + _AP_W1, false>(op)).operator REL_OP (ap_private<_AP_W2,_AP_S2>(op2)); \ + } \ + template \ + INLINE bool operator REL_OP ( C_TYPE op2, const ap_concat_ref<_AP_W,_AP_T, _AP_W1, _AP_T1> &op) { \ + return ap_private<_AP_W2,_AP_S2>(op2).operator REL_OP (ap_private<_AP_W + _AP_W1, false>(op)); \ + } + +#define REF_REL_MIX_INT(C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(>, C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(<, C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(>=, C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(<=, C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(==, C_TYPE, _AP_WI, _AP_SI) \ +REF_REL_OP_MIX_INT(!=, C_TYPE, _AP_WI, _AP_SI) + +REF_REL_MIX_INT(bool, 1, false) +REF_REL_MIX_INT(char, 8, true) +REF_REL_MIX_INT(signed char, 8, true) +REF_REL_MIX_INT(unsigned char, 8, false) +REF_REL_MIX_INT(short, 16, true) +REF_REL_MIX_INT(unsigned short, 16, false) +REF_REL_MIX_INT(int, 32, true) +REF_REL_MIX_INT(unsigned int, 32, false) +# if defined __x86_64__ +REF_REL_MIX_INT(long, 64, true) +REF_REL_MIX_INT(unsigned long, 64, false) +# else +REF_REL_MIX_INT(long, 32, true) +REF_REL_MIX_INT(unsigned long, 32, false) +# endif +REF_REL_MIX_INT(ap_slong, 64, true) +REF_REL_MIX_INT(ap_ulong, 64, false) + +#define REF_BIN_OP_MIX_INT(BIN_OP, RTYPE, C_TYPE, _AP_W2, _AP_S2) \ + template \ + INLINE typename ap_private<_AP_W, false>::template RType<_AP_W2,_AP_S2>::RTYPE \ + operator BIN_OP ( const ap_range_ref<_AP_W,_AP_S> &op, C_TYPE op2) { \ + return (ap_private<_AP_W, false>(op)).operator BIN_OP (ap_private<_AP_W2,_AP_S2>(op2)); \ + } \ + template \ + INLINE typename ap_private<_AP_W2, _AP_S2>::template RType<_AP_W,false>::RTYPE \ + operator BIN_OP ( C_TYPE op2, const ap_range_ref<_AP_W,_AP_S> &op) { \ + return ap_private<_AP_W2,_AP_S2>(op2).operator BIN_OP (ap_private<_AP_W, false>(op)); \ + } + +#define REF_BIN_MIX_INT(C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(+, plus, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(-, minus, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(*, mult, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(/, div, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(%, mod, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(>>, arg1, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(<<, arg1, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(&, logic, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(|, logic, C_TYPE, _AP_WI, _AP_SI) \ +REF_BIN_OP_MIX_INT(^, logic, C_TYPE, _AP_WI, _AP_SI) + +REF_BIN_MIX_INT(bool, 1, false) +REF_BIN_MIX_INT(char, 8, true) +REF_BIN_MIX_INT(signed char, 8, true) +REF_BIN_MIX_INT(unsigned char, 8, false) +REF_BIN_MIX_INT(short, 16, true) +REF_BIN_MIX_INT(unsigned short, 16, false) +REF_BIN_MIX_INT(int, 32, true) +REF_BIN_MIX_INT(unsigned int, 32, false) +# if defined __x86_64__ +REF_BIN_MIX_INT(long, 64, true) +REF_BIN_MIX_INT(unsigned long, 64, false) +#else +REF_BIN_MIX_INT(long, 32, true) +REF_BIN_MIX_INT(unsigned long, 32, false) +#endif +REF_BIN_MIX_INT(ap_slong, 64, true) +REF_BIN_MIX_INT(ap_ulong, 64, false) + +#define REF_BIN_OP(BIN_OP, RTYPE) \ +template \ +INLINE typename ap_private<_AP_W, false>::template RType<_AP_W2, false>::RTYPE \ +operator BIN_OP (const ap_range_ref<_AP_W,_AP_S> &lhs, const ap_range_ref<_AP_W2,_AP_S2> &rhs) { \ + return ap_private<_AP_W,false>(lhs).operator BIN_OP (ap_private<_AP_W2, false>(rhs)); \ +} + +REF_BIN_OP(+, plus) +REF_BIN_OP(-, minus) +REF_BIN_OP(*, mult) +REF_BIN_OP(/, div) +REF_BIN_OP(%, mod) +REF_BIN_OP(>>, arg1) +REF_BIN_OP(<<, arg1) +REF_BIN_OP(&, logic) +REF_BIN_OP(|, logic) +REF_BIN_OP(^, logic) + +#if 1 +#define CONCAT_OP_MIX_INT(C_TYPE, _AP_WI, _AP_SI) \ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (const ap_private<_AP_W, _AP_S> &op1, C_TYPE op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op2); \ + ap_private<_AP_WI + _AP_W, false> ret(op1); \ + ret <<= _AP_WI; \ + if (_AP_SI) { \ + val <<= _AP_W; val >>= _AP_W; \ + }\ + ret |= val; \ + return ret;\ +} \ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (C_TYPE op1, const ap_private<_AP_W, _AP_S>& op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op1); \ + ap_private<_AP_WI + _AP_W, false> ret(op2); \ + if (_AP_S) { \ + ret <<= _AP_WI; ret >>= _AP_WI; \ + } \ + ret |= val << _AP_W; \ + return ret; \ +} \ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (const ap_range_ref<_AP_W, _AP_S> &op1, C_TYPE op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op2); \ + ap_private<_AP_WI + _AP_W, false> ret(op1); \ + ret <<= _AP_WI; \ + if (_AP_SI) { \ + val <<= _AP_W; val >>= _AP_W; \ + } \ + ret |= val; \ + return ret; \ +} \ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (C_TYPE op1, const ap_range_ref<_AP_W, _AP_S> &op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op1); \ + ap_private<_AP_WI + _AP_W, false> ret(op2); \ + int len = op2.length(); \ + val <<= len; \ + ret |= val; \ + return ret; \ +} \ +template \ +INLINE \ +ap_private<_AP_WI + 1, false > \ + operator, (const ap_bit_ref<_AP_W, _AP_S> &op1, C_TYPE op2) { \ + ap_private<_AP_WI + 1, false> val(op2); \ + val[_AP_WI] = op1; \ + return val; \ +} \ +template \ +INLINE \ +ap_private<_AP_WI + 1, false > \ + operator, (C_TYPE op1, const ap_bit_ref<_AP_W, _AP_S> &op2) { \ + ap_private<_AP_WI + 1, false> val(op1); \ + val <<= 1; \ + val[0] = op2; \ + return val; \ +} \ +template \ +INLINE \ +ap_private<_AP_W + _AP_W2 + _AP_WI, false > \ + operator, (const ap_concat_ref<_AP_W, _AP_T, _AP_W2, _AP_T2> &op1, C_TYPE op2) {\ + ap_private<_AP_WI + _AP_W + _AP_W2, _AP_SI> val(op2);\ + ap_private<_AP_WI + _AP_W + _AP_W2, _AP_SI> ret(op1);\ + if (_AP_SI) { \ + val <<= _AP_W + _AP_W2; val >>= _AP_W + _AP_W2; \ + } \ + ret <<= _AP_WI; \ + ret |= val; \ + return ret; \ +}\ +template \ +INLINE \ +ap_private<_AP_W + _AP_W2 + _AP_WI, false > \ + operator, (C_TYPE op1, const ap_concat_ref<_AP_W, _AP_T, _AP_W2, _AP_T2> &op2) {\ + ap_private<_AP_WI + _AP_W + _AP_W2, _AP_SI> val(op1);\ + ap_private<_AP_WI + _AP_W + _AP_W2, _AP_SI> ret(op2);\ + int len = op2.length(); \ + val <<= len; \ + ret |= val;\ + return ret; \ +}\ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (const af_range_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, _AP_N> &op1, C_TYPE op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op2); \ + ap_private<_AP_WI + _AP_W, false> ret(op1); \ + if (_AP_SI) { \ + val <<= _AP_W; val >>= _AP_W; \ + }\ + ret <<= _AP_WI; \ + ret |= val; \ + return ret; \ +} \ +template \ +INLINE \ +ap_private< _AP_W + _AP_WI, false > \ + operator, (C_TYPE op1, const af_range_ref<_AP_W, _AP_I, _AP_S, \ + _AP_Q, _AP_O, _AP_N> &op2) { \ + ap_private<_AP_WI + _AP_W, false> val(op1); \ + ap_private<_AP_WI + _AP_W, false> ret(op2); \ + int len = op2.length(); \ + val <<= len; \ + ret |= val; \ + return ret; \ +} \ +template \ +INLINE \ +ap_private< 1 + _AP_WI, false> \ + operator, (const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q, _AP_O, \ + _AP_N> &op1, C_TYPE op2) { \ + ap_private<_AP_WI + 1, _AP_SI> val(op2); \ + val[_AP_WI] = op1; \ + return val; \ +} \ +template \ +INLINE \ +ap_private< 1 + _AP_WI, false> \ + operator, (C_TYPE op1, const af_bit_ref<_AP_W, _AP_I, _AP_S, _AP_Q,\ + _AP_O, _AP_N> &op2) { \ + ap_private<_AP_WI + 1, _AP_SI> val(op1); \ + val <<= 1; \ + val[0] = op2; \ + return val; \ +} + +CONCAT_OP_MIX_INT(bool, 1, false) +CONCAT_OP_MIX_INT(char, 8, true) +CONCAT_OP_MIX_INT(signed char, 8, true) +CONCAT_OP_MIX_INT(unsigned char, 8, false) +CONCAT_OP_MIX_INT(short, 16, true) +CONCAT_OP_MIX_INT(unsigned short, 16, false) +CONCAT_OP_MIX_INT(int, 32, true) +CONCAT_OP_MIX_INT(unsigned int, 32, false) +# if defined __x86_64__ +CONCAT_OP_MIX_INT(long, 64, true) +CONCAT_OP_MIX_INT(unsigned long, 64, false) +# else +CONCAT_OP_MIX_INT(long, 32, true) +CONCAT_OP_MIX_INT(unsigned long, 32, false) +# endif +CONCAT_OP_MIX_INT(ap_slong, 64, true) +CONCAT_OP_MIX_INT(ap_ulong, 64, false) +#endif + +#if 1 +#define CONCAT_SHIFT_MIX_INT(C_TYPE, op) \ +template \ +INLINE ap_uint<_AP_W+_AP_W1> operator op (const ap_concat_ref<_AP_W, _AP_T, _AP_W1, _AP_T1> lhs, C_TYPE rhs) { \ + return ((ap_uint<_AP_W+_AP_W1>)lhs.get()) op ((int)rhs); \ +} + +CONCAT_SHIFT_MIX_INT(long, <<) +CONCAT_SHIFT_MIX_INT(unsigned long, <<) +CONCAT_SHIFT_MIX_INT(unsigned int, <<) +CONCAT_SHIFT_MIX_INT(ap_ulong, <<) +CONCAT_SHIFT_MIX_INT(ap_slong, <<) +CONCAT_SHIFT_MIX_INT(long, >>) +CONCAT_SHIFT_MIX_INT(unsigned long, >>) +CONCAT_SHIFT_MIX_INT(unsigned int, >>) +CONCAT_SHIFT_MIX_INT(ap_ulong, >>) +CONCAT_SHIFT_MIX_INT(ap_slong, >>) +#endif + +#if defined(SYSTEMC_H) || defined(SYSTEMC_INCLUDED) +template +INLINE void sc_trace(sc_core::sc_trace_file *tf, const ap_private<_AP_W, _AP_S> &op, + const std::string &name) { + if (tf) + tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name); +} +#endif + +template +INLINE std::ostream& operator<<(std::ostream& out, const ap_private<_AP_W,_AP_S> &op) +{ + ap_private<_AP_W, _AP_S> v=op; + const std::ios_base::fmtflags basefield = out.flags() & std::ios_base::basefield; + unsigned radix = (basefield == std::ios_base::hex) ? 16 : + ((basefield == std::ios_base::oct) ? 8 : 10); + std::string str=v.toString(radix,_AP_S); + out< +INLINE std::istream& operator >> (std::istream& in, ap_private<_AP_W,_AP_S> &op) +{ + std::string str; + in >> str; + op = ap_private<_AP_W, _AP_S>(str.c_str()); + return in; + +} + +template +INLINE std::ostream& operator<<(std::ostream& out, const ap_range_ref<_AP_W,_AP_S> &op) +{ + return operator<<(out, ap_private<_AP_W, _AP_S>(op)); +} + +template +INLINE std::istream& operator >> (std::istream& in, ap_range_ref<_AP_W,_AP_S> &op) +{ + return operator>>(in, ap_private<_AP_W, _AP_S>(op));; +} + +template +INLINE void print(const ap_private<_AP_W,_AP_S> &op, bool fill=true ) +{ + ap_private<_AP_W, _AP_S> v=op; + uint32_t ws=v.getNumWords(); + const uint64_t *ptr=v.getRawData(); + int i=ws-1; +#if 0 + if(fill) + printf("%016llx",*(ptr+i)); + else + printf("%llx",*(ptr+i)); +#else +//match SystemC output + if(_AP_W%64 != 0) { + uint32_t offset=_AP_W%64; + uint32_t count=(offset+3)/4; + int64_t data=*(ptr+i); + if(_AP_S) + data=(data<<(64-offset))>>(64-offset); + else + count=(offset+4)/4; + while(count-->0) + printf("%llx",(data>>(count*4))&0xf); + } else { + if(_AP_S==false) + printf("0"); + printf("%016llx",*(ptr+i)); + } +#endif + for(--i;i>=0;i--) + printf("%016llx",*(ptr+i)); + printf("\n"); + +} +#endif /* #ifndef __AESL_GCC_AP_INT_H__ */ \ No newline at end of file diff --git a/hls_2018/router_05/etc/ap_private.h b/hls_2018/router_05/etc/ap_private.h new file mode 100755 index 0000000..1a68a9e --- /dev/null +++ b/hls_2018/router_05/etc/ap_private.h @@ -0,0 +1,5858 @@ +/* + * Copyright 2012 Xilinx, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LLVM_SUPPORT_MATHEXTRAS_H +#define LLVM_SUPPORT_MATHEXTRAS_H + +#ifdef _MSC_VER +#if _MSC_VER <= 1500 +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else if +#include +#endif /* #if _MSC_VER <= 1500 */ +#else +#include +#endif /* #if _MSC_VER <= 1500 */ +#undef INLINE +#if 1 +#define INLINE inline +#else +//Enable to debug ap_int/ap_fixed +#define INLINE __attribute__((weak)) +#endif +#define AP_MAX(a,b) ((a) > (b) ? (a) : (b)) +#define AP_MIN(a,b) ((a) < (b) ? (a) : (b)) +#define AP_ABS(a) ((a)>=0 ? (a):-(a)) +#ifndef AP_INT_MAX_W +#define AP_INT_MAX_W 1024 +#endif +#define BIT_WIDTH_UPPER_LIMIT (1 << 15) +#if AP_INT_MAX_W > BIT_WIDTH_UPPER_LIMIT +#error "Bitwidth exceeds 32768 (1 << 15), the maximum allowed value" +#endif +#define MAX_MODE(BITS) ((BITS + 1023) / 1024) + +// NOTE: The following support functions use the _32/_64 extensions instead of +// type overloading so that signed and unsigned integers can be used without +// ambiguity. + +/// Hi_32 - This function returns the high 32 bits of a 64 bit value. +INLINE uint32_t Hi_32(uint64_t Value) { + return static_cast(Value >> 32); +} + +/// Lo_32 - This function returns the low 32 bits of a 64 bit value. +INLINE uint32_t Lo_32(uint64_t Value) { + return static_cast(Value); +} + +/// ByteSwap_16 - This function returns a byte-swapped representation of the +/// 16-bit argument, Value. +INLINE uint16_t ByteSwap_16(uint16_t Value) { +#if defined(_MSC_VER) && !defined(_DEBUG) + // The DLL version of the runtime lacks these functions (bug!?), but in a + // release build they're replaced with BSWAP instructions anyway. + return (uint16_t)(_byteswap_ushort(Value)); +#else + uint16_t Hi = (uint16_t)((Value) << 8); + uint16_t Lo = (uint16_t)((Value) >> 8); + return Hi | Lo; +#endif +} + +/// ByteSwap_32 - This function returns a byte-swapped representation of the +/// 32-bit argument, Value. +INLINE uint32_t ByteSwap_32(uint32_t Value) { + uint32_t Byte0 = Value & 0x000000FF; + uint32_t Byte1 = Value & 0x0000FF00; + uint32_t Byte2 = Value & 0x00FF0000; + uint32_t Byte3 = Value & 0xFF000000; + return ((Byte0) << 24) | ((Byte1) << 8) | ((Byte2) >> 8) | ((Byte3) >> 24); +} + +/// ByteSwap_64 - This function returns a byte-swapped representation of the +/// 64-bit argument, Value. +INLINE uint64_t ByteSwap_64(uint64_t Value) { + uint64_t Hi = ByteSwap_32(uint32_t(Value)); + uint32_t Lo = ByteSwap_32(uint32_t(Value >> 32)); + return ((Hi) << 32) | Lo; +} + +/// CountLeadingZeros_32 - this function performs the platform optimal form of +/// counting the number of zeros from the most significant bit to the first one +/// bit. Ex. CountLeadingZeros_32(0x00F000FF) == 8. +/// Returns 32 if the word is zero. +INLINE unsigned CountLeadingZeros_32(uint32_t Value) { + unsigned Count; // result +#if __GNUC__ >= 4 + // PowerPC is defined for __builtin_clz(0) +#if !defined(__ppc__) && !defined(__ppc64__) + if (Value == 0) return 32; +#endif + Count = __builtin_clz(Value); +#else + if (Value == 0) return 32; + Count = 0; + // bisecton method for count leading zeros + for (unsigned Shift = 32 >> 1; Shift; Shift >>= 1) { + uint32_t Tmp = (Value) >> (Shift); + if (Tmp) { + Value = Tmp; + } else { + Count |= Shift; + } + } +#endif + return Count; +} + +/// CountLeadingZeros_64 - This function performs the platform optimal form +/// of counting the number of zeros from the most significant bit to the first +/// one bit (64 bit edition.) +/// Returns 64 if the word is zero. +INLINE unsigned CountLeadingZeros_64(uint64_t Value) { + unsigned Count; // result +#if __GNUC__ >= 4 + // PowerPC is defined for __builtin_clzll(0) +#if !defined(__ppc__) && !defined(__ppc64__) + if (!Value) return 64; +#endif + Count = __builtin_clzll(Value); +#else + if (sizeof(long) == sizeof(int64_t)) { + if (!Value) return 64; + Count = 0; + // bisecton method for count leading zeros + for (unsigned Shift = 64 >> 1; Shift; Shift >>= 1) { + uint64_t Tmp = (Value) >> (Shift); + if (Tmp) { + Value = Tmp; + } else { + Count |= Shift; + } + } + } else { + // get hi portion + uint32_t Hi = Hi_32(Value); + + // if some bits in hi portion + if (Hi) { + // leading zeros in hi portion plus all bits in lo portion + Count = CountLeadingZeros_32(Hi); + } else { + // get lo portion + uint32_t Lo = Lo_32(Value); + // same as 32 bit value + Count = CountLeadingZeros_32(Lo)+32; + } + } +#endif + return Count; +} + +/// CountTrailingZeros_64 - This function performs the platform optimal form +/// of counting the number of zeros from the least significant bit to the first +/// one bit (64 bit edition.) +/// Returns 64 if the word is zero. +INLINE unsigned CountTrailingZeros_64(uint64_t Value) { +#if __GNUC__ >= 4 + return (Value != 0) ? __builtin_ctzll(Value) : 64; +#else + static const unsigned Mod67Position[] = { + 64, 0, 1, 39, 2, 15, 40, 23, 3, 12, 16, 59, 41, 19, 24, 54, + 4, 64, 13, 10, 17, 62, 60, 28, 42, 30, 20, 51, 25, 44, 55, + 47, 5, 32, 65, 38, 14, 22, 11, 58, 18, 53, 63, 9, 61, 27, + 29, 50, 43, 46, 31, 37, 21, 57, 52, 8, 26, 49, 45, 36, 56, + 7, 48, 35, 6, 34, 33, 0 + }; + return Mod67Position[(uint64_t)(-(int64_t)Value & (int64_t)Value) % 67]; +#endif +} + +/// CountPopulation_64 - this function counts the number of set bits in a value, +/// (64 bit edition.) +INLINE unsigned CountPopulation_64(uint64_t Value) { +#if __GNUC__ >= 4 + return __builtin_popcountll(Value); +#else + uint64_t v = Value - (((Value) >> 1) & 0x5555555555555555ULL); + v = (v & 0x3333333333333333ULL) + (((v) >> 2) & 0x3333333333333333ULL); + v = (v + ((v) >> 4)) & 0x0F0F0F0F0F0F0F0FULL; + return unsigned((uint64_t)(v * 0x0101010101010101ULL) >> 56); +#endif +} + +#endif // LLVM_SUPPORT_MATHEXTRAS_H + + +#ifndef AP_PRIVATE_H +#define AP_PRIVATE_H + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AESL_std { + template + DataType INLINE min(DataType a, DataType b) { + // if (a >= b) return b; + // else return a; + return (a>=b) ? b : a; + } + + template + DataType INLINE max(DataType a, DataType b) { + // if (a >= b) return a; + // else return b; + return (a>=b) ? a : b; + } +} +enum ap_q_mode { + AP_RND, // rounding to plus infinity + AP_RND_ZERO,// rounding to zero + AP_RND_MIN_INF,// rounding to minus infinity + AP_RND_INF,// rounding to infinity + AP_RND_CONV, // convergent rounding + AP_TRN, // truncation + AP_TRN_ZERO // truncation to zero + +}; +enum ap_o_mode { + AP_SAT, // saturation + AP_SAT_ZERO, // saturation to zero + AP_SAT_SYM, // symmetrical saturation + AP_WRAP, // wrap-around (*) + AP_WRAP_SM // sign magnitude wrap-around (*) +}; + +template struct ap_fixed_base; +template struct af_range_ref; +template struct af_bit_ref; + +template struct ap_range_ref; +template struct ap_bit_ref; +template struct ap_concat_ref; +static bool InvalidDigit(const char* str, unsigned len, unsigned start, unsigned radix) { + unsigned i; + for (i = start; i < len; ++i) + if ((radix == 2 && (str[i] == '0' || str[i] == '1')) || + (radix == 8 && str[i] >= '0' && str[i] <= '7') || + (radix == 10 && str[i] >= '0' && str[i] <= '9') || + (radix == 16 && ((str[i] >= '0' && str[i] <= '9') || + (str[i] >= 'a' && str[i] <= 'f') || + (str[i] >= 'A' && str[i] <= 'F')))) + continue; + else + return true; + return false; +} + +static void ap_parse_sign(const char* str, uint32_t &base, bool &neg) { + if (str[0] == '+' || str[0] == '-') base = 1; + if (str[0] == '-') neg = true; + else neg = false; + return; +} + +static void ap_parse_prefix(const char* str, uint32_t &offset, uint32_t &radix) { + if (str[0] == '0') { + switch (str[1]) { + case 'b': + case 'B': offset = 2; radix = 2; break; + case 'x': + case 'X': offset = 2; radix = 16; break; + case 'd': + case 'D': offset = 2; radix = 10; break; + case 'o': + case 'O': offset = 2; radix = 8; break; + default: break; + } + } + if (offset == 0) + for (int i=0, len = strlen(str); i= 'a') || (str[i] <= 'F' && str[i] >= 'A')) { + radix = 16; + break; + } + return; +} + +/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from +/// the multi-digit integer array, x[], propagating the borrowed 1 value until +/// no further borrowing is neeeded or it runs out of "digits" in x. The result +/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted. +/// In other words, if y > x then this function returns 1, otherwise 0. +/// @returns the borrow out of the subtraction +static bool sub_1(uint64_t x[], uint32_t len, uint64_t y) { + for (uint32_t i = 0; i < len; ++i) { + uint64_t __X = x[i]; + x[i] -= y; + if (y > __X) + y = 1; // We have to "borrow 1" from next "digit" + else { + y = 0; // No need to borrow + break; // Remaining digits are unchanged so exit early + } + } + return (y != 0); +} + + /// This enumeration just provides for internal constants used in this + /// translation unit. + enum { + MIN_INT_BITS = 1, ///< Minimum number of bits that can be specified + ///< Note that this must remain synchronized with IntegerType::MIN_INT_BITS + MAX_INT_BITS = (1<<23)-1 ///< Maximum number of bits that can be specified + ///< Note that this must remain synchronized with IntegerType::MAX_INT_BITS + }; + + /// A utility function for allocating memory and checking for allocation + /// failure. The content is not zeroed. + static uint64_t* getMemory(uint32_t numWords) { + return (uint64_t*) malloc(numWords*sizeof(uint64_t)); + } + + //===----------------------------------------------------------------------===// + // ap_private Class + //===----------------------------------------------------------------------===// + + /// ap_private - This class represents arbitrary precision constant integral values. + /// It is a functional replacement for common case unsigned integer type like + /// "unsigned", "unsigned long" or "uint64_t", but also allows non-byte-width + /// integer sizes and large integer value types such as 3-bits, 15-bits, or more + /// than 64-bits of precision. ap_private provides a variety of arithmetic operators + /// and methods to manipulate integer values of any bit-width. It supports both + /// the typical integer arithmetic and comparison operations as well as bitwise + /// manipulation. + /// + /// The class has several invariants worth noting: + /// * All bit, byte, and word positions are zero-based. + /// * Once the bit width is set, it doesn't change except by the Truncate, + /// SignExtend, or ZeroExtend operations. + /// * All binary operators must be on ap_private instances of the same bit width. + /// Attempting to use these operators on instances with different bit + /// widths will yield an assertion. + /// * The value is stored canonically as an unsigned value. For operations + /// where it makes a difference, there are both signed and unsigned variants + /// of the operation. For example, sdiv and udiv. However, because the bit + /// widths must be the same, operations such as Mul and Add produce the same + /// results regardless of whether the values are interpreted as signed or + /// not. + /// * In general, the class tries to follow the style of computation that LLVM + /// uses in its IR. This simplifies its use for LLVM. + /// + /// @brief Class for arbitrary precision integers. + template class ap_private; + namespace ap_private_ops{ + template + INLINE ap_private<_AP_W, _AP_S, _AP_N> lshr(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t shiftAmt); + template + INLINE ap_private<_AP_W, _AP_S, _AP_N> shl(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t shiftAmt); + } + +#if defined(_MSC_VER) +# if _MSC_VER < 1400 && !defined(for) +# define for if(0);else for +# endif + typedef unsigned __int64 ap_ulong; + typedef signed __int64 ap_slong; +#else + typedef unsigned long long ap_ulong; + typedef signed long long ap_slong; +#endif + template struct retval { + }; + template<> struct retval { + typedef ap_slong Type; + }; + template<> struct retval { + typedef ap_ulong Type; + }; + + template + class ap_private { +#ifdef _MSC_VER +#pragma warning( disable : 4521 4522 ) +#endif +public: + typedef typename retval<_AP_S>::Type ValType; + template friend struct ap_fixed_base; + ///return type of variety of operations + //---------------------------------------------------------- + template + struct RType { + enum { + mult_w = _AP_W+_AP_W2, + mult_s = _AP_S||_AP_S2, + plus_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2))+1, + plus_s = _AP_S||_AP_S2, + minus_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2))+1, + minus_s = true, + div_w = _AP_W+_AP_S2, + div_s = _AP_S||_AP_S2, + mod_w = AP_MIN(_AP_W,_AP_W2+(!_AP_S2&&_AP_S)), + mod_s = _AP_S, + logic_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2)), + logic_s = _AP_S||_AP_S2 + }; + typedef ap_private mult; + typedef ap_private plus; + typedef ap_private minus; + typedef ap_private logic; + typedef ap_private div; + typedef ap_private mod; + typedef ap_private<_AP_W, _AP_S> arg1; + typedef bool reduce; + }; + + INLINE void report() { +#if 0 + if (_AP_W > 1024 && _AP_W <= 4096) { + fprintf(stderr, "[W] W=%d is out of bound (1<=W<=1024): for" + " synthesis: please define macro AP_INT_TYPE_EXT(N)" + " to extend the valid range.\n", _AP_W); + } else +#endif + if (_AP_W > MAX_MODE(AP_INT_MAX_W) * 1024) { + fprintf(stderr, "[E] ap_%sint<%d>: Bitwidth exceeds the " + "default max value %d. Please use macro " + "AP_INT_MAX_W to set a larger max value.\n", + _AP_S?"":"u", _AP_W, + MAX_MODE(AP_INT_MAX_W) * 1024); + exit(1); + } + } + + enum { BitWidth = _AP_W }; + /// This union is used to store the integer value. When the + /// integer bit-width <= 64, it uses VAL, otherwise it uses pVal. + + /// This enum is used to hold the constants we needed for ap_private. + uint64_t VAL; ///< Used to store the <= 64 bits integer value. + uint64_t pVal[_AP_N]; ///< Used to store the >64 bits integer value. + + /// This enum is used to hold the constants we needed for ap_private. + enum { + APINT_BITS_PER_WORD = sizeof(uint64_t) * 8, ///< Bits in a word + APINT_WORD_SIZE = sizeof(uint64_t) ///< Byte size of a word + }; + + enum { excess_bits = (_AP_W%APINT_BITS_PER_WORD) ? APINT_BITS_PER_WORD -(_AP_W%APINT_BITS_PER_WORD) : 0}; + static const uint64_t mask = ((uint64_t)~0ULL >> (excess_bits)); + + /// This constructor is used only internally for speed of construction of + /// temporaries. It is unsafe for general use so it is not public. + /* Constructors */ + + ap_private(const char* val) { + std::string str(val); + uint32_t strLen = str.length(); + const char *strp = str.c_str(); + uint32_t offset = 0; + uint32_t base = 0; + bool neg = false; + uint32_t radix = 16; + ap_parse_sign(strp, base, neg); + ap_parse_prefix(strp + base, offset, radix); + + if ((radix != 10 && neg) || + (strLen - base - offset <= 0) || + InvalidDigit(strp, strLen, base + offset, radix)) { + fprintf(stderr, "invalid character string %s !\n", val); + assert(0); + } + + ap_private ap_private_val(str.c_str(), strLen, radix, base, offset); + if (neg) + ap_private_val = -ap_private_val; + operator = (ap_private_val); + report(); + } + + ap_private(const char* val, int rd) { + std::string str(val); + uint32_t strLen = str.length(); + const char *strp = str.c_str(); + uint32_t offset = 0; + uint32_t base = 0; + uint32_t radix = rd; + bool neg = false; + ap_parse_sign(strp, base, neg); + ap_parse_prefix(strp + base, offset, radix); + + if ((radix != 10 && neg) || + (strLen - base - offset <= 0) || + InvalidDigit(strp, strLen, base + offset, radix)) { + fprintf(stderr, "invalid character string %s !\n", val); + assert(0); + } + + // uint32_t bitsNeeded = ap_private<_AP_W, _AP_S>::getBitsNeeded(strp, strLen, radix); + // ap_private<_AP_W, _AP_S> ap_private_val(bitsNeeded, strp , strLen, radix, base, offset); + ap_private ap_private_val(strp , strLen, radix, base, offset); + if (neg) + ap_private_val = -ap_private_val; + operator = (ap_private_val); + report(); + } + + /// Note that numWords can be smaller or larger than the corresponding bit + /// width but any extraneous bits will be dropped. + /// @param numBits the bit width of the constructed ap_private + /// @param numWords the number of words in bigVal + /// @param bigVal a sequence of words to form the initial value of the ap_private + /// @brief Construct an ap_private of numBits width, initialized as bigVal[]. + ap_private(uint32_t numWords, const uint64_t bigVal[]): VAL(0) { + assert(bigVal && "Null pointer detected!"); + { + // Get memory, cleared to 0 + memset(pVal, 0, _AP_N * sizeof(uint64_t)); + + // Calculate the number of words to copy + uint32_t words = AESL_std::min(numWords, _AP_N); + // Copy the words from bigVal to pVal + memcpy(pVal, bigVal, words * APINT_WORD_SIZE); + if (words >= _AP_W) + clearUnusedBits(); + // Make sure unused high bits are cleared + } + } + + /// This constructor interprets Val as a string in the given radix. The + /// interpretation stops when the first charater that is not suitable for the + /// radix is encountered. Acceptable radix values are 2, 8, 10 and 16. It is + /// an error for the value implied by the string to require more bits than + /// numBits. + /// @param numBits the bit width of the constructed ap_private + /// @param val the string to be interpreted + /// @param radix the radix of Val to use for the intepretation + /// @brief Construct an ap_private from a string representation. + ap_private(const std::string& val, uint8_t radix=2, int base=0, int offset=0): VAL(0) { + assert(!val.empty() && "The input string is empty."); + const char *c_str = val.c_str(); + fromString(c_str+base+offset, val.size()-base-offset, radix); + } + + /// This constructor interprets the slen characters starting at StrStart as + /// a string in the given radix. The interpretation stops when the first + /// character that is not suitable for the radix is encountered. Acceptable + /// radix values are 2, 8, 10 and 16. It is an error for the value implied by + /// the string to require more bits than numBits. + /// @param numBits the bit width of the constructed ap_private + /// @param strStart the start of the string to be interpreted + /// @param slen the maximum number of characters to interpret + /// @param radix the radix to use for the conversion + /// @brief Construct an ap_private from a string representation. + /// This method does not consider whether it is negative or not. + ap_private(const char strStart[], uint32_t slen, uint8_t radix, int base=0, int offset=0) : VAL(0) { + fromString(strStart+base+offset, slen-base-offset, radix); + } + + template + INLINE ap_private(const ap_range_ref<_AP_W2,_AP_S2>& ref) { + *this=ref.get(); + report(); + } + + template + INLINE ap_private(const ap_bit_ref<_AP_W2,_AP_S2>& ref) { + *this = ((uint64_t)(bool)ref); + report(); + } + + template + INLINE ap_private(const ap_concat_ref<_AP_W2, _AP_T2,_AP_W3, _AP_T3>& ref) { + *this=ref.get(); + report(); + } + + template + INLINE ap_private(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2> &val) { + *this = ((val.operator ap_private<_AP_W2, false> ())); + report(); + } + + template + INLINE ap_private(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2> &val) { + *this = (uint64_t)(bool)val; + report(); + } + + /// Simply makes *this a copy of that. + /// @brief Copy Constructor. + template + ap_private(const volatile ap_private<_AP_W1, _AP_S1, _AP_N1>& that): VAL(0) { + operator = (const_cast& >(that)); + } + + template + ap_private(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that): VAL(0) { + operator = (that); + } + + template + explicit ap_private(const ap_private<_AP_W1, _AP_S1, 1>& that): VAL(0) { + static const uint64_t that_sign_ext_mask = (_AP_W1==APINT_BITS_PER_WORD)?0:~0ULL>>(_AP_W1%APINT_BITS_PER_WORD)<<(_AP_W1%APINT_BITS_PER_WORD); + if (that.isNegative()) { + pVal[0] = that.VAL|that_sign_ext_mask; + memset(pVal+1, ~0, sizeof(uint64_t)*(_AP_N-1)); + } else { + pVal[0] = that.VAL; + memset(pVal+1, 0, sizeof(uint64_t)*(_AP_N-1)); + } + clearUnusedBits(); + } + + ap_private(const ap_private& that): VAL(0) { + memcpy(pVal, that.pVal, _AP_N * APINT_WORD_SIZE); + clearUnusedBits(); + } + + /// @brief Destructor. + virtual ~ap_private() {} + + /// Default constructor that creates an uninitialized ap_private. This is useful + /// for object deserialization (pair this with the static method Read). + ap_private(){memset(pVal, 0, sizeof(uint64_t)*(_AP_N));} + + ap_private(uint64_t* val, uint32_t bits=_AP_W) {assert(0);} + ap_private(const uint64_t *const val, uint32_t bits) {assert(0);} + + /// @name Constructors + /// @{ + /// If isSigned is true then val is treated as if it were a signed value + /// (i.e. as an int64_t) and the appropriate sign extension to the bit width + /// will be done. Otherwise, no sign extension occurs (high order bits beyond + /// the range of val are zero filled). + /// @param numBits the bit width of the constructed ap_private + /// @param val the initial value of the ap_private + /// @param isSigned how to treat signedness of val + /// @brief Create a new ap_private of numBits width, initialized as val. +#define CTOR(TYPE, SIGNED) \ + ap_private(TYPE val, bool isSigned=SIGNED) { \ + pVal[0] = val; \ + if (isSigned && int64_t(pVal[0]) < 0) { \ + memset(pVal+1, ~0, sizeof(uint64_t)*(_AP_N-1)); \ + } else { \ + memset(pVal+1, 0, sizeof(uint64_t)*(_AP_N-1)); \ + } \ + clearUnusedBits(); \ + } +#if 1 + CTOR(int, true) + CTOR(bool, false) + CTOR(signed char, true) + CTOR(unsigned char, false) + CTOR(short, true) + CTOR(unsigned short, false) + CTOR(unsigned int, false) + CTOR(long, true) + CTOR(unsigned long, false) + CTOR(unsigned long long, false) + CTOR(long long, true) + CTOR(float, false) + CTOR(double, false) +#undef CTOR +#else + CTOR(uint64_t) +#undef CTOR +#endif + + + /// @returns true if the number of bits <= 64, false otherwise. + /// @brief Determine if this ap_private just has one word to store value. + INLINE bool isSingleWord() const { + return false; + } + + /// @returns the word position for the specified bit position. + /// @brief Determine which word a bit is in. + static uint32_t whichWord(uint32_t bitPosition) { + // return bitPosition / APINT_BITS_PER_WORD; + return (bitPosition) >> 6; + } + + /// @returns the bit position in a word for the specified bit position + /// in the ap_private. + /// @brief Determine which bit in a word a bit is in. + static uint32_t whichBit(uint32_t bitPosition) { + // return bitPosition % APINT_BITS_PER_WORD; + return bitPosition & 0x3f; + } + + /// bit at a specific bit position. This is used to mask the bit in the + /// corresponding word. + /// @returns a uint64_t with only bit at "whichBit(bitPosition)" set + /// @brief Get a single bit mask. + static uint64_t maskBit(uint32_t bitPosition) { + return 1ULL << (whichBit(bitPosition)); + } + + /// @returns the corresponding word for the specified bit position. + /// @brief Get the word corresponding to a bit position + INLINE uint64_t getWord(uint32_t bitPosition) const { + return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; + } + + /// This method is used internally to clear the to "N" bits in the high order + /// word that are not used by the ap_private. This is needed after the most + /// significant word is assigned a value to ensure that those bits are + /// zero'd out. + /// @brief Clear unused high order bits + INLINE void clearUnusedBits(void) { + pVal[_AP_N-1] = _AP_S ? ((((int64_t)pVal[_AP_N-1])<<(excess_bits))>> excess_bits) : (excess_bits ? ((pVal[_AP_N-1])<<(excess_bits))>>(excess_bits) : pVal[_AP_N-1]); + } + + INLINE void clearUnusedBitsToZero(void) { + pVal[_AP_N-1] &= mask; + } + + INLINE void clearUnusedBitsToOne(void) { + pVal[_AP_N-1] |= mask; + } + + /// This is used by the constructors that take string arguments. + /// @brief Convert a char array into an ap_private + INLINE void fromString(const char *strStart, uint32_t slen, + uint8_t radix) ; + + INLINE ap_private read() volatile { + return *this; + } + + INLINE void write(const ap_private& op2) volatile { + *this = (op2); + } + + //Explicit conversions to C interger types + //----------------------------------------------------------- + operator ValType() const { + return getVal(); + } + + INLINE ValType getVal() const{ + return *pVal; + } + + INLINE int to_int() const { + return int(*this); + } + + INLINE unsigned to_uint() const { + return (unsigned) getVal(); + } + + INLINE long to_long() const { + return (long) getVal(); + } + + INLINE unsigned long to_ulong() const { + return (unsigned long) getVal(); + } + + INLINE ap_slong to_int64() const { + return (ap_slong) getVal(); + } + + INLINE ap_ulong to_uint64() const { + return (ap_ulong) getVal(); + } + + INLINE double to_double() const { + if (isNegative()) + return roundToDouble(true); + else + return roundToDouble(false); + } + + INLINE unsigned length() const { return _AP_W; } + + /*Reverse the contents of ap_private instance. I.e. LSB becomes MSB and vise versa*/ + INLINE ap_private& reverse () { + for (int i = 0; i < _AP_W/2; ++i) { + bool tmp = operator[](i); + if (operator[](_AP_W - 1 - i)) + set(i); + else + clear(i); + if (tmp) + set(_AP_W - 1 - i); + else + clear(_AP_W - 1 - i); + } + clearUnusedBits(); + return *this; + } + + /*Return true if the value of ap_private instance is zero*/ + INLINE bool iszero () const { + return isMinValue(); + } + + /* x < 0 */ + INLINE bool sign () const { + if (isNegative()) + return true; + return false; + } + + /* x[i] = !x[i] */ + INLINE void invert (int i) { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + flip(i); + } + + /* x[i] */ + INLINE bool test (int i) const { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + return operator[](i); + } + + //Set the ith bit into v + INLINE void set (int i, bool v) { + assert( i >= 0 && "Attempting to write bit with negative index"); + assert( i < _AP_W && "Attempting to write bit beyond MSB"); + v ? set(i) : clear(i); + } + + //Set the ith bit into v + INLINE void set_bit (int i, bool v) { + assert( i >= 0 && "Attempting to write bit with negative index"); + assert( i < _AP_W && "Attempting to write bit beyond MSB"); + v ? set(i) : clear(i); + } + + INLINE ap_private& set(uint32_t bitPosition) { + pVal[whichWord(bitPosition)] |= maskBit(bitPosition); + clearUnusedBits(); + return *this; + } + + INLINE void set() { + for (uint32_t i = 0; i < _AP_N; ++i) + pVal[i] = ~0ULL; + clearUnusedBits(); + } + + //Get the value of ith bit + INLINE bool get (int i) const { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + return operator [](i); + } + + //Get the value of ith bit + INLINE bool get_bit (int i) const { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + return operator [](i); + } + + //This is used for sc_lv and sc_bv, which is implemented by sc_uint + //Rotate an ap_private object n places to the left + INLINE void lrotate(int n) { + assert( n >= 0 && "Attempting to shift negative index"); + assert( n < _AP_W && "Shift value larger than bit width"); + operator = (shl(n) | lshr(_AP_W - n)); + } + + //This is used for sc_lv and sc_bv, which is implemented by sc_uint + //Rotate an ap_private object n places to the right + INLINE void rrotate(int n) { + assert( n >= 0 && "Attempting to shift negative index"); + assert( n < _AP_W && "Shift value larger than bit width"); + operator = (lshr(n) | shl(_AP_W - n)); + } + + /// Set the given bit to 0 whose position is given as "bitPosition". + /// @brief Set a given bit to 0. + ap_private& clear(uint32_t bitPosition) { + pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition); + clearUnusedBits(); + return *this; + } + + /// @brief Set every bit to 0. + void clear() { + memset(pVal, 0, _AP_N * APINT_WORD_SIZE); + } + + /// @brief Toggle every bit to its opposite value. + ap_private& flip() { + for (uint32_t i = 0; i < _AP_N; ++i) + pVal[i] ^= ~0ULL; + clearUnusedBits(); + return *this; + } + + /// Toggle a given bit to its opposite value whose position is given + /// as "bitPosition". + /// @brief Toggles a given bit to its opposite value. + ap_private& flip(uint32_t bitPosition) { + assert(bitPosition < BitWidth && "Out of the bit-width range!"); + if ((*this)[bitPosition]) clear(bitPosition); + else set(bitPosition); + return *this; + } + + //complements every bit + INLINE void b_not() { + flip(); + } + + ap_private getLoBits(uint32_t numBits) const { + return ap_private_ops::lshr(ap_private_ops::shl(*this, _AP_W - numBits), + _AP_W - numBits); + } + + ap_private getHiBits(uint32_t numBits) const { + return ap_private_ops::lshr(*this, _AP_W - numBits); + } + + //Binary Arithmetic + //----------------------------------------------------------- + + template + INLINE ap_private + operator & (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this & a2.get(); + } + + template + INLINE ap_private + operator | (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this | a2.get(); + } + + template + INLINE ap_private + operator ^ (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this ^ a2.get(); + } + + + ///Arithmetic assign + //------------------------------------------------------------- + +#define OP_BIN_LOGIC_ASSIGN_AP(Sym) \ + template \ + INLINE ap_private& operator Sym(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { \ + uint32_t numWords = AESL_std::min(_AP_N, _AP_N1); \ + uint32_t i; \ + for (i = 0; i < numWords; ++i) \ + pVal[i] Sym RHS.pVal[i]; \ + if (_AP_N1 < _AP_N) { \ + uint64_t ext = RHS.isNegative()?~0ULL:0; \ + for (;i<_AP_N; i++) \ + pVal[i] Sym ext; \ + } \ + clearUnusedBits(); \ + return *this; \ + } + + OP_BIN_LOGIC_ASSIGN_AP(&=); + OP_BIN_LOGIC_ASSIGN_AP(|=); + OP_BIN_LOGIC_ASSIGN_AP(^=); +#undef OP_BIN_LOGIC_ASSIGN_AP + + /// Adds the RHS APint to this ap_private. + /// @returns this, after addition of RHS. + /// @brief Addition assignment operator. + template + INLINE ap_private& operator+=(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + add(pVal, pVal, RHS.pVal, _AP_N, _AP_N, _AP_N1, _AP_S, _AP_S1); + clearUnusedBits(); + return *this; + } + + template + INLINE ap_private& operator-=(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + sub(pVal, pVal, RHS.pVal, _AP_N, _AP_N, _AP_N1, _AP_S, _AP_S1); + clearUnusedBits(); + return *this; + } + + template + ap_private& operator*=(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + // Get some bit facts about LHS and check for zero + uint32_t lhsBits = getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1; + if (!lhsWords) { + // 0 * X ===> 0 + return *this; + } + + ap_private dupRHS = RHS; + // Get some bit facts about RHS and check for zero + uint32_t rhsBits = dupRHS.getActiveBits(); + uint32_t rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1; + if (!rhsWords) { + // X * 0 ===> 0 + clear(); + return *this; + } + + // Allocate space for the result + uint32_t destWords = rhsWords + lhsWords; + uint64_t *dest = getMemory(destWords); + + // Perform the long multiply + mul(dest, pVal, lhsWords, dupRHS.pVal, rhsWords, destWords); + + // Copy result back into *this + clear(); + uint32_t wordsToCopy = destWords >= _AP_N ? _AP_N : destWords; + + memcpy(pVal, dest, wordsToCopy* APINT_WORD_SIZE); + + uint64_t ext = (isNegative() ^ RHS.isNegative()) ? ~0ULL : 0ULL; + for (int i=wordsToCopy; i<_AP_N; i++) + pVal[i]=ext; + clearUnusedBits(); + // delete dest array and return + free(dest); + return *this; + } + +#define OP_ASSIGN_AP(Sym) \ + template \ + INLINE ap_private& operator Sym##=(const ap_private<_AP_W2,_AP_S2>& op) \ + { \ + *this=operator Sym (op); \ + return *this; \ + } \ + + OP_ASSIGN_AP(/) + OP_ASSIGN_AP(%) +#undef OP_ASSIGN_AP + +#define OP_BIN_LOGIC_AP(Sym) \ + template \ + INLINE \ + typename RType<_AP_W1, _AP_S1>::logic \ + operator Sym (const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) const { \ + enum { numWords = (RType<_AP_W1, _AP_S1>::logic_w +APINT_BITS_PER_WORD-1)/APINT_BITS_PER_WORD}; \ + typename RType<_AP_W1, _AP_S1>::logic Result; \ + uint64_t *val = Result.pVal; \ + uint32_t i; \ + uint32_t min_N = std::min(_AP_N, _AP_N1); \ + uint32_t max_N = std::max(_AP_N, _AP_N1); \ + for (i = 0; i < min_N; ++i) \ + val[i] = pVal[i] Sym RHS.pVal[i]; \ + if (numWords > i) { \ + const uint64_t* tmpVal = (_AP_N>_AP_N1 ? pVal : RHS.pVal)+i; \ + uint64_t ext = ((_AP_N<_AP_N1 && isNegative() )||(_AP_N1 < _AP_N && RHS.isNegative())) ? ~0ULL : 0; \ + for (;i i) { \ + uint64_t ext2 = ((_AP_N>_AP_N1 && isNegative() )||(_AP_N1 > _AP_N && RHS.isNegative())) ? ~0ULL : 0; \ + val[i] = ext Sym ext2; \ + } \ + } \ + Result.clearUnusedBits(); \ + return Result; \ + } + + OP_BIN_LOGIC_AP(|); + OP_BIN_LOGIC_AP(&); + OP_BIN_LOGIC_AP(^); + +#undef OP_BIN_LOGIC_AP + + template + INLINE typename RType<_AP_W1,_AP_S1>::plus operator+(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) const { + // assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); + typename RType<_AP_W1,_AP_S1>::plus Result; + bool carry = add(Result.pVal, this->pVal, RHS.pVal, (RType<_AP_W1,_AP_S1>::plus_w + 63) / 64, _AP_N, _AP_N1, _AP_S, _AP_S1); + if ((RType<_AP_W1,_AP_S1>::plus_w + 63) / 64> std::max(_AP_W, _AP_W1) ) + Result.pVal[(RType<_AP_W1,_AP_S1>::plus_w + 63)/64 - 1] = carry; + Result.clearUnusedBits(); + return Result; + } + + template + INLINE typename RType<_AP_W1,_AP_S1>::minus operator-(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) const { + typename RType<_AP_W1,_AP_S1>::minus Result; + bool borrow = sub(Result.pVal, this->pVal, RHS.pVal, (RType<_AP_W1,_AP_S1>::minus_w + 63) / 64, _AP_N, _AP_N1, _AP_S, _AP_S1); + if ((RType<_AP_W1,_AP_S1>::minus_w + 63) / 64 > AESL_std::max(_AP_W, _AP_W1) ) { + Result.pVal[(RType<_AP_W1,_AP_S1>::minus_w+63)/64 - 1] = borrow; + } + Result.clearUnusedBits(); + return Result; + } + + template + typename RType<_AP_W1, _AP_S1>::mult operator*(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) const { + + // Get some bit facts about LHS and check for zero + uint32_t lhsBits = getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1; + if (!lhsWords) + // 0 * X ===> 0 + return typename RType<_AP_W1, _AP_S1>::mult(); + + // Get some bit facts about RHS and check for zero + uint32_t rhsBits = RHS.getActiveBits(); + uint32_t rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1; + if (!rhsWords) { + // X * 0 ===> 0 + return typename RType<_AP_W1, _AP_S1>::mult(); + } + + //extend size to avoid result loss + typename RType<_AP_W1, _AP_S1>::mult dupLHS = *this; + typename RType<_AP_W1, _AP_S1>::mult dupRHS = RHS; + lhsBits = dupLHS.getActiveBits(); + lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1; + rhsBits = dupRHS.getActiveBits(); + rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1; + + // Allocate space for the result + enum { destWords =(RType<_AP_W1, _AP_S1>::mult_w+APINT_BITS_PER_WORD-1)/APINT_BITS_PER_WORD}; + int destw = destWords; + typename RType<_AP_W1, _AP_S1>::mult Result; + uint64_t *dest = Result.pVal; + uint64_t ext = (isNegative() ^ RHS.isNegative()) ? ~0ULL : 0; + + // Perform the long multiply + mul(dest, dupLHS.pVal, lhsWords, dupRHS.pVal, rhsWords, destWords); + + for (int i=lhsWords+rhsWords; i + INLINE typename RType<_AP_W2,_AP_S2>::div + operator / (const ap_private<_AP_W2,_AP_S2>& op) const { + ap_private lhs=ap_private(*this); + ap_private rhs=ap_private(op); + return typename RType<_AP_W2,_AP_S2>::div((_AP_S||_AP_S2)?lhs.sdiv(rhs):lhs.udiv(rhs)); + } + + template + INLINE typename RType<_AP_W2,_AP_S2>::mod + operator % (const ap_private<_AP_W2,_AP_S2>& op) const { + ap_private lhs=*this; + ap_private rhs= op; + typename RType<_AP_W2,_AP_S2>::mod res = typename RType<_AP_W2,_AP_S2>::mod(_AP_S?lhs.srem(rhs):lhs.urem(rhs)); + return res; + } + + template + INLINE ap_private + operator << (const ap_private<_AP_W2, _AP_S2>& op2) const { + uint32_t sh=op2.to_uint(); + return *this << sh; + } + + INLINE ap_private + operator << (uint32_t sh) const { + ap_private r(*this); + bool overflow=(sh>=length()); + if(overflow) + r.clear(); + else + r = ap_private(r.shl(sh)); + return r; + } + + template + INLINE ap_private + operator >> (const ap_private<_AP_W2, _AP_S2>& op2) const { + uint32_t sh = op2.to_uint(); + return *this >> sh; + } + + INLINE ap_private + operator >> (uint32_t sh) const { + ap_private r(*this); + bool overflow=(sh>=_AP_W); + bool neg_v=r.isNegative(); + if(_AP_S) { + if(overflow) + neg_v?r.set():r.clear(); + else + return r.ashr(sh); + } else { + if(overflow) + r.clear(); + else + return r.lshr(sh); + } + return r; + } + + ///Shift assign + //------------------------------------------------------------------ +#define OP_ASSIGN_AP(Sym) \ + template \ + INLINE ap_private& operator Sym##=(int op) \ + { \ + *this = operator Sym (op); \ + return *this; \ + } \ + INLINE ap_private& operator Sym##=(unsigned int op) \ + { \ + *this = operator Sym (op); \ + return *this; \ + } \ + template \ + INLINE ap_private& operator Sym##=(const ap_private<_AP_W2,_AP_S2>& op) \ + { \ + *this = operator Sym (op); \ + return *this; \ + } + OP_ASSIGN_AP(>>) + OP_ASSIGN_AP(<<) +#undef OP_ASSIGN_AP + ///Comparisons + //----------------------------------------------------------------- + bool operator==(const ap_private& RHS) const { + // Get some facts about the number of bits used in the two operands. + uint32_t n1 = getActiveBits(); + uint32_t n2 = RHS.getActiveBits(); + + // If the number of bits isn't the same, they aren't equal + if (n1 != n2) + return false; + + // If the number of bits fits in a word, we only need to compare the low word. + if (n1 <= APINT_BITS_PER_WORD) + return pVal[0] == RHS.pVal[0]; + + // Otherwise, compare everything + for (int i = whichWord(n1 - 1); i >= 0; --i) + if (pVal[i] != RHS.pVal[i]) + return false; + return true; + } + + template + INLINE bool operator == (const ap_private<_AP_W2, _AP_S2>& op) const { + enum { _AP_MAX_W = AP_MAX(_AP_W+(_AP_S||_AP_S2),_AP_W2+(_AP_S||_AP_S2))}; + ap_private<_AP_MAX_W, _AP_S|_AP_S2> lhs(*this); + ap_private<_AP_MAX_W, _AP_S|_AP_S2> rhs(op); + return lhs==rhs; + } + + bool operator==(uint64_t Val) const { + uint32_t n = getActiveBits(); + if (n <= APINT_BITS_PER_WORD) + return pVal[0] == Val; + else + return false; + } + + template + INLINE bool operator != (const ap_private<_AP_W2, _AP_S2>& op) const { + return !(*this==op); + } + + template + INLINE bool operator!=(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return !((*this) == RHS); + } + + INLINE bool operator!=(uint64_t Val) const { + return !((*this) == Val); + } + + + template + INLINE bool operator <= (const ap_private<_AP_W2,_AP_S2>& op) const { + return !(*this>op); + } + + INLINE bool operator <(const ap_private& op) const { + return _AP_S ? slt(op):ult(op); + } + + template + INLINE bool operator < (const ap_private<_AP_W2, _AP_S2>& op) const { + enum { _AP_MAX_W = AP_MAX(_AP_W+(_AP_S||_AP_S2),_AP_W2+(_AP_S||_AP_S2))}; + ap_private<_AP_MAX_W, _AP_S> lhs(*this); + ap_private<_AP_MAX_W, _AP_S2> rhs(op); + if (_AP_S == _AP_S2) + return _AP_S?lhs.slt(rhs):lhs.ult(rhs); + else + if (_AP_S) + if (_AP_W2 >= _AP_W) + return lhs.ult(rhs); + else + return lhs.slt(rhs); + else + if (_AP_W >= _AP_W2) + return lhs.ult(rhs); + else + return lhs.slt(rhs); + } + + template + INLINE bool operator >=(const ap_private<_AP_W2,_AP_S2>& op) const { + return !(*this + INLINE bool operator > (const ap_private<_AP_W2, _AP_S2>& op) const { + enum { _AP_MAX_W = AP_MAX(_AP_W+(_AP_S||_AP_S2),_AP_W2+(_AP_S||_AP_S2))}; + ap_private<_AP_MAX_W, _AP_S> lhs(*this); + ap_private<_AP_MAX_W, _AP_S2> rhs(op); + if (_AP_S == _AP_S2) + return _AP_S?lhs.sgt(rhs):lhs.ugt(rhs); + else + if (_AP_S) + if (_AP_W2 >= _AP_W) + return lhs.ugt(rhs); + else + return lhs.sgt(rhs); + else + if (_AP_W >= _AP_W2) + return lhs.ugt(rhs); + else + return lhs.sgt(rhs); + } + + ///Bit and Part Select + //-------------------------------------------------------------- + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (int Hi, int Lo) const { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(const_cast*>(this), Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + range (int Hi, int Lo) const { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>((const_cast*> (this)), Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + range (int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + range (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + range (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(const_cast(this), Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + return this->range(Hi, Lo); + } + + INLINE ap_bit_ref<_AP_W,_AP_S> operator [] (uint32_t index) { + assert(index >= 0&&"Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index ); + } + + template + INLINE ap_bit_ref<_AP_W,_AP_S> operator [] (const ap_private<_AP_W2,_AP_S2> &index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index.to_int() ); + } + + template + INLINE bool operator [] (const ap_private<_AP_W2,_AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br =operator [] (index); + return br.to_bool(); + } + + INLINE bool operator [](uint32_t bitPosition) const { + return (maskBit(bitPosition) & (pVal[whichWord(bitPosition)])) != 0; + } + + INLINE ap_bit_ref<_AP_W,_AP_S> bit (int index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index ); + } + + template + INLINE ap_bit_ref<_AP_W,_AP_S> bit (const ap_private<_AP_W2,_AP_S2> &index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W &&"Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index.to_int() ); + } + + INLINE bool bit (int index) const { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br(const_cast*>(this), index); + return br.to_bool(); + } + + template + INLINE bool bit (const ap_private<_AP_W2,_AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br = bit(index); + return br.to_bool(); + } + + template + INLINE ap_concat_ref<_AP_W,ap_private<_AP_W, _AP_S>,_AP_W2,ap_private<_AP_W2,_AP_S2> > concat(ap_private<_AP_W2,_AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_private<_AP_W2,_AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W,ap_private<_AP_W, _AP_S>,_AP_W2,ap_private<_AP_W2,_AP_S2> > concat(const ap_private<_AP_W2,_AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_private<_AP_W2,_AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(const_cast& >(*this), a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (const ap_private<_AP_W2, _AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(*this, const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (const ap_private<_AP_W2, _AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(const_cast& >(*this), const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (const ap_range_ref<_AP_W2, _AP_S2> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (ap_range_ref<_AP_W2, _AP_S2> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (const ap_bit_ref<_AP_W2, _AP_S2> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (ap_bit_ref<_AP_W2, _AP_S2> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(*this, a2); + } + + template + INLINE + ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE + ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) const { + return ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, a2); + } + + INLINE ap_private<_AP_W,false> get() const { + ap_private<_AP_W,false> ret(*this); + return ret; + } + + template + INLINE void set(const ap_private<_AP_W3, false> & val) { + operator = (ap_private<_AP_W3, _AP_S>(val)); + } + + /// @} + /// @name Value Tests + /// @{ + /// This tests the high bit of this ap_private to determine if it is set. + /// @returns true if this ap_private is negative, false otherwise + /// @brief Determine sign of this ap_private. + INLINE bool isNegative() const { + //just for get rid of warnings + enum {shift = (_AP_W-APINT_BITS_PER_WORD*(_AP_N-1)-1)}; + static const uint64_t mask = 1ULL << (shift); + return _AP_S && (pVal[_AP_N-1]&mask); + } + + /// This tests the high bit of the ap_private to determine if it is unset. + /// @brief Determine if this ap_private Value is positive (not negative). + INLINE bool isPositive() const { + return !isNegative(); + } + + /// This tests if the value of this ap_private is strictly positive (> 0). + /// @returns true if this ap_private is Positive and not zero. + /// @brief Determine if this ap_private Value is strictly positive. + INLINE bool isStrictlyPositive() const { + return isPositive() && (*this) != 0; + } + + /// This checks to see if the value has all bits of the ap_private are set or not. + /// @brief Determine if all bits are set + INLINE bool isAllOnesValue() const { + return countPopulation() == _AP_W; + } + + /// This checks to see if the value of this ap_private is the maximum unsigned + /// value for the ap_private's bit width. + /// @brief Determine if this is the largest unsigned value. + INLINE bool isMaxValue() const { + return countPopulation() == _AP_W; + } + + /// This checks to see if the value of this ap_private is the maximum signed + /// value for the ap_private's bit width. + /// @brief Determine if this is the largest signed value. + INLINE bool isMaxSignedValue() const { + return BitWidth == 1 ? VAL == 0 : + !isNegative() && countPopulation() == _AP_W - 1; + } + + /// This checks to see if the value of this ap_private is the minimum unsigned + /// value for the ap_private's bit width. + /// @brief Determine if this is the smallest unsigned value. + INLINE bool isMinValue() const { + return countPopulation() == 0; + } + + /// This checks to see if the value of this ap_private is the minimum signed + /// value for the ap_private's bit width. + /// @brief Determine if this is the smallest signed value. + INLINE bool isMinSignedValue() const { + return BitWidth == 1 ? VAL == 1 : + isNegative() && countPopulation() == 1; + } + + /// This function returns a pointer to the internal storage of the ap_private. + /// This is useful for writing out the ap_private in binary form without any + /// conversions. + INLINE const uint64_t* getRawData() const { + if (isSingleWord()) + return &VAL; + return &pVal[0]; + } + + ap_private sqrt() const; + + /// @} + /// @Assignment Operators + /// @{ + /// @returns *this after assignment of RHS. + /// @brief Copy assignment operator. + INLINE ap_private& operator=(const ap_private& RHS) { + if (this != &RHS) + memcpy(pVal, RHS.pVal, _AP_N * APINT_WORD_SIZE); + return *this; + } + INLINE ap_private& operator=(const volatile ap_private& RHS) { + if (this != &RHS) + for (int i=0; i<_AP_N; ++i) + pVal[i] = RHS.pVal[i]; + return *this; + } + INLINE volatile ap_private& operator=(const ap_private& RHS) volatile { + if (this != &RHS) + for (int i=0; i<_AP_N; ++i) + pVal[i] = RHS.pVal[i]; + return *this; + } + INLINE volatile ap_private& operator=(const volatile ap_private& RHS) volatile { + if (this != &RHS) + for (int i=0; i<_AP_N; ++i) + pVal[i] = RHS.pVal[i]; + return *this; + } + + template + INLINE ap_private& operator=(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + if (_AP_S1) + cpSextOrTrunc(RHS); + else + cpZextOrTrunc(RHS); + clearUnusedBits(); + return *this; + } + + template + INLINE ap_private& operator=(const volatile ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + if (_AP_S1) + cpSextOrTrunc(RHS); + else + cpZextOrTrunc(RHS); + clearUnusedBits(); + return *this; + } + + template + INLINE ap_private& operator=(const ap_private<_AP_W1, _AP_S1, 1>& RHS) { + static const uint64_t that_sign_ext_mask = (_AP_W1==APINT_BITS_PER_WORD)?0:~0ULL>>(_AP_W1%APINT_BITS_PER_WORD)<<(_AP_W1%APINT_BITS_PER_WORD); + if (RHS.isNegative()) { + pVal[0] = RHS.VAL | that_sign_ext_mask; + memset(pVal+1,~0, APINT_WORD_SIZE*(_AP_N-1)); + } else { + pVal[0] = RHS.VAL; + memset(pVal+1, 0, APINT_WORD_SIZE*(_AP_N-1)); + } + clearUnusedBits(); + return *this; + } + + template + INLINE ap_private& operator=(const volatile ap_private<_AP_W1, _AP_S1, 1>& RHS) { + static const uint64_t that_sign_ext_mask = (_AP_W1==APINT_BITS_PER_WORD)?0:~0ULL>>(_AP_W1%APINT_BITS_PER_WORD)<<(_AP_W1%APINT_BITS_PER_WORD); + if (RHS.isNegative()) { + pVal[0] = RHS.VAL | that_sign_ext_mask; + memset(pVal+1,~0, APINT_WORD_SIZE*(_AP_N-1)); + } else { + pVal[0] = RHS.VAL; + memset(pVal+1, 0, APINT_WORD_SIZE*(_AP_N-1)); + } + clearUnusedBits(); + return *this; + } + + /// @} + /// @name Unary Operators + /// @{ + /// @returns a new ap_private value representing *this incremented by one + /// @brief Postfix increment operator. + INLINE const ap_private operator++(int) { + ap_private API(*this); + ++(*this); + return API; + } + + /// @returns *this incremented by one + /// @brief Prefix increment operator. + INLINE ap_private& operator++() { + add_1(pVal, pVal, _AP_N, 1); + clearUnusedBits(); + return *this; + } + + /// @returns a new ap_private representing *this decremented by one. + /// @brief Postfix decrement operator. + INLINE const ap_private operator--(int) { + ap_private API(*this); + --(*this); + return API; + } + + /// @returns *this decremented by one. + /// @brief Prefix decrement operator. + INLINE ap_private& operator--() { + sub_1(pVal, _AP_N, 1); + clearUnusedBits(); + return *this; + } + + /// Performs a bitwise complement operation on this ap_private. + /// @returns an ap_private that is the bitwise complement of *this + /// @brief Unary bitwise complement operator. + INLINE ap_private operator~() const { + ap_private Result(*this); + Result.flip(); + return Result; + } + + /// Negates *this using two's complement logic. + /// @returns An ap_private value representing the negation of *this. + /// @brief Unary negation operator + INLINE typename RType<1,false>::minus operator-() const { + return ap_private<1,false>(0) - (*this); + } + + /// Performs logical negation operation on this ap_private. + /// @returns true if *this is zero, false otherwise. + /// @brief Logical negation operator. + INLINE bool operator !() const { + for (uint32_t i = 0; i < _AP_N; ++i) + if (pVal[i]) + return false; + return true; + } + + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> And(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return this->operator&(RHS); + } + template + INLINE ap_private Or(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return this->operator|(RHS); + } + template + ap_private Xor(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return this->operator^(RHS); + } + + ap_private Mul(const ap_private& RHS) const { + ap_private Result(*this); + Result *= RHS; + return Result; + } + + ap_private Add(const ap_private& RHS) const { + ap_private Result(0); + bool carry = add(Result.pVal, this->pVal, RHS.pVal, _AP_N, _AP_N, _AP_N, _AP_S, _AP_S); + Result.clearUnusedBits(); + return Result; + } + + ap_private Sub(const ap_private& RHS) const { + ap_private Result(0); + sub(Result.pVal, this->pVal, RHS.pVal, _AP_N, _AP_N, _AP_N, _AP_S, _AP_S); + Result.clearUnusedBits(); + return Result; + } + + /// Arithmetic right-shift this ap_private by shiftAmt. + /// @brief Arithmetic right-shift function. + ap_private ashr(uint32_t shiftAmt) const { + assert(shiftAmt <= BitWidth && "Invalid shift amount, too big"); + // Handle a degenerate case + if (shiftAmt == 0) + return *this; + + // Handle single word shifts with built-in ashr + if (isSingleWord()) { + if (shiftAmt == BitWidth) + return ap_private(/*BitWidth, 0*/); // undefined + else { + uint32_t SignBit = APINT_BITS_PER_WORD - BitWidth; + return ap_private(/*BitWidth,*/ + (((int64_t(VAL) << (SignBit)) >> (SignBit)) >> (shiftAmt))); + } + } + + // If all the bits were shifted out, the result is, technically, undefined. + // We return -1 if it was negative, 0 otherwise. We check this early to avoid + // issues in the algorithm below. + if (shiftAmt == BitWidth) { + if (isNegative()) + return ap_private(-1); + else + return ap_private(0); + } + + // Create some space for the result. + ap_private Retval(0); + uint64_t * val = Retval.pVal; + + // Compute some values needed by the following shift algorithms + uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word + uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift + uint32_t breakWord = _AP_N - 1 - offset; // last word affected + uint32_t bitsInWord = whichBit(BitWidth); // how many bits in last word? + if (bitsInWord == 0) + bitsInWord = APINT_BITS_PER_WORD; + + // If we are shifting whole words, just move whole words + if (wordShift == 0) { + // Move the words containing significant bits + for (uint32_t i = 0; i <= breakWord; ++i) + val[i] = pVal[i+offset]; // move whole word + + // Adjust the top significant word for sign bit fill, if negative + if (isNegative()) + if (bitsInWord < APINT_BITS_PER_WORD) + val[breakWord] |= ~0ULL << (bitsInWord); // set high bits + } else { + // Shift the low order words + for (uint32_t i = 0; i < breakWord; ++i) { + // This combines the shifted corresponding word with the low bits from + // the next word (shifted into this word's high bits). + val[i] = ((pVal[i+offset]) >> (wordShift)); + val[i] |= ((pVal[i+offset+1]) << (APINT_BITS_PER_WORD - wordShift)); + } + + // Shift the break word. In this case there are no bits from the next word + // to include in this word. + val[breakWord] = (pVal[breakWord+offset]) >> (wordShift); + + // Deal with sign extenstion in the break word, and possibly the word before + // it. + if (isNegative()) { + if (wordShift > bitsInWord) { + if (breakWord > 0) + val[breakWord-1] |= + ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord)); + val[breakWord] |= ~0ULL; + } else + val[breakWord] |= (~0ULL << (bitsInWord - wordShift)); + } + } + + // Remaining words are 0 or -1, just assign them. + uint64_t fillValue = (isNegative() ? ~0ULL : 0); + for (uint32_t i = breakWord+1; i < _AP_N; ++i) + val[i] = fillValue; + Retval.clearUnusedBits(); + return Retval; + } + + /// Logical right-shift this ap_private by shiftAmt. + /// @brief Logical right-shift function. + ap_private lshr(uint32_t shiftAmt) const { + if (isSingleWord()) { + if (shiftAmt == BitWidth) + return ap_private(0); + else + return ap_private((this->VAL) >> (shiftAmt)); + } + + // If all the bits were shifted out, the result is 0. This avoids issues + // with shifting by the size of the integer type, which produces undefined + // results. We define these "undefined results" to always be 0. + if (shiftAmt == BitWidth) + return ap_private(0); + + // If none of the bits are shifted out, the result is *this. This avoids + // issues with shifting byt he size of the integer type, which produces + // undefined results in the code below. This is also an optimization. + if (shiftAmt == 0) + return *this; + + // Create some space for the result. + ap_private Retval(0); + uint64_t * val = Retval.pVal; + + // If we are shifting less than a word, compute the shift with a simple carry + if (shiftAmt < APINT_BITS_PER_WORD) { + uint64_t carry = 0; + for (int i = _AP_N-1; i >= 0; --i) { + val[i] = ((pVal[i]) >> (shiftAmt)) | carry; + carry = (pVal[i]) << (APINT_BITS_PER_WORD - shiftAmt); + } + Retval.clearUnusedBits(); + return Retval; + } + + // Compute some values needed by the remaining shift algorithms + uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; + uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; + + // If we are shifting whole words, just move whole words + if (wordShift == 0) { + for (uint32_t i = 0; i < _AP_N - offset; ++i) + val[i] = pVal[i+offset]; + for (uint32_t i = _AP_N-offset; i < _AP_N; i++) + val[i] = 0; + Retval.clearUnusedBits(); + return Retval; + } + + // Shift the low order words + uint32_t breakWord = _AP_N - offset -1; + for (uint32_t i = 0; i < breakWord; ++i) + val[i] = ((pVal[i+offset]) >> (wordShift)) | + ((pVal[i+offset+1]) << (APINT_BITS_PER_WORD - wordShift)); + // Shift the break word. + val[breakWord] = (pVal[breakWord+offset]) >> (wordShift); + + // Remaining words are 0 + for (uint32_t i = breakWord+1; i < _AP_N; ++i) + val[i] = 0; + Retval.clearUnusedBits(); + return Retval; + } + + /// Left-shift this ap_private by shiftAmt. + /// @brief Left-shift function. + ap_private shl(uint32_t shiftAmt) const { + assert(shiftAmt <= BitWidth && "Invalid shift amount, too big"); + if (isSingleWord()) { + if (shiftAmt == BitWidth) + return ap_private(0); // avoid undefined shift results + return ap_private((VAL) << (shiftAmt)); + } + + // If all the bits were shifted out, the result is 0. This avoids issues + // with shifting by the size of the integer type, which produces undefined + // results. We define these "undefined results" to always be 0. + if (shiftAmt == BitWidth) + return ap_private(0); + + // If none of the bits are shifted out, the result is *this. This avoids a + // lshr by the words size in the loop below which can produce incorrect + // results. It also avoids the expensive computation below for a common case. + if (shiftAmt == 0) + return *this; + + // Create some space for the result. + ap_private Retval(0); + uint64_t* val = Retval.pVal; + // If we are shifting less than a word, do it the easy way + if (shiftAmt < APINT_BITS_PER_WORD) { + uint64_t carry = 0; + for (uint32_t i = 0; i < _AP_N; i++) { + val[i] = ((pVal[i]) << (shiftAmt)) | carry; + carry = (pVal[i]) >> (APINT_BITS_PER_WORD - shiftAmt); + } + Retval.clearUnusedBits(); + return Retval; + } + + // Compute some values needed by the remaining shift algorithms + uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; + uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; + + // If we are shifting whole words, just move whole words + if (wordShift == 0) { + for (uint32_t i = 0; i < offset; i++) + val[i] = 0; + for (uint32_t i = offset; i < _AP_N; i++) + val[i] = pVal[i-offset]; + Retval.clearUnusedBits(); + return Retval; + } + + // Copy whole words from this to Result. + uint32_t i = _AP_N - 1; + for (; i > offset; --i) + val[i] = (pVal[i-offset]) << (wordShift) | + (pVal[i-offset-1]) >> (APINT_BITS_PER_WORD - wordShift); + val[offset] = (pVal[0]) << (wordShift); + for (i = 0; i < offset; ++i) + val[i] = 0; + Retval.clearUnusedBits(); + return Retval; + } + + INLINE ap_private rotl(uint32_t rotateAmt) const { + if (rotateAmt == 0) + return *this; + // Don't get too fancy, just use existing shift/or facilities + ap_private hi(*this); + ap_private lo(*this); + hi.shl(rotateAmt); + lo.lshr(BitWidth - rotateAmt); + return hi | lo; + } + + INLINE ap_private rotr(uint32_t rotateAmt) const { + if (rotateAmt == 0) + return *this; + // Don't get too fancy, just use existing shift/or facilities + ap_private hi(*this); + ap_private lo(*this); + lo.lshr(rotateAmt); + hi.shl(BitWidth - rotateAmt); + return hi | lo; + } + + /// Perform an unsigned divide operation on this ap_private by RHS. Both this and + /// RHS are treated as unsigned quantities for purposes of this division. + /// @returns a new ap_private value containing the division result + /// @brief Unsigned division operation. + ap_private udiv(const ap_private& RHS) const { + assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); + + // First, deal with the easy case + if (isSingleWord()) { + assert(RHS.VAL != 0 && "Divide by zero?"); + return ap_private(VAL / RHS.VAL); + } + + // Get some facts about the LHS and RHS number of bits and words + uint32_t rhsBits = RHS.getActiveBits(); + uint32_t rhsWords = !rhsBits ? 0 : (whichWord(rhsBits - 1) + 1); + assert(rhsWords && "Divided by zero???"); + uint32_t lhsBits = this->getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1); + + // Deal with some degenerate cases + if (!lhsWords) + // 0 / X ===> 0 + return ap_private(0); + else if (lhsWords < rhsWords || this->ult(RHS)) { + // X / Y ===> 0, iff X < Y + return ap_private(0); + } else if (*this == RHS) { + // X / X ===> 1 + return ap_private(1); + } else if (lhsWords == 1 && rhsWords == 1) { + // All high words are zero, just use native divide + return ap_private(this->pVal[0] / RHS.pVal[0]); + } + + // We have to compute it the hard way. Invoke the Knuth divide algorithm. + ap_private Quotient(0); // to hold result. + divide(*this, lhsWords, RHS, rhsWords, &Quotient, (ap_private*)0); + return Quotient; + } + + /// Signed divide this ap_private by ap_private RHS. + /// @brief Signed division function for ap_private. + INLINE ap_private sdiv(const ap_private& RHS) const { + if (isNegative()) + if (RHS.isNegative()) + return (-(*this)).udiv(-RHS); + else + return -((-(*this)).udiv(RHS)); + else if (RHS.isNegative()) + return -(this->udiv(-RHS)); + return this->udiv(RHS); + } + + /// Perform an unsigned remainder operation on this ap_private with RHS being the + /// divisor. Both this and RHS are treated as unsigned quantities for purposes + /// of this operation. Note that this is a true remainder operation and not + /// a modulo operation because the sign follows the sign of the dividend + /// which is *this. + /// @returns a new ap_private value containing the remainder result + /// @brief Unsigned remainder operation. + ap_private urem(const ap_private& RHS) const { + if (isSingleWord()) { + assert(RHS.VAL != 0 && "Remainder by zero?"); + return ap_private(VAL % RHS.VAL); + } + + // Get some facts about the LHS + uint32_t lhsBits = getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1); + + // Get some facts about the RHS + uint32_t rhsBits = RHS.getActiveBits(); + uint32_t rhsWords = !rhsBits ? 0 : (whichWord(rhsBits - 1) + 1); + assert(rhsWords && "Performing remainder operation by zero ???"); + + // Check the degenerate cases + if (lhsWords == 0) { + // 0 % Y ===> 0 + return ap_private(0); + } else if (lhsWords < rhsWords || this->ult(RHS)) { + // X % Y ===> X, iff X < Y + return *this; + } else if (*this == RHS) { + // X % X == 0; + return ap_private(0); + } else if (lhsWords == 1) { + // All high words are zero, just use native remainder + return ap_private(pVal[0] % RHS.pVal[0]); + } + + // We have to compute it the hard way. Invoke the Knuth divide algorithm. + ap_private Remainder(0); + divide(*this, lhsWords, RHS, rhsWords, (ap_private*)(0), &Remainder); + return Remainder; + } + + ap_private urem(uint64_t RHS) const { + // Get some facts about the LHS + uint32_t lhsBits = getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1); + // Get some facts about the RHS + uint32_t rhsBits = 64 - CountLeadingZeros_64(RHS); // RHS.getActiveBits(); + uint32_t rhsWords = 1;//!rhsBits ? 0 : (ap_private<_AP_W, _AP_S, _AP_N>::whichWord(rhsBits - 1) + 1); + assert(rhsWords && "Performing remainder operation by zero ???"); + // Check the degenerate cases + if (lhsWords == 0) { + // 0 % Y ===> 0 + return ap_private(0); + } else if (lhsWords < rhsWords || this->ult(RHS)) { + // X % Y ===> X, iff X < Y + return *this; + } else if (*this == RHS) { + // X % X == 0; + return ap_private(0); + } else if (lhsWords == 1) { + // All high words are zero, just use native remainder + return ap_private(pVal[0] % RHS); + } + + // We have to compute it the hard way. Invoke the Knuth divide algorithm. + ap_private Remainder(0); + divide(*this, lhsWords, RHS, (ap_private*)(0), &Remainder); + return Remainder; + } + + /// Signed remainder operation on ap_private. + /// @brief Function for signed remainder operation. + INLINE ap_private srem(const ap_private& RHS) const { + if (isNegative()) { + ap_private lhs = -(*this); + if (RHS.isNegative()) { + ap_private rhs = -RHS; + return -(lhs.urem(rhs)); + } else + return -(lhs.urem(RHS)); + } else if (RHS.isNegative()) { + ap_private rhs = -RHS; + return this->urem(rhs); + } + return this->urem(RHS); + } + + /// Signed remainder operation on ap_private. + /// @brief Function for signed remainder operation. + INLINE ap_private srem(int64_t RHS) const { + if (isNegative()) + if (RHS<0) + return -((-(*this)).urem(-RHS)); + else + return -((-(*this)).urem(RHS)); + else if (RHS<0) + return this->urem(-RHS); + return this->urem(RHS); + } + + /// Sometimes it is convenient to divide two ap_private values and obtain both + /// the quotient and remainder. This function does both operations in the + /// same computation making it a little more efficient. + /// @brief Dual division/remainder interface. + static void udivrem(const ap_private& LHS, const ap_private& RHS, ap_private &Quotient, ap_private& Remainder) { + // Get some size facts about the dividend and divisor + uint32_t lhsBits = LHS.getActiveBits(); + uint32_t lhsWords = !lhsBits ? 0 : (ap_private::whichWord(lhsBits - 1) + 1); + uint32_t rhsBits = RHS.getActiveBits(); + uint32_t rhsWords = !rhsBits ? 0 : (ap_private::whichWord(rhsBits - 1) + 1); + + // Check the degenerate cases + if (lhsWords == 0) { + Quotient = 0; // 0 / Y ===> 0 + Remainder = 0; // 0 % Y ===> 0 + return; + } + + if (lhsWords < rhsWords || LHS.ult(RHS)) { + Quotient = 0; // X / Y ===> 0, iff X < Y + Remainder = LHS; // X % Y ===> X, iff X < Y + return; + } + + if (LHS == RHS) { + Quotient = 1; // X / X ===> 1 + Remainder = 0; // X % X ===> 0; + return; + } + + if (lhsWords == 1 && rhsWords == 1) { + // There is only one word to consider so use the native versions. + if (LHS.isSingleWord()) { + Quotient = ap_private(LHS.VAL / RHS.VAL); + Remainder = ap_private(LHS.VAL % RHS.VAL); + } else { + Quotient = ap_private(LHS.pVal[0] / RHS.pVal[0]); + Remainder = ap_private(LHS.pVal[0] % RHS.pVal[0]); + } + return; + } + + // Okay, lets do it the long way + divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder); + } + + static void sdivrem(const ap_private &LHS, const ap_private &RHS, + ap_private &Quotient, ap_private &Remainder) { + if (LHS.isNegative()) { + if (RHS.isNegative()) + ap_private::udivrem(-LHS, -RHS, Quotient, Remainder); + else + ap_private::udivrem(-LHS, RHS, Quotient, Remainder); + Quotient = -Quotient; + Remainder = -Remainder; + } else if (RHS.isNegative()) { + ap_private::udivrem(LHS, -RHS, Quotient, Remainder); + Quotient = -Quotient; + } else { + ap_private::udivrem(LHS, RHS, Quotient, Remainder); + } + } + + /// Compares this ap_private with RHS for the validity of the equality + /// relationship. + /// @returns true if *this == Val + /// @brief Equality comparison. + template + INLINE bool eq(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return (*this) == RHS; + } + + /// Compares this ap_private with RHS for the validity of the inequality + /// relationship. + /// @returns true if *this != Val + /// @brief Inequality comparison + template + INLINE bool ne(const ap_private<_AP_W, _AP_S1, _AP_N> &RHS) const { + return !((*this) == RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// the validity of the less-than relationship. + /// @returns true if *this < RHS when both are considered unsigned. + /// @brief Unsigned less than comparison + template + INLINE bool ult(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + // Get active bit length of both operands + uint32_t n1 = getActiveBits(); + uint32_t n2 = RHS.getActiveBits(); + + // If magnitude of LHS is less than RHS, return true. + if (n1 < n2) + return true; + + // If magnitude of RHS is greather than LHS, return false. + if (n2 < n1) + return false; + + // If they bot fit in a word, just compare the low order word + if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD) + return pVal[0] < RHS.pVal[0]; + + // Otherwise, compare all words + uint32_t topWord = whichWord(AESL_std::max(n1,n2)-1); + for (int i = topWord; i >= 0; --i) { + if (pVal[i] > RHS.pVal[i]) + return false; + if (pVal[i] < RHS.pVal[i]) + return true; + } + return false; + } + + INLINE bool ult(uint64_t RHS) const { + // Get active bit length of both operands + uint32_t n1 = getActiveBits(); + uint32_t n2 = 64 - CountLeadingZeros_64(RHS); //RHS.getActiveBits(); + + // If magnitude of LHS is less than RHS, return true. + if (n1 < n2) + return true; + + // If magnitude of RHS is greather than LHS, return false. + if (n2 < n1) + return false; + + // If they bot fit in a word, just compare the low order word + if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD) + return pVal[0] < RHS; + assert(0); + } + + template + INLINE bool slt(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + ap_private lhs(*this); + ap_private<_AP_W, _AP_S1, _AP_N> rhs(RHS); + bool lhsNeg = isNegative(); + bool rhsNeg = rhs.isNegative(); + if (lhsNeg) { + // Sign bit is set so perform two's complement to make it positive + lhs.flip(); + lhs++; + } + if (rhsNeg) { + // Sign bit is set so perform two's complement to make it positive + rhs.flip(); + rhs++; + } + + // Now we have unsigned values to compare so do the comparison if necessary + // based on the negativeness of the values. + if (lhsNeg) + if (rhsNeg) + return lhs.ugt(rhs); + else + return true; + else if (rhsNeg) + return false; + else + return lhs.ult(rhs); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// validity of the less-or-equal relationship. + /// @returns true if *this <= RHS when both are considered unsigned. + /// @brief Unsigned less or equal comparison + template + INLINE bool ule(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return ult(RHS) || eq(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// validity of the less-or-equal relationship. + /// @returns true if *this <= RHS when both are considered signed. + /// @brief Signed less or equal comparison + template + INLINE bool sle(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return slt(RHS) || eq(RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// the validity of the greater-than relationship. + /// @returns true if *this > RHS when both are considered unsigned. + /// @brief Unsigned greather than comparison + template + INLINE bool ugt(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return !ult(RHS) && !eq(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// the validity of the greater-than relationship. + /// @returns true if *this > RHS when both are considered signed. + /// @brief Signed greather than comparison + template + INLINE bool sgt(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return !slt(RHS) && !eq(RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// validity of the greater-or-equal relationship. + /// @returns true if *this >= RHS when both are considered unsigned. + /// @brief Unsigned greater or equal comparison + template + INLINE bool uge(const ap_private<_AP_W, _AP_S, _AP_N>& RHS) const { + return !ult(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// validity of the greater-or-equal relationship. + /// @returns true if *this >= RHS when both are considered signed. + /// @brief Signed greather or equal comparison + template + INLINE bool sge(const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) const { + return !slt(RHS); + } + + template + void cpTrunc(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) { + assert(_AP_W1 > BitWidth && "Invalid ap_private Truncate request"); + assert(_AP_W1 >= MIN_INT_BITS && "Can't truncate to 0 bits"); + memcpy(pVal, that.pVal, _AP_N*APINT_WORD_SIZE); + } + + // Sign extend to a new width. + template + void cpSext(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) { + assert(_AP_W1 < BitWidth && "Invalid ap_private SignExtend request"); + assert(_AP_W1 <= MAX_INT_BITS && "Too many bits"); + // If the sign bit isn't set, this is the same as zext. + if (!that.isNegative()) { + cpZext(that); + return; + } + + // The sign bit is set. First, get some facts + enum { wordBits = _AP_W1 % APINT_BITS_PER_WORD}; + + // Mask the high order word appropriately + if (_AP_N1 == _AP_N) { + enum { newWordBits = _AP_W % APINT_BITS_PER_WORD}; + // The extension is contained to the wordsBefore-1th word. + static const uint64_t mask = wordBits?(~0ULL<<(wordBits)):0ULL; + if (_AP_N1 == 1) { + assert(0); + } else { + for (uint32_t i = 0; i < _AP_N1; ++i) + pVal[i] = that.pVal[i]; + pVal[_AP_N1-1] |= mask; + return; + } + } + + if (_AP_N1 == 1) { + assert(0);// newVal[0] = VAL | mask; + } else { + enum { newWordBits = _AP_W % APINT_BITS_PER_WORD}; + // The extension is contained to the wordsBefore-1th word. + static const uint64_t mask = wordBits?(~0ULL<<(wordBits)):0ULL; + for (uint32_t i = 0; i < _AP_N1; ++i) + pVal[i] = that.pVal[i]; + pVal[_AP_N1-1] |= mask; + } + for (uint32_t i=_AP_N1; i < _AP_N-1; i++) + pVal[i] = ~0ULL; + pVal[_AP_N-1] = ~0ULL; + clearUnusedBits(); + return; + } + + // Zero extend to a new width. + template + void cpZext(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) { + assert(_AP_W1 < BitWidth && "Invalid ap_private ZeroExtend request"); + assert(_AP_W1 <= MAX_INT_BITS && "Too many bits"); + uint32_t wordsAfter = _AP_N; + if (wordsAfter==1) { + assert(0); // return ap_private<_AP_W1, _AP_S, _AP_N1> (_AP_W1, VAL, _AP_S); + } else { + if (_AP_N1 == 1) { + assert(0); + // newVal[0] = VAL; + } else { + uint32_t i = 0; + for (; i < _AP_N1; ++i) + pVal[i] = that.pVal[i]; + for (; i < _AP_N; ++i) + pVal[i] = 0; + } + } + clearUnusedBits(); + } + + template + void cpZextOrTrunc(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) { + if (BitWidth > _AP_W1) + cpZext(that); + else if (BitWidth < _AP_W1) + cpTrunc(that); + else { + for (int i=0; i<_AP_N1; ++i) + pVal[i]=that.pVal[i]; + clearUnusedBits(); + } + } + + template + void cpSextOrTrunc(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) { + if (BitWidth > _AP_W1) + cpSext(that); + else if (BitWidth < _AP_W1) + cpTrunc(that); + else { + for (int i=0; i<_AP_N1; ++i) + pVal[i] = that.pVal[i]; + clearUnusedBits(); + } + } + + /// @name Value Characterization Functions + /// @{ + + /// @returns the total number of bits. + INLINE uint32_t getBitWidth() const { + return BitWidth; + } + + /// Here one word's bitwidth equals to that of uint64_t. + /// @returns the number of words to hold the integer value of this ap_private. + /// @brief Get the number of words. + INLINE uint32_t getNumWords() const { + return (BitWidth + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD; + } + + /// This function returns the number of active bits which is defined as the + /// bit width minus the number of leading zeros. This is used in several + /// computations to see how "wide" the value is. + /// @brief Compute the number of active bits in the value + INLINE uint32_t getActiveBits() const { + uint32_t bits=BitWidth - countLeadingZeros(); + return bits?bits:1; + } + + + /// This method attempts to return the value of this ap_private as a zero extended + /// uint64_t. The bitwidth must be <= 64 or the value must fit within a + /// uint64_t. Otherwise an assertion will result. + /// @brief Get zero extended value + INLINE uint64_t getZExtValue() const { + assert(getActiveBits() <= 64 && "Too many bits for uint64_t"); + return *pVal; + } + + /// This method attempts to return the value of this ap_private as a sign extended + /// int64_t. The bit width must be <= 64 or the value must fit within an + /// int64_t. Otherwise an assertion will result. + /// @brief Get sign extended value + INLINE int64_t getSExtValue() const { + assert(getActiveBits() <= 64 && "Too many bits for int64_t"); + return int64_t(pVal[0]); + } + + /// This method determines how many bits are required to hold the ap_private + /// equivalent of the string given by \p str of length \p slen. + /// @brief Get bits required for string value. + static uint32_t getBitsNeeded(const char* str, uint32_t slen, uint8_t radix); + + /// countLeadingZeros - This function is an ap_private version of the + /// countLeadingZeros_{32,64} functions in MathExtras.h. It counts the number + /// of zeros from the most significant bit to the first one bit. + /// @returns BitWidth if the value is zero. + /// @returns the number of zeros from the most significant bit to the first + /// one bits. + INLINE uint32_t countLeadingZeros() const ; + + /// countLeadingOnes - This function counts the number of contiguous 1 bits + /// in the high order bits. The count stops when the first 0 bit is reached. + /// @returns 0 if the high order bit is not set + /// @returns the number of 1 bits from the most significant to the least + /// @brief Count the number of leading one bits. + INLINE uint32_t countLeadingOnes() const ; + + /// countTrailingZeros - This function is an ap_private version of the + /// countTrailingZoers_{32,64} functions in MathExtras.h. It counts + /// the number of zeros from the least significant bit to the first set bit. + /// @returns BitWidth if the value is zero. + /// @returns the number of zeros from the least significant bit to the first + /// one bit. + /// @brief Count the number of trailing zero bits. + INLINE uint32_t countTrailingZeros() const ; + + /// countPopulation - This function is an ap_private version of the + /// countPopulation_{32,64} functions in MathExtras.h. It counts the number + /// of 1 bits in the ap_private value. + /// @returns 0 if the value is zero. + /// @returns the number of set bits. + /// @brief Count the number of bits set. + INLINE uint32_t countPopulation() const { + uint32_t Count = 0; + for (uint32_t i = 0; i<_AP_N-1 ; ++i) + Count += CountPopulation_64(pVal[i]); + Count += CountPopulation_64(pVal[_AP_N-1]&mask); + return Count; + } + + /// @} + /// @name Conversion Functions + /// @{ + + /// This is used internally to convert an ap_private to a string. + /// @brief Converts an ap_private to a std::string + INLINE std::string toString(uint8_t radix, bool wantSigned) const + ; + + /// Considers the ap_private to be unsigned and converts it into a string in the + /// radix given. The radix can be 2, 8, 10 or 16. + /// @returns a character interpretation of the ap_private + /// @brief Convert unsigned ap_private to string representation. + INLINE std::string toStringUnsigned(uint8_t radix = 10) const { + return toString(radix, false); + } + + /// Considers the ap_private to be unsigned and converts it into a string in the + /// radix given. The radix can be 2, 8, 10 or 16. + /// @returns a character interpretation of the ap_private + /// @brief Convert unsigned ap_private to string representation. + INLINE std::string toStringSigned(uint8_t radix = 10) const { + return toString(radix, true); + } + + /// @returns a byte-swapped representation of this ap_private Value. + INLINE ap_private byteSwap() const ; + + /// @brief Converts this ap_private to a double value. + INLINE double roundToDouble(bool isSigned) const ; + + /// @brief Converts this unsigned ap_private to a double value. + INLINE double roundToDouble() const { + return roundToDouble(false); + } + + /// @brief Converts this signed ap_private to a double value. + INLINE double signedRoundToDouble() const { + return roundToDouble(true); + } + + /// The conversion does not do a translation from integer to double, it just + /// re-interprets the bits as a double. Note that it is valid to do this on + /// any bit width. Exactly 64 bits will be translated. + /// @brief Converts ap_private bits to a double + INLINE double bitsToDouble() const { + union { + uint64_t __I; + double __D; + } __T; + __T.__I = pVal[0]; + return __T.__D; + } + + /// The conversion does not do a translation from integer to float, it just + /// re-interprets the bits as a float. Note that it is valid to do this on + /// any bit width. Exactly 32 bits will be translated. + /// @brief Converts ap_private bits to a double + INLINE float bitsToFloat() const { + union { + uint32_t __I; + float __F; + } __T; + __T.__I = uint32_t(pVal[0]); + return __T.__F; + } + + /// The conversion does not do a translation from double to integer, it just + /// re-interprets the bits of the double. Note that it is valid to do this on + /// any bit width but bits from V may get truncated. + /// @brief Converts a double to ap_private bits. + INLINE ap_private& doubleToBits(double __V) { + union { + uint64_t __I; + double __D; + } __T; + __T.__D = __V; + pVal[0] = __T.__I; + return *this; + } + + /// The conversion does not do a translation from float to integer, it just + /// re-interprets the bits of the float. Note that it is valid to do this on + /// any bit width but bits from V may get truncated. + /// @brief Converts a float to ap_private bits. + INLINE ap_private& floatToBits(float __V) { + union { + uint32_t __I; + float __F; + } __T; + __T.__F = __V; + pVal[0] = __T.__I; + } + + //Reduce operation + //----------------------------------------------------------- + INLINE bool and_reduce() const { + return isMaxValue(); + } + + INLINE bool nand_reduce() const { + return isMinValue(); + } + + INLINE bool or_reduce() const { + return (bool)countPopulation(); + } + + INLINE bool nor_reduce() const { + return countPopulation()==0; + } + + INLINE bool xor_reduce() const { + unsigned int i=countPopulation(); + return (i%2)?true:false; + } + + INLINE bool xnor_reduce() const { + unsigned int i=countPopulation(); + return (i%2)?false:true; + } + INLINE std::string to_string(uint8_t radix=16, bool sign=false) const { + return toString(radix, radix==10?_AP_S:sign); + } +}; + +template +INLINE bool operator==(uint64_t V1, const ap_private<_AP_W, _AP_S, _AP_N>& V2) { + return V2 == V1; +} + +template +INLINE bool operator!=(uint64_t V1, const ap_private<_AP_W, _AP_S, _AP_N>& V2) { + return V2 != V1; +} + +namespace ap_private_ops { + enum {APINT_BITS_PER_WORD=64}; + /// @brief Determine the smaller of two ap_privates considered to be signed. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> smin(const ap_private<_AP_W, _AP_S, _AP_N> &LHS, const ap_private<_AP_W, _AP_S1, _AP_N> &RHS) { + return LHS.slt(RHS) ? LHS : RHS; + } + + /// @brief Determine the larger of two ap_privates considered to be signed. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> smax(const ap_private<_AP_W, _AP_S, _AP_N> &LHS, const ap_private<_AP_W, _AP_S1, _AP_N> &RHS) { + return LHS.sgt(RHS) ? LHS : RHS; + } + + /// @brief Determine the smaller of two ap_privates considered to be signed. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> umin(const ap_private<_AP_W, _AP_S, _AP_N> &LHS, const ap_private<_AP_W, _AP_S1, _AP_N> &RHS) { + return LHS.ult(RHS) ? LHS : RHS; + } + + /// @brief Determine the larger of two ap_privates considered to be unsigned. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> umax(const ap_private<_AP_W, _AP_S, _AP_N> &LHS, const ap_private<_AP_W, _AP_S1, _AP_N> &RHS) { + return LHS.ugt(RHS) ? LHS : RHS; + } + + /// @brief Check if the specified ap_private has a N-bits integer value. + template + INLINE bool isIntN(uint32_t __N, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.isIntN(__N); + } + + /// @returns true if the argument ap_private value is a sequence of ones + /// starting at the least significant bit with the remainder zero. + template + INLINE bool isMask(uint32_t numBits, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.getBoolValue() && ((APIVal + ap_private<_AP_W, _AP_S, _AP_N>(numBits,1)) & APIVal) == 0; + } + + /// @returns true if the argument ap_private value contains a sequence of ones + /// with the remainder zero. + template + INLINE bool isShiftedMask(uint32_t numBits, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return isMask(numBits, (APIVal - ap_private<_AP_W, _AP_S, _AP_N>(numBits,1)) | APIVal); + } + + /// @returns a byte-swapped representation of the specified ap_private Value. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> byteSwap(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.byteSwap(); + } + + /// @returns the floor log base 2 of the specified ap_private value. + template INLINE uint32_t logBase2(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.logBase2(); + } + + /// GreatestCommonDivisor - This function returns the greatest common + /// divisor of the two ap_private values using Enclid's algorithm. + /// @returns the greatest common divisor of Val1 and Val2 + /// @brief Compute GCD of two ap_private values. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> GreatestCommonDivisor(const ap_private<_AP_W, _AP_S, _AP_N>& Val1, const ap_private<_AP_W, _AP_S, _AP_N>& Val2) + ; + + /// Treats the ap_private as an unsigned value for conversion purposes. + /// @brief Converts the given ap_private to a double value. + template INLINE double Roundap_privateToDouble(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.roundToDouble(); + } + + /// Treats the ap_private as a signed value for conversion purposes. + /// @brief Converts the given ap_private to a double value. + template INLINE double RoundSignedap_privateToDouble(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.signedRoundToDouble(); + } + + /// @brief Converts the given ap_private to a float vlalue. + template INLINE float Roundap_privateToFloat(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return float(Roundap_privateToDouble(APIVal)); + } + + /// Treast the ap_private as a signed value for conversion purposes. + /// @brief Converts the given ap_private to a float value. + template INLINE float RoundSignedap_privateToFloat(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return float(APIVal.signedRoundToDouble()); + } + + /// RoundDoubleToap_private - This function convert a double value to an ap_private value. + /// @brief Converts the given double value into a ap_private. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> RoundDoubleToap_private(double Double, uint32_t width) ; + + /// RoundFloatToap_private - Converts a float value into an ap_private value. + /// @brief Converts a float value into a ap_private. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> RoundFloatToap_private(float Float, uint32_t width) { + return RoundDoubleToap_private<_AP_W, _AP_S, _AP_N>(double(Float), width); + } + + /// Arithmetic right-shift the ap_private by shiftAmt. + /// @brief Arithmetic right-shift function. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> ashr(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t shiftAmt) { + return LHS.ashr(shiftAmt); + } + + /// Logical right-shift the ap_private by shiftAmt. + /// @brief Logical right-shift function. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> lshr(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t shiftAmt) { + return LHS.lshr(shiftAmt); + } + + /// Left-shift the ap_private by shiftAmt. + /// @brief Left-shift function. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> shl(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t shiftAmt) { + return LHS.shl(shiftAmt); + } + + /// Signed divide ap_private LHS by ap_private RHS. + /// @brief Signed division function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> sdiv(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS.sdiv(RHS); + } + + /// Unsigned divide ap_private LHS by ap_private RHS. + /// @brief Unsigned division function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> udiv(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS.udiv(RHS); + } + + /// Signed remainder operation on ap_private. + /// @brief Function for signed remainder operation. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> srem(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS.srem(RHS); + } + + /// Unsigned remainder operation on ap_private. + /// @brief Function for unsigned remainder operation. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> urem(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS.urem(RHS); + } + + /// Performs multiplication on ap_private values. + /// @brief Function for multiplication operation. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> mul(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS * RHS; + } + + /// Performs addition on ap_private values. + /// @brief Function for addition operation. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> add(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS + RHS; + } + + /// Performs subtraction on ap_private values. + /// @brief Function for subtraction operation. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> sub(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS - RHS; + } + + /// Performs bitwise AND operation on ap_private LHS and + /// ap_private RHS. + /// @brief Bitwise AND function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> And(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS & RHS; + } + + /// Performs bitwise OR operation on ap_private LHS and ap_private RHS. + /// @brief Bitwise OR function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> Or(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS | RHS; + } + + /// Performs bitwise XOR operation on ap_private. + /// @brief Bitwise XOR function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1, _AP_N> Xor(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, const ap_private<_AP_W, _AP_S1, _AP_N>& RHS) { + return LHS ^ RHS; + } + + /// Performs a bitwise complement operation on ap_private. + /// @brief Bitwise complement function. + template INLINE ap_private<_AP_W, _AP_S, _AP_N> Not(const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return ~APIVal; + } + + template void clearUnusedBits(uint64_t& msw) { + // Compute how many bits are used in the final word + // uint32_t wordBits = APIVal.getBitWidth() & 0x3f; + if (wordBits == 0) + // If all bits are used, we want to leave the value alone. This also + // avoids the undefined behavior of >> when the shfit is the same size as + // the word size (64). + return; + + // Mask out the hight bits. + uint64_t mask = ~uint64_t(0ULL) >> (64 /*ap_private::APINT_BITS_PER_WORD */- wordBits); + msw &= mask; + } + template <> INLINE void clearUnusedBits<1>(uint64_t& msw) { + uint64_t mask = ~uint64_t(0ULL) >> (64 /*ap_private::APINT_BITS_PER_WORD */- 1); + msw &= mask; + } + template void clearUnusedBits(int64_t& msw) { + // Compute how many bits are used in the final word + // uint32_t wordBits = APIVal.getBitWidth() & 0x3f; + if (wordBits == 0) + // If all bits are used, we want to leave the value alone. This also + // avoids the undefined behavior of >> when the shfit is the same size as + // the word size (64). + return; + + // Mask out the hight bits. + uint64_t mask = ~uint64_t(0ULL) >> (64 /*ap_private::APINT_BITS_PER_WORD */- wordBits); + msw &= mask; + } + template <> INLINE void clearUnusedBits<1>(int64_t& msw) { + uint64_t mask = ~uint64_t(0ULL) >> (64 /*ap_private::APINT_BITS_PER_WORD */- 1); + msw &= mask; + } + // template + template + INLINE ap_private<_AP_W, _AP_S> ashr(const ap_private<_AP_W, _AP_S>& a) { + return ashr(a, shiftAmt); + } + + template + INLINE ap_private<_AP_W, _AP_S> lshr(const ap_private<_AP_W, _AP_S>& a) { + return lshr(a, shiftAmt); + } + + template + INLINE ap_private<_AP_W, true> ashr(const ap_private<_AP_W, true, 1>& a) { + enum {APINT_BITS_PER_WORD=64, excess_bits=APINT_BITS_PER_WORD-_AP_W}; + static const uint64_t sign_bit = (1ULL<<(_AP_W-1)); + static const uint64_t sign_ext_mask = (_AP_W-shiftAmt>0)?~0ULL<<(APINT_BITS_PER_WORD-_AP_W+shiftAmt):~0ULL; + return ap_private<_AP_W, true>((((int64_t)a.VAL) >> (shiftAmt)) | (a.VAL & sign_bit? sign_ext_mask : 0ULL)); + } + + template + INLINE ap_private<_AP_W, false> ashr(const ap_private<_AP_W, false, 1>& a) { + return ap_private<_AP_W, false>((a.VAL) >> (shiftAmt)); + } + + template + INLINE ap_private<_AP_W, _AP_S> lshr(const ap_private<_AP_W, _AP_S, 1>& a) { + static const uint64_t mask = ~0ULL<<_AP_W; + return ap_private<_AP_W, _AP_S>((a.VAL&mask) >> (shiftAmt)); + } + + template + INLINE ap_private<_AP_W-shiftAmt, _AP_S> shr(const ap_private<_AP_W, _AP_S>& a) { + return ap_private<_AP_W-shiftAmt, _AP_S>((a.VAL) >> (shiftAmt)); + } + + template + INLINE ap_private<_AP_W+shiftAmt, _AP_S> shl(const ap_private<_AP_W, _AP_S>& a) { + return ap_private<_AP_W+shiftAmt, _AP_S>((a.VAL) << (shiftAmt)); + } + + template + INLINE bool get(const ap_private<_AP_W, _AP_S, 1>& a) { + unsigned shift = (index%APINT_BITS_PER_WORD); + static const uint64_t mask=1ULL << (shift); + return ((mask & a.VAL) != 0); + } + + template + INLINE bool get(const ap_private<_AP_W, _AP_S>& a) { + static const uint64_t mask=1ULL << (index&0x3f); + return ((mask & a.pVal[(index)>>6]) != 0); + } + + template + INLINE void set(ap_private<_AP_W, _AP_S, 1>& a) { + const uint64_t mask = ~0ULL >> (lsb) << (APINT_BITS_PER_WORD-msb+lsb-1)>>(APINT_BITS_PER_WORD-msb-1); + a.VAL |= mask; + } + + template + INLINE void clear(ap_private<_AP_W, _AP_S, 1>& a) { + static const uint64_t mask = ~(~0ULL >> (lsb) <<(APINT_BITS_PER_WORD-msb+lsb-1) >> (APINT_BITS_PER_WORD-msb-1)); + a.VAL &= mask; + } + + template + INLINE void set(ap_private<_AP_W, _AP_S>& a) { + enum { APINT_BITS_PER_WORD=64, + lsb_word = lsb_index /APINT_BITS_PER_WORD, + msb_word = msb_index / APINT_BITS_PER_WORD, + msb = msb_index % APINT_BITS_PER_WORD, + lsb=lsb_index % APINT_BITS_PER_WORD}; + if (msb_word==lsb_word) { + const uint64_t mask = ~0ULL >> (lsb) << (APINT_BITS_PER_WORD-msb+lsb-1)>>(APINT_BITS_PER_WORD-msb-1); + a.pVal[msb_word] |= mask; + } else { + const uint64_t lsb_mask = ~0ULL >> (lsb) << (lsb); + const uint64_t msb_mask = ~0ULL << (APINT_BITS_PER_WORD-msb-1)>>(APINT_BITS_PER_WORD-msb-1); + a.pVal[lsb_word] |=lsb_mask; + for (int i=lsb_word+1; i + INLINE void clear(ap_private<_AP_W, _AP_S>& a) { + enum { APINT_BITS_PER_WORD=64, + lsb_word = lsb_index /APINT_BITS_PER_WORD, + msb_word = msb_index / APINT_BITS_PER_WORD, + msb = msb_index % APINT_BITS_PER_WORD, + lsb=lsb_index % APINT_BITS_PER_WORD}; + if (msb_word == lsb_word) { + const uint64_t mask = ~(~0ULL >> (lsb) << (APINT_BITS_PER_WORD-msb+lsb-1)>>(APINT_BITS_PER_WORD-msb-1)); + a.pVal[msb_word] &= mask; + } else { + const uint64_t lsb_mask = ~(~0ULL >> (lsb) << (lsb)); + const uint64_t msb_mask = ~(~0ULL << (APINT_BITS_PER_WORD-msb-1)>>(APINT_BITS_PER_WORD-msb-1)); + a.pVal[lsb_word] &=lsb_mask; + for (int i=lsb_word+1; i + INLINE void set(ap_private<_AP_W, _AP_S, 1>& a) { + static const uint64_t mask=1ULL << (index); + a.VAL |= mask; + a.clearUnusedBits(); + } + + template + INLINE void clear(ap_private<_AP_W, _AP_S, 1>& a) { + static const uint64_t mask=~(1ULL << (index)); + a.VAL &= mask; + a.clearUnusedBits(); + } + + template + INLINE void set(ap_private<_AP_W, _AP_S>& a) { + enum { APINT_BITS_PER_WORD=64, word = index/APINT_BITS_PER_WORD}; + static const uint64_t mask=1ULL << (index%APINT_BITS_PER_WORD); + a.pVal[word] |= mask; + a.clearUnusedBits(); + } + + template + INLINE void clear(ap_private<_AP_W, _AP_S>& a) { + enum { APINT_BITS_PER_WORD=64, word = index/APINT_BITS_PER_WORD}; + static const uint64_t mask=~(1ULL << (index%APINT_BITS_PER_WORD)); + a.pVal[word] &= mask; + a.clearUnusedBits(); + } + + template + INLINE bool isNegative(const ap_private<_AP_W, false>& a) { + return false; + } + + template + INLINE bool isNegative(const ap_private<_AP_W, true, 1>& a) { + static const uint64_t sign_mask = (1ULL << (_AP_W-1)); + return ((sign_mask & a.VAL) != 0); + } + + template + INLINE bool isNegative(const ap_private<_AP_W, true>& a) { + enum {APINT_BITS_PER_WORD=64,_AP_N=(_AP_W+APINT_BITS_PER_WORD-1)/APINT_BITS_PER_WORD}; + static const uint64_t sign_mask = (1ULL << (_AP_W%APINT_BITS_PER_WORD-1)); + return sign_mask & a.pVal[_AP_N-1]; + } +} // End of ap_private_ops namespace + +/// @brief Check if the specified ap_private has a N-bits integer value. +template +INLINE bool isIntN(uint32_t __N, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.isIntN(__N); +} + +/// @returns true if the argument ap_private value is a sequence of ones +/// starting at the least significant bit with the remainder zero. +template +INLINE bool isMask(uint32_t numBits, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return APIVal.getBoolValue() && ((APIVal + ap_private<_AP_W, _AP_S, _AP_N>(numBits,1)) & APIVal) == 0; +} + +/// @returns true if the argument ap_private value contains a sequence of ones +/// with the remainder zero. +template +INLINE bool isShiftedMask(uint32_t numBits, const ap_private<_AP_W, _AP_S, _AP_N>& APIVal) { + return isMask(numBits, (APIVal - ap_private<_AP_W, _AP_S, _AP_N>(numBits,1)) | APIVal); +} + +#if 0 +/// add_1 - This function adds a single "digit" integer, y, to the multiple +/// "digit" integer array, x[]. x[] is modified to reflect the addition and +/// 1 is returned if there is a carry out, otherwise 0 is returned. +/// @returns the carry of the addition. +static bool add_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) { + for (uint32_t i = 0; i < len; ++i) { + dest[i] = y + x[i]; + if (dest[i] < y) + y = 1; // Carry one to next digit. + else { + y = 0; // No need to carry so exit early + break; + } + } + return (y != 0); +} +#endif + +#if 0 +/// add - This function adds the integer array x to the integer array Y and +/// places the result in dest. +/// @returns the carry out from the addition +/// @brief General addition of 64-bit integer arrays +static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y, + uint32_t destlen, uint32_t xlen, uint32_t ylen, bool xsigned, bool ysigned) { + bool carry = false; + uint32_t len = AESL_std::min(xlen, ylen); + uint32_t i; + for (i = 0; i< len && i < destlen; ++i) { + uint64_t limit = AESL_std::min(x[i],y[i]); // must come first in case dest == x + dest[i] = x[i] + y[i] + carry; + carry = dest[i] < limit || (carry && dest[i] == limit); + } + if (xlen > ylen) { + const uint64_t yext = xsigned && int64_t(y[ylen-1])<0 ? -1 : 0; + for (i=ylen; i< xlen && i < destlen; i++) { + uint64_t limit = AESL_std::min(x[i], yext); + dest[i] = x[i] + yext + carry; + carry = (dest[i] < limit)||(carry && dest[i] == x[i]); + } + } else if (ylen> xlen) { + const uint64_t xext = ysigned && int64_t(x[xlen-1])<0 ? -1 : 0; + for (i=xlen; i< ylen && i < destlen; i++) { + uint64_t limit = AESL_std::min(xext, y[i]); + dest[i] = xext + y[i] + carry; + carry = (dest[i] < limit)||(carry && dest[i] == y[i]); + } + } + return carry; +} +#endif + +#if 0 +/// @returns returns the borrow out. +/// @brief Generalized subtraction of 64-bit integer arrays. +static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y, + uint32_t destlen, uint32_t xlen, uint32_t ylen, bool xsigned, bool ysigned) { + bool borrow = false; + uint32_t i; + uint32_t len = AESL_std::min(xlen, ylen); + for (i = 0; i < len && i < destlen; ++i) { + uint64_t x_tmp = borrow ? x[i] - 1 : x[i]; + borrow = y[i] > x_tmp || (borrow && x[i] == 0); + dest[i] = x_tmp - y[i]; + } + if (xlen > ylen) { + const uint64_t yext = ysigned && int64_t(y[ylen-1])<0 ? -1 : 0; + for (i=ylen; i< xlen && i < destlen; i++) { + uint64_t x_tmp = borrow ? x[i] - 1 : x[i]; + borrow = yext > x_tmp || (borrow && x[i] == 0); + dest[i] = x_tmp - yext; + } + } else if (ylen> xlen) { + const uint64_t xext = xsigned && int64_t(x[xlen-1])<0 ? -1 : 0; + for (i=xlen; i< ylen && i < destlen; i++) { + uint64_t x_tmp = borrow ? xext - 1 : xext; + borrow = y[i] > x_tmp || (borrow && xext==0); + dest[i] = x_tmp - y[i]; + } + } + return borrow; +} +#endif + +/// Subtracts the RHS ap_private from this ap_private +/// @returns this, after subtraction +/// @brief Subtraction assignment operator. + +#if 0 +/// Multiplies an integer array, x by a a uint64_t integer and places the result +/// into dest. +/// @returns the carry out of the multiplication. +/// @brief Multiply a multi-digit ap_private by a single digit (64-bit) integer. +static uint64_t mul_1(uint64_t dest[], const uint64_t x[], uint32_t len, uint64_t y) { + // Split y into high 32-bit part (hy) and low 32-bit part (ly) + uint64_t ly = y & 0xffffffffULL, hy = (y) >> 32; + uint64_t carry = 0; + static const uint64_t two_power_32 = 1ULL << 32; + // For each digit of x. + for (uint32_t i = 0; i < len; ++i) { + // Split x into high and low words + uint64_t lx = x[i] & 0xffffffffULL; + uint64_t hx = (x[i]) >> 32; + // hasCarry - A flag to indicate if there is a carry to the next digit. + // hasCarry == 0, no carry + // hasCarry == 1, has carry + // hasCarry == 2, no carry and the calculation result == 0. + uint8_t hasCarry = 0; + dest[i] = carry + lx * ly; + // Determine if the add above introduces carry. + hasCarry = (dest[i] < carry) ? 1 : 0; + carry = hx * ly + ((dest[i]) >> 32) + (hasCarry ? two_power_32 : 0); + // The upper limit of carry can be (2^32 - 1)(2^32 - 1) + + // (2^32 - 1) + 2^32 = 2^64. + hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0); + + carry += (lx * hy) & 0xffffffffULL; + dest[i] = ((carry) << 32) | (dest[i] & 0xffffffffULL); + carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? two_power_32 : 0) + + ((carry) >> 32) + ((lx * hy) >> 32) + hx * hy; + } + return carry; +} +#endif + +#if 0 +/// Multiplies integer array x by integer array y and stores the result into +/// the integer array dest. Note that dest's size must be >= xlen + ylen. +/// @brief Generalized multiplicate of integer arrays. +static void mul(uint64_t dest[], const uint64_t x[], uint32_t xlen, const uint64_t y[], + uint32_t ylen, uint32_t destlen) { + dest[xlen] = mul_1(dest, x, xlen, y[0]); + for (uint32_t i = 1; i < ylen; ++i) { + uint64_t ly = y[i] & 0xffffffffULL, hy = (y[i]) >> 32; + uint64_t carry = 0, lx = 0, hx = 0; + for (uint32_t j = 0; j < xlen; ++j) { + lx = x[j] & 0xffffffffULL; + hx = (x[j]) >> 32; + // hasCarry - A flag to indicate if has carry. + // hasCarry == 0, no carry + // hasCarry == 1, has carry + // hasCarry == 2, no carry and the calculation result == 0. + uint8_t hasCarry = 0; + uint64_t resul = carry + lx * ly; + hasCarry = (resul < carry) ? 1 : 0; + carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + ((resul) >> 32); + hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0); + carry += (lx * hy) & 0xffffffffULL; + resul = ((carry) << 32) | (resul & 0xffffffffULL); + dest[i+j] += resul; + carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+ + ((carry) >> 32) + (dest[i+j] < resul ? 1 : 0) + + ((lx * hy) >> 32) + hx * hy; + } + dest[i+xlen] = carry; + } +} +#endif + + + +template +uint32_t ap_private<_AP_W, _AP_S, _AP_N>::getBitsNeeded(const char* str, uint32_t slen, uint8_t radix) { + assert(str != 0 && "Invalid value string"); + assert(slen > 0 && "Invalid string length"); + + // Each computation below needs to know if its negative + uint32_t isNegative = str[0] == '-'; + if (isNegative) { + slen--; + str++; + } + // For radixes of power-of-two values, the bits required is accurately and + // easily computed + if (radix == 2) + return slen + isNegative; + if (radix == 8) + return slen * 3 + isNegative; + if (radix == 16) + return slen * 4 + isNegative; + + // Otherwise it must be radix == 10, the hard case + assert(radix == 10 && "Invalid radix"); + + // Convert to the actual binary value. + //ap_private<_AP_W, _AP_S, _AP_N> tmp(sufficient, str, slen, radix); + + // Compute how many bits are required. + //return isNegative + tmp.logBase2() + 1; + return isNegative + slen * 4; +} + +template +uint32_t ap_private<_AP_W, _AP_S, _AP_N>::countLeadingZeros() const { + enum { msw_bits = (BitWidth % APINT_BITS_PER_WORD)?(BitWidth % APINT_BITS_PER_WORD):APINT_BITS_PER_WORD, + excessBits = APINT_BITS_PER_WORD - msw_bits }; + uint32_t Count = CountLeadingZeros_64(pVal[_AP_N-1]); + if (Count>=excessBits) + Count -= excessBits; + if (!pVal[_AP_N-1]) { + for (uint32_t i = _AP_N-1 ; i ; --i) { + if (!pVal[i-1]) + Count += APINT_BITS_PER_WORD; + else { + Count += CountLeadingZeros_64(pVal[i-1]); + break; + } + } + } + return Count; +} + +static uint32_t countLeadingOnes_64(uint64_t __V, uint32_t skip) { + uint32_t Count = 0; + if (skip) + (__V) <<= (skip); + while (__V && (__V & (1ULL << 63))) { + Count++; + (__V) <<= 1; + } + return Count; +} + +template +uint32_t ap_private<_AP_W, _AP_S, _AP_N>::countLeadingOnes() const { + if (isSingleWord()) + return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth); + + uint32_t highWordBits = BitWidth % APINT_BITS_PER_WORD; + uint32_t shift = (highWordBits == 0 ? 0 : APINT_BITS_PER_WORD - highWordBits); + int i = _AP_N - 1; + uint32_t Count = countLeadingOnes_64(pVal[i], shift); + if (Count == highWordBits) { + for (i--; i >= 0; --i) { + if (pVal[i] == ~0ULL) + Count += APINT_BITS_PER_WORD; + else { + Count += countLeadingOnes_64(pVal[i], 0); + break; + } + } + } + return Count; +} + +template +INLINE uint32_t ap_private<_AP_W, _AP_S, _AP_N>::countTrailingZeros() const { + if (isSingleWord()) + return AESL_std::min(uint32_t(CountTrailingZeros_64(VAL)), BitWidth); + uint32_t Count = 0; + uint32_t i = 0; + for (; i < _AP_N && pVal[i] == 0; ++i) + Count += APINT_BITS_PER_WORD; + if (i < _AP_N) + Count += CountTrailingZeros_64(pVal[i]); + return AESL_std::min(Count, BitWidth); +} + +template +ap_private<_AP_W, _AP_S, _AP_N> ap_private<_AP_W, _AP_S, _AP_N>::byteSwap() const { + assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!"); + if (BitWidth == 16) + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ ByteSwap_16(uint16_t(VAL))); + else if (BitWidth == 32) + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ ByteSwap_32(uint32_t(VAL))); + else if (BitWidth == 48) { + uint32_t Tmp1 = uint32_t((VAL) >> 16); + Tmp1 = ByteSwap_32(Tmp1); + uint16_t Tmp2 = uint16_t(VAL); + Tmp2 = ByteSwap_16(Tmp2); + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ ((uint64_t(Tmp2)) << 32) | Tmp1); + } else if (BitWidth == 64) + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ ByteSwap_64(VAL)); + else { + ap_private<_AP_W, _AP_S, _AP_N> Result(0); + char *pByte = (char*)Result.pVal; + for (uint32_t i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) { + char Tmp = pByte[i]; + pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i]; + pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp; + } + return Result; + } +} + +template +ap_private<_AP_W, _AP_S, _AP_N> ap_private_ops::GreatestCommonDivisor(const ap_private<_AP_W, _AP_S, _AP_N>& API1, const ap_private<_AP_W, _AP_S, _AP_N>& API2) { + ap_private<_AP_W, _AP_S, _AP_N> __A = API1, __B = API2; + while (!!__B) { + ap_private<_AP_W, _AP_S, _AP_N> __T = __B; + __B = ap_private_ops::urem(__A, __B); + __A = __T; + } + return __A; +} + +template +ap_private<_AP_W, _AP_S, _AP_N> ap_private_ops::RoundDoubleToap_private(double Double, uint32_t width) { + union { + double __D; + uint64_t __I; + } __T; + __T.__D = Double; + + // Get the sign bit from the highest order bit + bool isNeg = (__T.__I) >> 63; + + // Get the 11-bit exponent and adjust for the 1023 bit bias + int64_t exp = (((__T.__I) >> 52) & 0x7ffULL) - 1023; + + // If the exponent is negative, the value is < 0 so just return 0. + if (exp < 0) + return ap_private<_AP_W, _AP_S, _AP_N>(width, 0u); + + // Extract the mantissa by clearing the top 12 bits (sign + exponent). + uint64_t mantissa = (__T.__I & (~0ULL >> 12)) | 1ULL << 52; + + // If the exponent doesn't shift all bits out of the mantissa + if (exp < 52) + return isNeg ? -ap_private<_AP_W, _AP_S, _AP_N>(width, (mantissa) >> (52 - exp)) : + ap_private<_AP_W, _AP_S, _AP_N>((mantissa) >> (52 - exp)); + + // If the client didn't provide enough bits for us to shift the mantissa into + // then the result is undefined, just return 0 + if (width <= exp - 52) + return ap_private<_AP_W, _AP_S, _AP_N>(width, 0); + + // Otherwise, we have to shift the mantissa bits up to the right location + ap_private<_AP_W, _AP_S, _AP_N> Tmp(width, mantissa); + Tmp = Tmp.shl(exp - 52); + return isNeg ? -Tmp : Tmp; +} + +/// RoundToDouble - This function convert this ap_private to a double. +/// The layout for double is as following (IEEE Standard 754): +/// -------------------------------------- +/// | Sign Exponent Fraction Bias | +/// |-------------------------------------- | +/// | 1[63] 11[62-52] 52[51-00] 1023 | +/// -------------------------------------- +template +double ap_private<_AP_W, _AP_S, _AP_N>::roundToDouble(bool isSigned) const { + + // Handle the simple case where the value is contained in one uint64_t. + if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) { + uint64_t val; + if (isSingleWord()) val = VAL; + else val = pVal[0]; + if (isSigned) { + int64_t sext = ((int64_t(val)) << (64-BitWidth)) >> (64-BitWidth); + return double(sext); + } else + return double(val); + } + + // Determine if the value is negative. + bool isNeg = isSigned ? (*this)[BitWidth-1] : false; + + // Construct the absolute value if we're negative. + ap_private<_AP_W, _AP_S, _AP_N> Tmp(isNeg ? -(*this) : (*this)); + + // Figure out how many bits we're using. + uint32_t n = Tmp.getActiveBits(); + + // The exponent (without bias normalization) is just the number of bits + // we are using. Note that the sign bit is gone since we constructed the + // absolute value. + uint64_t exp = n; + + // Return infinity for exponent overflow + if (exp > 1023) { + if (!isSigned || !isNeg) + return std::numeric_limits::infinity(); + else + return -std::numeric_limits::infinity(); + } + exp += 1023; // Increment for 1023 bias + + // Number of bits in mantissa is 52. To obtain the mantissa value, we must + // extract the high 52 bits from the correct words in pVal. + uint64_t mantissa; + unsigned hiWord = whichWord(n-1); + if (hiWord == 0) { + mantissa = Tmp.pVal[0]; + if (n > 52) + (mantissa) >>= (n - 52); // shift down, we want the top 52 bits. + } else { + assert(hiWord > 0 && "High word is negative?"); + uint64_t hibits = (Tmp.pVal[hiWord]) << (52 - n % APINT_BITS_PER_WORD); + uint64_t lobits = (Tmp.pVal[hiWord-1]) >> (11 + n % APINT_BITS_PER_WORD); + mantissa = hibits | lobits; + } + + // The leading bit of mantissa is implicit, so get rid of it. + uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0; + union { + double __D; + uint64_t __I; + } __T; + __T.__I = sign | ((exp) << 52) | mantissa; + return __T.__D; +} + +// Square Root - this method computes and returns the square root of "this". +// Three mechanisms are used for computation. For small values (<= 5 bits), +// a table lookup is done. This gets some performance for common cases. For +// values using less than 52 bits, the value is converted to double and then +// the libc sqrt function is called. The result is rounded and then converted +// back to a uint64_t which is then used to construct the result. Finally, +// the Babylonian method for computing square roots is used. +template +ap_private<_AP_W, _AP_S, _AP_N> ap_private<_AP_W, _AP_S, _AP_N>::sqrt() const { + + // Determine the magnitude of the value. + uint32_t magnitude = getActiveBits(); + + // Use a fast table for some small values. This also gets rid of some + // rounding errors in libc sqrt for small values. + if (magnitude <= 5) { + static const uint8_t results[32] = { + /* 0 */ 0, + /* 1- 2 */ 1, 1, + /* 3- 6 */ 2, 2, 2, 2, + /* 7-12 */ 3, 3, 3, 3, 3, 3, + /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4, + /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + /* 31 */ 6 + }; + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ results[ (isSingleWord() ? VAL : pVal[0]) ]); + } + + // If the magnitude of the value fits in less than 52 bits (the precision of + // an IEEE double precision floating point value), then we can use the + // libc sqrt function which will probably use a hardware sqrt computation. + // This should be faster than the algorithm below. + if (magnitude < 52) { +#ifdef _MSC_VER + // Amazingly, VC++ doesn't have round(). + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ + uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5); +#else + return ap_private<_AP_W, _AP_S, _AP_N>(/*BitWidth,*/ + uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0]))))); +#endif + } + + // Okay, all the short cuts are exhausted. We must compute it. The following + // is a classical Babylonian method for computing the square root. This code + // was adapted to APINt from a wikipedia article on such computations. + // See http://www.wikipedia.org/ and go to the page named + // Calculate_an_integer_square_root. + uint32_t nbits = BitWidth, i = 4; + ap_private<_AP_W, _AP_S, _AP_N> testy(16); + ap_private<_AP_W, _AP_S, _AP_N> x_old(/*BitWidth,*/ 1); + ap_private<_AP_W, _AP_S, _AP_N> x_new(0); + ap_private<_AP_W, _AP_S, _AP_N> two(/*BitWidth,*/ 2); + + // Select a good starting value using binary logarithms. + for (;; i += 2, testy = testy.shl(2)) + if (i >= nbits || this->ule(testy)) { + x_old = x_old.shl(i / 2); + break; + } + + // Use the Babylonian method to arrive at the integer square root: + for (;;) { + x_new = (this->udiv(x_old) + x_old).udiv(two); + if (x_old.ule(x_new)) + break; + x_old = x_new; + } + + // Make sure we return the closest approximation + // NOTE: The rounding calculation below is correct. It will produce an + // off-by-one discrepancy with results from pari/gp. That discrepancy has been + // determined to be a rounding issue with pari/gp as it begins to use a + // floating point representation after 192 bits. There are no discrepancies + // between this algorithm and pari/gp for bit widths < 192 bits. + ap_private<_AP_W, _AP_S, _AP_N> square(x_old * x_old); + ap_private<_AP_W, _AP_S, _AP_N> nextSquare((x_old + 1) * (x_old +1)); + if (this->ult(square)) + return x_old; + else if (this->ule(nextSquare)) { + ap_private<_AP_W, _AP_S, _AP_N> midpoint((nextSquare - square).udiv(two)); + ap_private<_AP_W, _AP_S, _AP_N> offset(*this - square); + if (offset.ult(midpoint)) + return x_old; + else + return x_old + 1; + } else + assert(0 && "Error in ap_private<_AP_W, _AP_S, _AP_N>::sqrt computation"); + return x_old + 1; +} + +/// Implementation of Knuth's Algorithm D (Division of nonnegative integers) +/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The +/// variables here have the same names as in the algorithm. Comments explain +/// the algorithm and any deviation from it. +static void KnuthDiv(uint32_t *u, uint32_t *v, uint32_t *q, uint32_t* r, + uint32_t m, uint32_t n) { + assert(u && "Must provide dividend"); + assert(v && "Must provide divisor"); + assert(q && "Must provide quotient"); + assert(u != v && u != q && v != q && "Must us different memory"); + assert(n>1 && "n must be > 1"); + + // Knuth uses the value b as the base of the number system. In our case b + // is 2^31 so we just set it to -1u. + uint64_t b = uint64_t(1) << 32; + + //DEBUG(cerr << "KnuthDiv: m=" << m << " n=" << n << '\n'); + //DEBUG(cerr << "KnuthDiv: original:"); + //DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]); + //DEBUG(cerr << " by"); + //DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]); + //DEBUG(cerr << '\n'); + // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of + // u and v by d. Note that we have taken Knuth's advice here to use a power + // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of + // 2 allows us to shift instead of multiply and it is easy to determine the + // shift amount from the leading zeros. We are basically normalizing the u + // and v so that its high bits are shifted to the top of v's range without + // overflow. Note that this can require an extra word in u so that u must + // be of length m+n+1. + uint32_t shift = CountLeadingZeros_32(v[n-1]); + uint32_t v_carry = 0; + uint32_t u_carry = 0; + if (shift) { + for (uint32_t i = 0; i < m+n; ++i) { + uint32_t u_tmp = (u[i]) >> (32 - shift); + u[i] = ((u[i]) << (shift)) | u_carry; + u_carry = u_tmp; + } + for (uint32_t i = 0; i < n; ++i) { + uint32_t v_tmp = (v[i]) >> (32 - shift); + v[i] = ((v[i]) << (shift)) | v_carry; + v_carry = v_tmp; + } + } + u[m+n] = u_carry; + //DEBUG(cerr << "KnuthDiv: normal:"); + //DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]); + //DEBUG(cerr << " by"); + //DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]); + //DEBUG(cerr << '\n'); + + // D2. [Initialize j.] Set j to m. This is the loop counter over the places. + int j = m; + do { + //DEBUG(cerr << "KnuthDiv: quotient digit #" << j << '\n'); + // D3. [Calculate q'.]. + // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q') + // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r') + // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease + // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test + // on v[n-2] determines at high speed most of the cases in which the trial + // value qp is one too large, and it eliminates all cases where qp is two + // too large. + uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]); + //DEBUG(cerr << "KnuthDiv: dividend == " << dividend << '\n'); + uint64_t qp = dividend / v[n-1]; + uint64_t rp = dividend % v[n-1]; + if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) { + qp--; + rp += v[n-1]; + if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2])) + qp--; + } + //DEBUG(cerr << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n'); + + // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with + // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation + // consists of a simple multiplication by a one-place number, combined with + // a subtraction. + bool isNeg = false; + for (uint32_t i = 0; i < n; ++i) { + uint64_t u_tmp = uint64_t(u[j+i]) | ((uint64_t(u[j+i+1])) << 32); + uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]); + bool borrow = subtrahend > u_tmp; + /*DEBUG(cerr << "KnuthDiv: u_tmp == " << u_tmp + << ", subtrahend == " << subtrahend + << ", borrow = " << borrow << '\n');*/ + + uint64_t result = u_tmp - subtrahend; + uint32_t k = j + i; + u[k++] = (uint32_t)(result & (b-1)); // subtract low word + u[k++] = (uint32_t)((result) >> 32); // subtract high word + while (borrow && k <= m+n) { // deal with borrow to the left + borrow = u[k] == 0; + u[k]--; + k++; + } + isNeg |= borrow; + /*DEBUG(cerr << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " << + u[j+i+1] << '\n');*/ + } + /*DEBUG(cerr << "KnuthDiv: after subtraction:"); + DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]); + DEBUG(cerr << '\n');*/ + // The digits (u[j+n]...u[j]) should be kept positive; if the result of + // this step is actually negative, (u[j+n]...u[j]) should be left as the + // true value plus b**(n+1), namely as the b's complement of + // the true value, and a "borrow" to the left should be remembered. + // + if (isNeg) { + bool carry = true; // true because b's complement is "complement + 1" + for (uint32_t i = 0; i <= m+n; ++i) { + u[i] = ~u[i] + carry; // b's complement + carry = carry && u[i] == 0; + } + } + /*DEBUG(cerr << "KnuthDiv: after complement:"); + DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]); + DEBUG(cerr << '\n');*/ + + // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was + // negative, go to step D6; otherwise go on to step D7. + q[j] = (uint32_t)qp; + if (isNeg) { + // D6. [Add back]. The probability that this step is necessary is very + // small, on the order of only 2/b. Make sure that test data accounts for + // this possibility. Decrease q[j] by 1 + q[j]--; + // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]). + // A carry will occur to the left of u[j+n], and it should be ignored + // since it cancels with the borrow that occurred in D4. + bool carry = false; + for (uint32_t i = 0; i < n; i++) { + uint32_t limit = AESL_std::min(u[j+i],v[i]); + u[j+i] += v[i] + carry; + carry = u[j+i] < limit || (carry && u[j+i] == limit); + } + u[j+n] += carry; + } + /*DEBUG(cerr << "KnuthDiv: after correction:"); + DEBUG(for (int i = m+n; i >=0; i--) cerr <<" " << u[i]); + DEBUG(cerr << "\nKnuthDiv: digit result = " << q[j] << '\n');*/ + + // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3. + } while (--j >= 0); + + /*DEBUG(cerr << "KnuthDiv: quotient:"); + DEBUG(for (int i = m; i >=0; i--) cerr <<" " << q[i]); + DEBUG(cerr << '\n');*/ + + // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired + // remainder may be obtained by dividing u[...] by d. If r is non-null we + // compute the remainder (urem uses this). + if (r) { + // The value d is expressed by the "shift" value above since we avoided + // multiplication by d by using a shift left. So, all we have to do is + // shift right here. In order to mak + if (shift) { + uint32_t carry = 0; + //DEBUG(cerr << "KnuthDiv: remainder:"); + for (int i = n-1; i >= 0; i--) { + r[i] = ((u[i]) >> (shift)) | carry; + carry = (u[i]) << (32 - shift); + //DEBUG(cerr << " " << r[i]); + } + } else { + for (int i = n-1; i >= 0; i--) { + r[i] = u[i]; + //DEBUG(cerr << " " << r[i]); + } + } + //DEBUG(cerr << '\n'); + } + //DEBUG(cerr << std::setbase(10) << '\n'); +} + +template +void divide(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t lhsWords, + const ap_private<_AP_W, _AP_S, _AP_N>& RHS, uint32_t rhsWords, + ap_private<_AP_W, _AP_S, _AP_N> *Quotient, ap_private<_AP_W, _AP_S, _AP_N> *Remainder) { + assert(lhsWords >= rhsWords && "Fractional result"); + enum {APINT_BITS_PER_WORD=64}; + // First, compose the values into an array of 32-bit words instead of + // 64-bit words. This is a necessity of both the "short division" algorithm + // and the the Knuth "classical algorithm" which requires there to be native + // operations for +, -, and * on an m bit value with an m*2 bit result. We + // can't use 64-bit operands here because we don't have native results of + // 128-bits. Furthremore, casting the 64-bit values to 32-bit values won't + // work on large-endian machines. + uint64_t mask = ~0ull >> (sizeof(uint32_t)*8); + uint32_t n = rhsWords * 2; + uint32_t m = (lhsWords * 2) - n; + + // Allocate space for the temporary values we need either on the stack, if + // it will fit, or on the heap if it won't. + uint32_t SPACE[128]; + uint32_t *__U = 0; + uint32_t *__V = 0; + uint32_t *__Q = 0; + uint32_t *__R = 0; + if ((Remainder?4:3)*n+2*m+1 <= 128) { + __U = &SPACE[0]; + __V = &SPACE[m+n+1]; + __Q = &SPACE[(m+n+1) + n]; + if (Remainder) + __R = &SPACE[(m+n+1) + n + (m+n)]; + } else { + __U = new uint32_t[m + n + 1]; + __V = new uint32_t[n]; + __Q = new uint32_t[m+n]; + if (Remainder) + __R = new uint32_t[n]; + } + + // Initialize the dividend + memset(__U, 0, (m+n+1)*sizeof(uint32_t)); + for (unsigned i = 0; i < lhsWords; ++i) { + uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]); + __U[i * 2] = (uint32_t)(tmp & mask); + __U[i * 2 + 1] = (tmp) >> (sizeof(uint32_t)*8); + } + __U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm. + + // Initialize the divisor + memset(__V, 0, (n)*sizeof(uint32_t)); + for (unsigned i = 0; i < rhsWords; ++i) { + uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]); + __V[i * 2] = (uint32_t)(tmp & mask); + __V[i * 2 + 1] = (tmp) >> (sizeof(uint32_t)*8); + } + + // initialize the quotient and remainder + memset(__Q, 0, (m+n) * sizeof(uint32_t)); + if (Remainder) + memset(__R, 0, n * sizeof(uint32_t)); + + // Now, adjust m and n for the Knuth division. n is the number of words in + // the divisor. m is the number of words by which the dividend exceeds the + // divisor (i.e. m+n is the length of the dividend). These sizes must not + // contain any zero words or the Knuth algorithm fails. + for (unsigned i = n; i > 0 && __V[i-1] == 0; i--) { + n--; + m++; + } + for (unsigned i = m+n; i > 0 && __U[i-1] == 0; i--) + m--; + + // If we're left with only a single word for the divisor, Knuth doesn't work + // so we implement the short division algorithm here. This is much simpler + // and faster because we are certain that we can divide a 64-bit quantity + // by a 32-bit quantity at hardware speed and short division is simply a + // series of such operations. This is just like doing short division but we + // are using base 2^32 instead of base 10. + assert(n != 0 && "Divide by zero?"); + if (n == 1) { + uint32_t divisor = __V[0]; + uint32_t remainder = 0; + for (int i = m+n-1; i >= 0; i--) { + uint64_t partial_dividend = (uint64_t(remainder)) << 32 | __U[i]; + if (partial_dividend == 0) { + __Q[i] = 0; + remainder = 0; + } else if (partial_dividend < divisor) { + __Q[i] = 0; + remainder = (uint32_t)partial_dividend; + } else if (partial_dividend == divisor) { + __Q[i] = 1; + remainder = 0; + } else { + __Q[i] = (uint32_t)(partial_dividend / divisor); + remainder = (uint32_t)(partial_dividend - (__Q[i] * divisor)); + } + } + if (__R) + __R[0] = remainder; + } else { + // Now we're ready to invoke the Knuth classical divide algorithm. In this + // case n > 1. + KnuthDiv(__U, __V, __Q, __R, m, n); + } + + // If the caller wants the quotient + if (Quotient) { + // Set up the Quotient value's memory. + if (Quotient->BitWidth != LHS.BitWidth) { + if (Quotient->isSingleWord()) + Quotient->VAL = 0; + } else + Quotient->clear(); + + // The quotient is in Q. Reconstitute the quotient into Quotient's low + // order words. + if (lhsWords == 1) { + uint64_t tmp = + uint64_t(__Q[0]) | ((uint64_t(__Q[1])) << (APINT_BITS_PER_WORD / 2)); + if (Quotient->isSingleWord()) + Quotient->VAL = tmp; + else + Quotient->pVal[0] = tmp; + } else { + assert(!Quotient->isSingleWord() && "Quotient ap_private not large enough"); + for (unsigned i = 0; i < lhsWords; ++i) + Quotient->pVal[i] = + uint64_t(__Q[i*2]) | ((uint64_t(__Q[i*2+1])) << (APINT_BITS_PER_WORD / 2)); + } + Quotient->clearUnusedBits(); + } + + // If the caller wants the remainder + if (Remainder) { + // Set up the Remainder value's memory. + if (Remainder->BitWidth != RHS.BitWidth) { + if (Remainder->isSingleWord()) + Remainder->VAL = 0; + } else + Remainder->clear(); + + // The remainder is in R. Reconstitute the remainder into Remainder's low + // order words. + if (rhsWords == 1) { + uint64_t tmp = + uint64_t(__R[0]) | ((uint64_t(__R[1])) << (APINT_BITS_PER_WORD / 2)); + if (Remainder->isSingleWord()) + Remainder->VAL = tmp; + else + Remainder->pVal[0] = tmp; + } else { + assert(!Remainder->isSingleWord() && "Remainder ap_private not large enough"); + for (unsigned i = 0; i < rhsWords; ++i) + Remainder->pVal[i] = + uint64_t(__R[i*2]) | ((uint64_t(__R[i*2+1])) << (APINT_BITS_PER_WORD / 2)); + } + Remainder->clearUnusedBits(); + } + + // Clean up the memory we allocated. + if (__U != &SPACE[0]) { + delete [] __U; + delete [] __V; + delete [] __Q; + delete [] __R; + } +} + + +template +void ap_private<_AP_W, _AP_S, _AP_N>::fromString(const char *str, uint32_t slen, uint8_t radix) { + enum { numbits=_AP_W}; + // Check our assumptions here + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + assert(str && "String is null?"); + bool isNeg = str[0] == '-'; + if (isNeg) + str++, slen--; + + //skip any leading zero + while(*str == '0' && *(str+1) != '\0') {str++; slen--;} + assert((slen <= numbits || radix != 2) && "Insufficient bit width"); + assert(((slen - 1)*3 <= numbits || radix != 8) && "Insufficient bit width"); + assert(((slen - 1)*4 <= numbits || radix != 16) && "Insufficient bit width"); + assert((((slen -1)*64)/22 <= numbits || radix != 10) && "Insufficient bit width"); + + memset(pVal, 0, _AP_N * sizeof(uint64_t)); + + // Figure out if we can shift instead of multiply + uint32_t shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0); + + // Set up an ap_private for the digit to add outside the loop so we don't + // constantly construct/destruct it. + uint64_t bigVal[_AP_N]; + memset(bigVal, 0, _AP_N * sizeof(uint64_t)); + ap_private<_AP_W, _AP_S, _AP_N> apdigit(getBitWidth(), bigVal); + ap_private<_AP_W, _AP_S, _AP_N> apradix(radix); + + // Enter digit traversal loop + for (unsigned i = 0; i < slen; i++) { + // Get a digit + uint32_t digit = 0; + char cdigit = str[i]; + if (radix == 16) { +#define isxdigit(c) (((c) >= '0' && (c) <= '9') || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) +#define isdigit(c) ((c) >= '0' && (c) <= '9') + if (!isxdigit(cdigit)) + assert(0 && "Invalid hex digit in string"); + if (isdigit(cdigit)) + digit = cdigit - '0'; + else if (cdigit >= 'a') + digit = cdigit - 'a' + 10; + else if (cdigit >= 'A') + digit = cdigit - 'A' + 10; + else + assert(0 && "huh? we shouldn't get here"); + } else if (isdigit(cdigit)) { + digit = cdigit - '0'; + } else { + assert(0 && "Invalid character in digit string"); + } +#undef isxdigit +#undef isdigit + // Shift or multiply the value by the radix + if (shift) + *this <<= shift; + else + *this *= apradix; + + // Add in the digit we just interpreted + if (apdigit.isSingleWord()) + apdigit.VAL = digit; + else + apdigit.pVal[0] = digit; + *this += apdigit; + } + // If its negative, put it in two's complement form + if (isNeg) { + (*this)--; + this->flip(); + } + clearUnusedBits(); +} + +template +std::string ap_private<_AP_W, _AP_S, _AP_N>::toString(uint8_t radix, bool wantSigned) const { + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + static const char *digits[] = { + "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F" + }; + std::string result; + uint32_t bits_used = getActiveBits(); + + if (radix != 10) { + // For the 2, 8 and 16 bit cases, we can just shift instead of divide + // because the number of bits per digit (1,3 and 4 respectively) divides + // equaly. We just shift until there value is zero. + + // First, check for a zero value and just short circuit the logic below. + if (*this == (uint64_t)(0)) + result = "0"; + else { + ap_private<_AP_W, false, _AP_N> tmp(*this); + size_t insert_at = 0; + if (wantSigned && isNegative()) { + // They want to print the signed version and it is a negative value + // Flip the bits and add one to turn it into the equivalent positive + // value and put a '-' in the result. + tmp.flip(); + tmp++; + tmp.clearUnusedBitsToZero(); + result = "-"; + insert_at = 1; + } + // Just shift tmp right for each digit width until it becomes zero + uint32_t shift = (radix == 16 ? 4 : (radix == 8 ? 3 : 1)); + uint64_t mask = radix - 1; + ap_private<_AP_W, false, _AP_N> zero(0); + while (tmp.ne(zero)) { + unsigned digit = (tmp.isSingleWord() ? tmp.VAL : tmp.pVal[0]) & mask; + result.insert(insert_at, digits[digit]); + tmp = tmp.lshr(shift); + } + } + return result; + } + + ap_private<_AP_W, false, _AP_N> tmp(*this); + ap_private<_AP_W, false, _AP_N> divisor(radix); + ap_private<_AP_W, false, _AP_N> zero(0); + size_t insert_at = 0; + if (wantSigned && isNegative()) { + // They want to print the signed version and it is a negative value + // Flip the bits and add one to turn it into the equivalent positive + // value and put a '-' in the result. + tmp.flip(); + tmp++; + tmp.clearUnusedBitsToZero(); + result = "-"; + insert_at = 1; + } + if (tmp == ap_private<_AP_W, false, _AP_N>(0)) + result = "0"; + else while (tmp.ne(zero)) { + ap_private<_AP_W, false, _AP_N> APdigit(0); + ap_private<_AP_W, false, _AP_N> tmp2(0); + divide(tmp, tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2, + &APdigit); + uint32_t digit = APdigit.getZExtValue(); + assert(digit < radix && "divide failed"); + result.insert(insert_at,digits[digit]); + tmp = tmp2; + } + + return result; +} + +// This implements a variety of operations on a representation of +// arbitrary precision, two's-complement, bignum integer values. + +/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe + and unrestricting assumption. */ + +/* Some handy functions local to this file. */ + +template +void divide(const ap_private<_AP_W, _AP_S, _AP_N>& LHS, uint32_t lhsWords, + uint64_t RHS, + ap_private<_AP_W, _AP_S, _AP_N> *Quotient, ap_private<_AP_W, _AP_S, _AP_N> *Remainder) { + uint32_t rhsWords=1; + assert(lhsWords >= rhsWords && "Fractional result"); + enum {APINT_BITS_PER_WORD=64}; + // First, compose the values into an array of 32-bit words instead of + // 64-bit words. This is a necessity of both the "short division" algorithm + // and the the Knuth "classical algorithm" which requires there to be native + // operations for +, -, and * on an m bit value with an m*2 bit result. We + // can't use 64-bit operands here because we don't have native results of + // 128-bits. Furthremore, casting the 64-bit values to 32-bit values won't + // work on large-endian machines. + uint64_t mask = ~0ull >> (sizeof(uint32_t)*8); + uint32_t n = 2; + uint32_t m = (lhsWords * 2) - n; + + // Allocate space for the temporary values we need either on the stack, if + // it will fit, or on the heap if it won't. + uint32_t SPACE[128]; + uint32_t *__U = 0; + uint32_t *__V = 0; + uint32_t *__Q = 0; + uint32_t *__R = 0; + if ((Remainder?4:3)*n+2*m+1 <= 128) { + __U = &SPACE[0]; + __V = &SPACE[m+n+1]; + __Q = &SPACE[(m+n+1) + n]; + if (Remainder) + __R = &SPACE[(m+n+1) + n + (m+n)]; + } else { + __U = new uint32_t[m + n + 1]; + __V = new uint32_t[n]; + __Q = new uint32_t[m+n]; + if (Remainder) + __R = new uint32_t[n]; + } + + // Initialize the dividend + memset(__U, 0, (m+n+1)*sizeof(uint32_t)); + for (unsigned i = 0; i < lhsWords; ++i) { + uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]); + __U[i * 2] = tmp & mask; + __U[i * 2 + 1] = (tmp) >> (sizeof(uint32_t)*8); + } + __U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm. + + // Initialize the divisor + memset(__V, 0, (n)*sizeof(uint32_t)); + __V[0] = RHS & mask; + __V[1] = (RHS) >> (sizeof(uint32_t)*8); + + // initialize the quotient and remainder + memset(__Q, 0, (m+n) * sizeof(uint32_t)); + if (Remainder) + memset(__R, 0, n * sizeof(uint32_t)); + + // Now, adjust m and n for the Knuth division. n is the number of words in + // the divisor. m is the number of words by which the dividend exceeds the + // divisor (i.e. m+n is the length of the dividend). These sizes must not + // contain any zero words or the Knuth algorithm fails. + for (unsigned i = n; i > 0 && __V[i-1] == 0; i--) { + n--; + m++; + } + for (unsigned i = m+n; i > 0 && __U[i-1] == 0; i--) + m--; + + // If we're left with only a single word for the divisor, Knuth doesn't work + // so we implement the short division algorithm here. This is much simpler + // and faster because we are certain that we can divide a 64-bit quantity + // by a 32-bit quantity at hardware speed and short division is simply a + // series of such operations. This is just like doing short division but we + // are using base 2^32 instead of base 10. + assert(n != 0 && "Divide by zero?"); + if (n == 1) { + uint32_t divisor = __V[0]; + uint32_t remainder = 0; + for (int i = m+n-1; i >= 0; i--) { + uint64_t partial_dividend = (uint64_t(remainder)) << 32 | __U[i]; + if (partial_dividend == 0) { + __Q[i] = 0; + remainder = 0; + } else if (partial_dividend < divisor) { + __Q[i] = 0; + remainder = partial_dividend; + } else if (partial_dividend == divisor) { + __Q[i] = 1; + remainder = 0; + } else { + __Q[i] = partial_dividend / divisor; + remainder = partial_dividend - (__Q[i] * divisor); + } + } + if (__R) + __R[0] = remainder; + } else { + // Now we're ready to invoke the Knuth classical divide algorithm. In this + // case n > 1. + KnuthDiv(__U, __V, __Q, __R, m, n); + } + + // If the caller wants the quotient + if (Quotient) { + // Set up the Quotient value's memory. + if (Quotient->BitWidth != LHS.BitWidth) { + if (Quotient->isSingleWord()) + Quotient->VAL = 0; + else + delete [] Quotient->pVal; + } else + Quotient->clear(); + + // The quotient is in Q. Reconstitute the quotient into Quotient's low + // order words. + if (lhsWords == 1) { + uint64_t tmp = + uint64_t(__Q[0]) | ((uint64_t(__Q[1])) << (APINT_BITS_PER_WORD / 2)); + if (Quotient->isSingleWord()) + Quotient->VAL = tmp; + else + Quotient->pVal[0] = tmp; + } else { + assert(!Quotient->isSingleWord() && "Quotient ap_private not large enough"); + for (unsigned i = 0; i < lhsWords; ++i) + Quotient->pVal[i] = + uint64_t(__Q[i*2]) | ((uint64_t(__Q[i*2+1])) << (APINT_BITS_PER_WORD / 2)); + } + Quotient->clearUnusedBits(); + } + + // If the caller wants the remainder + if (Remainder) { + // Set up the Remainder value's memory. + if (Remainder->BitWidth != 64 /* RHS.BitWidth */) { + if (Remainder->isSingleWord()) + Remainder->VAL = 0; + } else + Remainder->clear(); + + // The remainder is in __R. Reconstitute the remainder into Remainder's low + // order words. + if (rhsWords == 1) { + uint64_t tmp = + uint64_t(__R[0]) | ((uint64_t(__R[1])) << (APINT_BITS_PER_WORD / 2)); + if (Remainder->isSingleWord()) + Remainder->VAL = tmp; + else + Remainder->pVal[0] = tmp; + } else { + assert(!Remainder->isSingleWord() && "Remainder ap_private not large enough"); + for (unsigned i = 0; i < rhsWords; ++i) + Remainder->pVal[i] = + uint64_t(__R[i*2]) | ((uint64_t(__R[i*2+1])) << (APINT_BITS_PER_WORD / 2)); + } + Remainder->clearUnusedBits(); + } + + // Clean up the memory we allocated. + if (__U != &SPACE[0]) { + delete [] __U; + delete [] __V; + delete [] __Q; + delete [] __R; + } +} + +//When bitwidth < 64 +template class ap_private <_AP_W, _AP_S, 1> { +#ifdef _MSC_VER +#pragma warning( disable : 4521 4522 ) +#endif +public: + typedef typename retval<_AP_S>::Type ValType; + template + struct RType { + enum { + _AP_N =1, + mult_w = _AP_W+_AP_W2, + mult_s = _AP_S||_AP_S2, //?? why + plus_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2))+1, //shouldn't it be AP_MAX(_AP_W,_AP_W2)+!(_AP_S^_AP_S2)+1 ???? + plus_s = _AP_S||_AP_S2, + minus_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2))+1, + minus_s = true, + div_w = _AP_W+_AP_S2, + div_s = _AP_S||_AP_S2, + mod_w = AP_MIN(_AP_W,_AP_W2+(!_AP_S2&&_AP_S)), + mod_s = _AP_S, + logic_w = AP_MAX(_AP_W+(_AP_S2&&!_AP_S),_AP_W2+(_AP_S&&!_AP_S2)), + logic_s = _AP_S||_AP_S2 + }; + typedef ap_private mult; + typedef ap_private plus; + typedef ap_private minus; + typedef ap_private logic; + typedef ap_private div; + typedef ap_private mod; + typedef ap_private<_AP_W, _AP_S> arg1; + typedef bool reduce; + }; + enum { APINT_BITS_PER_WORD = 64}; + enum { excess_bits = (_AP_W%APINT_BITS_PER_WORD) ? APINT_BITS_PER_WORD -(_AP_W%APINT_BITS_PER_WORD) : 0}; + static const uint64_t mask = ((uint64_t)~0ULL >> (excess_bits)); + static const uint64_t not_mask = ~mask; + static const uint64_t sign_bit_mask = 1ULL << (APINT_BITS_PER_WORD-1); + template struct sign_ext_mask { static const uint64_t mask=~0ULL<<_AP_W1;}; + + enum { BitWidth=_AP_W}; + uint64_t VAL; ///< Used to store the <= 64 bits integer value. + const uint64_t *const pVal; + + INLINE uint32_t getBitWidth() const { + return BitWidth; + } + + template + ap_private<_AP_W, _AP_S, 1>& operator=(const ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + VAL = RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template + ap_private<_AP_W, _AP_S, 1>& operator=(const volatile ap_private<_AP_W1, _AP_S1, _AP_N1>& RHS) { + VAL = RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template + ap_private<_AP_W, _AP_S, 1>& operator=(const ap_private<_AP_W1, _AP_S1, 1>& RHS) { + VAL = RHS.VAL; + clearUnusedBits(); + return *this; + } + + template + ap_private<_AP_W, _AP_S, 1>& operator=(const volatile ap_private<_AP_W1, _AP_S1, 1>& RHS) { + VAL = RHS.VAL; + clearUnusedBits(); + return *this; + } + + volatile ap_private& operator=(const ap_private& RHS) volatile { + // Don't do anything for X = X + VAL = RHS.VAL; // No need to check because no harm done by copying. + return *this; + } + ap_private& operator=(const ap_private& RHS) { + // Don't do anything for X = X + VAL = RHS.VAL; // No need to check because no harm done by copying. + return *this; + } + + volatile ap_private& operator=(const volatile ap_private& RHS) volatile { + // Don't do anything for X = X + VAL = RHS.VAL; // No need to check because no harm done by copying. + return *this; + } + ap_private& operator=(const volatile ap_private& RHS) { + // Don't do anything for X = X + VAL = RHS.VAL; // No need to check because no harm done by copying. + return *this; + } + + template + INLINE ap_private& operator = (const ap_range_ref<_AP_W2, _AP_S2>& op2) { + *this = ap_private<_AP_W2, false>(op2); + return *this; + } + + explicit INLINE ap_private(uint64_t* val) : VAL(val[0]), pVal(&VAL){ + clearUnusedBits(); + } + + INLINE bool isSingleWord() const { return true; } + + INLINE void fromString(const char *strStart, uint32_t slen, + uint8_t radix, int offset=0) { + // Check our assumptions here + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + assert(strStart && "String is null?"); + strStart+=offset; + switch(radix) { + case 2: + // sscanf(strStart,"%b",&VAL); + VAL = *strStart =='1' ? ~0ULL : 0; + for (;*strStart; ++strStart) { + assert((*strStart=='0'|| *strStart=='1')&&("Wrong binary number") ); + VAL <<=1; + VAL |= (*strStart-'0'); + } + break; + case 8: +#if __WIN32__ + sscanf(strStart,"%I64o",&VAL); +#else + +#if defined __x86_64__ + sscanf(strStart,"%lo",&VAL); +#else + sscanf(strStart,"%llo",&VAL); +#endif + +#endif + break; + case 10: +#if __WIN32__ + sscanf(strStart,"%I64u",&VAL); +#else + +#if defined __x86_64__ + sscanf(strStart,"%lu",&VAL); +#else + sscanf(strStart,"%llu",&VAL); +#endif + +#endif + break; + case 16: +#if __WIN32__ + sscanf(strStart,"%I64x",&VAL); +#else + +#if defined __x86_64__ + sscanf(strStart,"%lx",&VAL); +#else + sscanf(strStart,"%llx",&VAL); +#endif + +#endif + break; + default: + assert(true && "Unknown radix"); + // error + } + clearUnusedBits(); + } + + INLINE ap_private() : pVal(&VAL){VAL = 0ULL;} + +#define CTOR(TYPE) \ + INLINE ap_private(TYPE v) : VAL((uint64_t)v), pVal(&VAL) { \ + clearUnusedBits(); \ + } + CTOR(int) + CTOR(bool) + CTOR(signed char) + CTOR(unsigned char) + CTOR(short) + CTOR(unsigned short) + CTOR(unsigned int) + CTOR(long) + CTOR(unsigned long) + CTOR(unsigned long long) + CTOR(long long) + CTOR(float) + CTOR(double) +#undef CTOR + ap_private(uint32_t numWords, const uint64_t bigVal[]): VAL(bigVal[0]), pVal(&VAL) {clearUnusedBits();} + + ap_private(const std::string& val, uint8_t radix=2, int base=0, int offset=0): VAL(0), pVal(&VAL) { + assert(!val.empty() && "String empty?"); + fromString(val.c_str()+base, val.size()-base, radix); + } + + ap_private(const char strStart[], uint32_t slen, uint8_t radix, int base=0, int offset=0) : VAL(0), pVal(&VAL) { + fromString(strStart+base, slen-base, radix, offset); + } + + ap_private(const ap_private& that) : VAL(that.VAL), pVal(&VAL) { + clearUnusedBits(); + } + + template + ap_private(const ap_private<_AP_W1, _AP_S1, 1>& that) : VAL(that.VAL), pVal(&VAL) { + clearUnusedBits(); + } + + template + ap_private(const ap_private<_AP_W1, _AP_S1, _AP_N1>& that) : VAL(that.pVal[0]), pVal(&VAL) { + clearUnusedBits(); + } + + template + ap_private(const volatile ap_private<_AP_W1, _AP_S1, _AP_N1>& that) : VAL(that.pVal[0]), pVal(&VAL) { + clearUnusedBits(); + } + +#if 0 +template + explicit ap_private(const ap_private<_AP_W1, true, 1+_AP_W1/64>& that) + : VAL((_AP_W1>_AP_W) ? that.VAL & mask : ((1ULL<<(_AP_W1-1)&that.pVal[0]) ? sign_ext_mask<_AP_W1>::mask | that.VAL : that.pVal[0])), pVal(&VAL) {} + +template + explicit ap_private(const ap_private<_AP_W1, false, (_AP_W1+63)/64>& that) + : VAL(that.VAL & mask), pVal(&VAL) {} +#endif + + explicit ap_private(const char* val) : pVal(&VAL) { + std::string str(val); + uint32_t strLen = str.length(); + const char *strp = str.c_str(); + uint32_t offset = 0; + uint32_t base = 0; + bool neg = false; + uint32_t radix = 10; + ap_parse_sign(strp, base, neg); + ap_parse_prefix(strp + base, offset, radix); + + if ((radix != 10 && neg) || + (strLen - base - offset <= 0) || + InvalidDigit(strp, strLen, base + offset, radix)) { + fprintf(stderr, "invalid character string %s !\n", val); + assert(0); + } + + ap_private<_AP_W, _AP_S> ap_private_val(str.c_str(), strLen, radix, base, offset); + if (neg) + ap_private_val = -ap_private_val; + operator = (ap_private_val); + } + + ap_private(const char* val, signed char rd): pVal(&VAL) { + std::string str(val); + uint32_t strLen = str.length(); + const char *strp = str.c_str(); + uint32_t offset = 0; + uint32_t base = 0; + uint32_t radix = rd; + bool neg = false; + ap_parse_sign(strp, base, neg); + ap_parse_prefix(strp + base, offset, radix); + + if ((radix != 10 && neg) || + (strLen - base - offset <= 0) || + InvalidDigit(strp, strLen, base + offset, radix)) { + fprintf(stderr, "invalid character string %s !\n", val); + assert(0); + } + + uint32_t bitsNeeded = ap_private<_AP_W, _AP_S>::getBitsNeeded(strp, strLen, radix); + ap_private<_AP_W, _AP_S> ap_private_val(strp , strLen, radix, base, offset); + //ap_private<_AP_W, _AP_S> ap_private_val(bitsNeeded, strp , strLen, radix, base, offset); + if (strp[0] == '-') + ap_private_val = -ap_private_val; + operator = (ap_private_val); + } + + INLINE bool isNegative() const { + static const uint64_t sign_mask = 1ULL << (_AP_W-1); + return _AP_S && (sign_mask & VAL); + } + + INLINE bool isPositive() const { + return !isNegative(); + } + + INLINE bool isStrictlyPositive() const { + return !isNegative() && VAL!=0; + } + + INLINE bool isAllOnesValue() const { + return (mask & VAL) == mask; + } + + template + INLINE bool operator==(const ap_private<_AP_W1, _AP_S1, 1>& RHS) const { + return (VAL == RHS.VAL); + } + + INLINE bool operator==(const ap_private<_AP_W, _AP_S>& RHS) const { return VAL == RHS.VAL; } + INLINE bool operator==(const ap_private<_AP_W, !_AP_S>& RHS) const { return getVal() == RHS.getVal(); } + INLINE bool operator==(uint64_t Val) const { return (VAL == Val); } + INLINE bool operator!=(uint64_t Val) const { return (VAL != Val); } + INLINE bool operator!=(const ap_private<_AP_W, _AP_S>& RHS) const { return VAL != RHS.VAL; } + INLINE bool operator!=(const ap_private<_AP_W, !_AP_S>& RHS) const { return getVal() != RHS.getVal(); } + const ap_private operator++() { ++VAL; clearUnusedBits(); return *this; } + const ap_private operator--(int) { + ap_private orig(*this); + --VAL; clearUnusedBits(); + return orig; + } + const ap_private operator--() { --VAL; clearUnusedBits(); return *this;} + INLINE bool operator !() const { return !VAL;} + + const ap_private operator++(int) { + ap_private orig(*this); + VAL++; clearUnusedBits(); + return orig; + } + + const ap_private operator~() {return ap_private(~VAL);} + INLINE typename RType<1,false>::minus operator-() const { + return ap_private<1,false>(0) - (*this); + } + + INLINE std::string toString(uint8_t radix, bool wantSigned) const ; + INLINE std::string toStringUnsigned(uint8_t radix = 10) const { + return toString(radix, false); + } + INLINE std::string toStringSigned(uint8_t radix = 10) const { + return toString(radix, true); + } + INLINE void clear() { + VAL=0; + } + INLINE ap_private& clear(uint32_t bitPosition) { VAL &= ~(1ULL<<(bitPosition)); clearUnusedBits(); return *this;} + + INLINE ap_private ashr(uint32_t shiftAmt) const { + enum {excess_bits = APINT_BITS_PER_WORD - BitWidth}; + if (_AP_S) + return ap_private((shiftAmt == BitWidth) ? 0 : ((int64_t)VAL) >> (shiftAmt)); + else + return ap_private((shiftAmt == BitWidth) ? 0 : (VAL) >> (shiftAmt)); + } + + INLINE ap_private lshr(uint32_t shiftAmt) const { + return ap_private((shiftAmt == BitWidth) ? ap_private(0) : ap_private((VAL&mask) >> (shiftAmt))); + } + + INLINE ap_private shl(uint32_t shiftAmt) const { + if (shiftAmt > BitWidth) { + if (!isNegative()) + return ap_private(0); + else return ap_private(-1); + } + if (shiftAmt == BitWidth) return ap_private(0); + else return ap_private((VAL) << (shiftAmt)); + //return ap_private((shiftAmt == BitWidth) ? ap_private(0ULL) : ap_private(VAL << shiftAmt)); + } + + INLINE int64_t getSExtValue() const { + return VAL; + } + + INLINE uint64_t getZExtValue() const { + return VAL & mask; + } + + template + INLINE ap_private(const ap_range_ref<_AP_W2,_AP_S2>& ref) : pVal(&VAL) { + *this=ref.get(); + } + + template + INLINE ap_private(const ap_bit_ref<_AP_W2,_AP_S2>& ref) : pVal(&VAL) { + *this = ((uint64_t)(bool)ref); + } + + template + INLINE ap_private(const ap_concat_ref<_AP_W2, _AP_T2,_AP_W3, _AP_T3>& ref) : pVal(&VAL) { + *this=ref.get(); + } + + template + INLINE ap_private(const af_range_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2> &val) : pVal(&VAL) { + *this = ((val.operator ap_private<_AP_W2, false> ())); + } + + template + INLINE ap_private(const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, + _AP_Q2, _AP_O2, _AP_N2> &val) : pVal(&VAL) { + *this = (uint64_t)(bool)val; + } + + INLINE void write(const ap_private<_AP_W, _AP_S>& op2) volatile { + *this = (op2); + } + + //Explicit conversions to C interger types + //----------------------------------------------------------- + ValType getVal() const { + return VAL; + } + operator ValType () const { + return getVal(); + } + INLINE int to_int() const { + // ap_private<64 /* _AP_W */, _AP_S> res(V); + return (int) getVal(); + } + + INLINE unsigned to_uint() const { + return (unsigned) getVal(); + } + + INLINE long to_long() const { + return (long) getVal(); + } + + INLINE unsigned long to_ulong() const { + return (unsigned long) getVal(); + } + + INLINE ap_slong to_int64() const { + return (ap_slong) getVal(); + } + + INLINE ap_ulong to_uint64() const { + return (ap_ulong) getVal(); + } + + INLINE double to_double() const { + if (isNegative()) + return roundToDouble(true); + else + return roundToDouble(false); + } + + INLINE bool isMinValue() const { return VAL == 0;} + template INLINE ap_private& operator&=(const ap_private<_AP_W1, _AP_S1>& RHS) { + VAL = VAL&RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template INLINE ap_private& operator|=(const ap_private<_AP_W1, _AP_S1>& RHS) { + VAL = VAL|RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template INLINE ap_private& operator^=(const ap_private<_AP_W1, _AP_S1>& RHS){ + VAL = VAL^RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template INLINE ap_private& operator*=(const ap_private<_AP_W1, _AP_S1>& RHS){ + VAL = VAL*RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template INLINE ap_private& operator+=(const ap_private<_AP_W1, _AP_S1>& RHS){ + VAL = VAL+RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + + template INLINE ap_private& operator-=(const ap_private<_AP_W1, _AP_S1>& RHS){ + VAL = VAL-RHS.pVal[0]; + clearUnusedBits(); + return *this; + } + INLINE const ap_private& operator<<=(uint32_t shiftAmt) { VAL<<=shiftAmt; clearUnusedBits(); return *this; } + + template INLINE typename RType<_AP_W1, _AP_S1>::logic operator&(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1, _AP_S1>::logic_w <= 64) { + typename RType<_AP_W1, _AP_S1>::logic Ret(VAL & RHS.VAL); + return Ret; + } else { + typename RType<_AP_W1, _AP_S1>::logic Ret = *this; + return Ret & RHS; + } + } + + template INLINE typename RType<_AP_W1, _AP_S1>::logic operator^(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1, _AP_S1>::logic_w <= 64) { + typename RType<_AP_W1, _AP_S1>::logic Ret(VAL ^ RHS.VAL); + return Ret; + } else { + typename RType<_AP_W1, _AP_S1>::logic Ret = *this; + return Ret ^ RHS; + } + } + + template INLINE typename RType<_AP_W1, _AP_S1>::logic operator|(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1, _AP_S1>::logic_w <= 64) { + typename RType<_AP_W1, _AP_S1>::logic Ret(VAL | RHS.VAL); + return Ret; + } else { + typename RType<_AP_W1, _AP_S1>::logic Ret = *this; + return Ret | RHS; + } + } + + INLINE ap_private<_AP_W, _AP_S> And(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL & RHS.VAL); + } + + INLINE ap_private<_AP_W, _AP_S> Or(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL | RHS.VAL); + } + + INLINE ap_private<_AP_W, _AP_S> Xor(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL ^ RHS.VAL); + } +#if 1 + template + INLINE typename RType<_AP_W1, _AP_S1>::mult operator*(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1, _AP_S1>::mult_w <= 64) { + typename RType<_AP_W1, _AP_S1>::mult Result(VAL * RHS.VAL); + return Result; + } else { + typename RType<_AP_W1, _AP_S1>::mult Result = typename RType<_AP_W1, _AP_S1>::mult(*this); + Result *= RHS; + return Result; + } + } +#endif + INLINE ap_private<_AP_W, _AP_S> Mul(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL * RHS.VAL); + } + + INLINE ap_private<_AP_W, _AP_S> Add(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL + RHS.VAL); + } + + INLINE ap_private<_AP_W, _AP_S> Sub(const ap_private<_AP_W, _AP_S>& RHS) const { + return ap_private<_AP_W, _AP_S>(VAL - RHS.VAL); + } + +#if 1 + INLINE ap_private& operator&=(uint64_t RHS) { VAL &= RHS; clearUnusedBits(); return *this;} + INLINE ap_private& operator|=(uint64_t RHS) { VAL |= RHS; clearUnusedBits(); return *this;} + INLINE ap_private& operator^=(uint64_t RHS){ VAL ^= RHS; clearUnusedBits(); return *this;} + INLINE ap_private& operator*=(uint64_t RHS){ VAL *= RHS; clearUnusedBits(); return *this; } + INLINE ap_private& operator+=(uint64_t RHS){ VAL += RHS; clearUnusedBits(); return *this;} + INLINE ap_private& operator-=(uint64_t RHS){ VAL -= RHS; clearUnusedBits(); return *this; } + INLINE ap_private operator&(uint64_t RHS) const { return ap_private(VAL & RHS); } + INLINE ap_private operator|(uint64_t RHS) const { return ap_private(VAL | RHS); } + INLINE ap_private operator^(uint64_t RHS) const { return ap_private(VAL ^ RHS); } + INLINE ap_private operator*(uint64_t RHS) const { return ap_private(VAL * RHS); } + INLINE ap_private operator/(uint64_t RHS) const { return ap_private(VAL / RHS); } + INLINE ap_private operator+(uint64_t RHS) const { return ap_private(VAL + RHS); } + INLINE ap_private operator-(uint64_t RHS) const { return ap_private(VAL - RHS); } +#endif + INLINE bool isMinSignedValue() const { + static const uint64_t min_mask = ~(~0ULL << (_AP_W-1)); + return BitWidth == 1 ? VAL == 1 : + (ap_private_ops::isNegative<_AP_W>(*this) && ((min_mask & VAL)==0)); + } + +#if 1 + + template INLINE + typename RType<_AP_W1,_AP_S1>::plus operator+(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1,_AP_S1>::plus_w <=64) + return typename RType<_AP_W1,_AP_S1>::plus(RType<_AP_W1,_AP_S1>::plus_s ? int64_t(VAL+RHS.VAL):uint64_t(VAL+RHS.VAL)); + typename RType<_AP_W1,_AP_S1>::plus Result=RHS; + Result += VAL; + return Result; + } + + template INLINE + typename RType<_AP_W1,_AP_S1>::minus operator-(const ap_private<_AP_W1, _AP_S1>& RHS) const { + if (RType<_AP_W1,_AP_S1>::minus_w <=64) + return typename RType<_AP_W1,_AP_S1>::minus(int64_t(VAL-RHS.VAL)); + typename RType<_AP_W1,_AP_S1>::minus Result=*this; + Result -= RHS; + return Result; + } +#endif // #if 1 + + INLINE ap_private& flip() { + VAL = (~0ULL^VAL)&mask; + clearUnusedBits(); + return *this; + } + + uint32_t countPopulation() const { return CountPopulation_64(VAL);} + uint32_t countLeadingZeros() const { + int remainder = BitWidth % APINT_BITS_PER_WORD; + int excessBits = (APINT_BITS_PER_WORD - remainder) % APINT_BITS_PER_WORD; + //enum { remainder = BitWidth % APINT_BITS_PER_WORD, excessBits = APINT_BITS_PER_WORD - remainder}; + uint32_t Count = CountLeadingZeros_64(VAL); + if (Count) + Count-=excessBits; + return AESL_std::min(Count, (uint32_t)_AP_W); + } + + /// HiBits - This function returns the high "numBits" bits of this ap_private. + ap_private<_AP_W, _AP_S, 1> getHiBits(uint32_t numBits) const { + ap_private<_AP_W, _AP_S, 1> ret(*this); + ret = (ret)>>(BitWidth - numBits); + return ret; + } + + /// LoBits - This function returns the low "numBits" bits of this ap_private. + ap_private<_AP_W, _AP_S, 1> getLoBits(uint32_t numBits) const { + ap_private<_AP_W, _AP_S, 1> ret((VAL) << (BitWidth - numBits)); + ret = (ret)>>(BitWidth - numBits); + return ret; + //return ap_private(numBits, (VAL << (BitWidth - numBits))>> (BitWidth - numBits)); + } + + ap_private<_AP_W, _AP_S,1>& set(uint32_t bitPosition) { + VAL |= (1ULL << (bitPosition)); + clearUnusedBits(); + return *this; // clearUnusedBits(); + } + + void set() { + VAL = ~0ULL; + clearUnusedBits(); + } + + template + INLINE void set(const ap_private<_AP_W3, false> & val) { + operator = (ap_private<_AP_W3, _AP_S>(val)); + } + + INLINE void set(const ap_private & val) { + operator = (val); + } + + bool operator[](uint32_t bitPosition) const { + return (((1ULL << (bitPosition)) & VAL) != 0); + } + + INLINE void clearUnusedBits(void) { + enum { excess_bits = (_AP_W%APINT_BITS_PER_WORD) ? APINT_BITS_PER_WORD -_AP_W%APINT_BITS_PER_WORD : 0}; + VAL = _AP_S ? ((((int64_t)VAL)<<(excess_bits))>> (excess_bits)) : (excess_bits ? ((VAL)<<(excess_bits))>>(excess_bits) : VAL); + } + + INLINE void clearUnusedBitsToZero(void) { + enum { excess_bits = (_AP_W%APINT_BITS_PER_WORD) ? APINT_BITS_PER_WORD -_AP_W%APINT_BITS_PER_WORD : 0}; + static uint64_t mask = ~0ULL >> (excess_bits); + VAL &= mask; + } + + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1> udiv(const ap_private<_AP_W, _AP_S1>& RHS) const { + return ap_private<_AP_W, _AP_S||_AP_S1>(VAL / RHS.VAL); + } + + INLINE ap_private udiv(uint64_t RHS) const { + return ap_private(VAL / RHS); + } + + /// Signed divide this ap_private by ap_private RHS. + /// @brief Signed division function for ap_private. + template + INLINE ap_private<_AP_W, _AP_S||_AP_S1> sdiv(const ap_private<_AP_W, _AP_S1> & RHS) const { + if (isNegative()) + if (RHS.isNegative()) + return (-(*this)).udiv(-RHS); + else + return -((-(*this)).udiv(RHS)); + else if (RHS.isNegative()) + return -(this->udiv(-RHS)); + return this->udiv(RHS); + } + + /// Signed divide this ap_private by ap_private RHS. + /// @brief Signed division function for ap_private. + INLINE ap_private sdiv(int64_t RHS) const { + if (isNegative()) + if (RHS<0) + return (-(*this)).udiv(-RHS); + else + return -((-(*this)).udiv(RHS)); + else if (RHS<0) + return -(this->udiv(-RHS)); + return this->udiv(RHS); + } + + template + INLINE ap_private urem(const ap_private<_AP_W, _AP_S2>& RHS) const { + assert(RHS.VAL != 0 && "Divide by 0"); + return ap_private(VAL%RHS.VAL); + } + + INLINE ap_private urem(uint64_t RHS) const { + assert(RHS != 0 && "Divide by 0"); + return ap_private(VAL%RHS); + } + + /// Signed remainder operation on ap_private. + /// @brief Function for signed remainder operation. + template + INLINE ap_private srem(const ap_private<_AP_W, _AP_S2>& RHS) const { + if (isNegative()) { + ap_private lhs = -(*this); + if (RHS.isNegative()) { + ap_private rhs = -RHS; + return -(lhs.urem(rhs)); + } else + return -(lhs.urem(RHS)); + } else if (RHS.isNegative()) { + ap_private rhs = -RHS; + return this->urem(rhs); + } + return this->urem(RHS); + } + + /// Signed remainder operation on ap_private. + /// @brief Function for signed remainder operation. + INLINE ap_private srem(int64_t RHS) const { + if (isNegative()) + if (RHS<0) + return -((-(*this)).urem(-RHS)); + else + return -((-(*this)).urem(RHS)); + else if (RHS<0) + return this->urem(-RHS); + return this->urem(RHS); + } + + INLINE static void udivrem(const ap_private &LHS, const ap_private &RHS, + ap_private &Quotient, ap_private &Remainder){ + assert(RHS!=0 && "Divide by 0"); + Quotient = LHS.VAl/RHS.VAl; + Remainder = LHS.VAL % RHS.VAL; + } + + INLINE static void udivrem(const ap_private &LHS, uint64_t RHS, + ap_private &Quotient, ap_private &Remainder){ + assert(RHS!=0 && "Divide by 0"); + Quotient = LHS.VAl/RHS; + Remainder = LHS.VAL % RHS; + } + + INLINE static void sdivrem(const ap_private &LHS, const ap_private &RHS, + ap_private &Quotient, ap_private &Remainder) { + if (LHS.isNegative()) { + if (RHS.isNegative()) + ap_private::udivrem(-LHS, -RHS, Quotient, Remainder); + else + ap_private::udivrem(-LHS, RHS, Quotient, Remainder); + Quotient = -Quotient; + Remainder = -Remainder; + } else if (RHS.isNegative()) { + ap_private::udivrem(LHS, -RHS, Quotient, Remainder); + Quotient = -Quotient; + } else { + ap_private::udivrem(LHS, RHS, Quotient, Remainder); + } + } + + INLINE static void sdivrem(const ap_private &LHS, int64_t RHS, + ap_private &Quotient, ap_private &Remainder) { + if (LHS.isNegative()) { + if (RHS<0) + ap_private::udivrem(-LHS, -RHS, Quotient, Remainder); + else + ap_private::udivrem(-LHS, RHS, Quotient, Remainder); + Quotient = -Quotient; + Remainder = -Remainder; + } else if (RHS<0) { + ap_private::udivrem(LHS, -RHS, Quotient, Remainder); + Quotient = -Quotient; + } else { + ap_private::udivrem(LHS, RHS, Quotient, Remainder); + } + } + + template INLINE bool eq(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return (*this) == RHS; + } + + template INLINE bool ne(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return !((*this) == RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// the validity of the less-than relationship. + /// @returns true if *this < RHS when both are considered unsigned. + /// @brief Unsigned less than comparison + template INLINE bool ult(const ap_private<_AP_W1, _AP_S1, 1>& RHS) const { + uint64_t lhsZext = ((uint64_t(VAL)) << (64-_AP_W)) >> (64-_AP_W); + uint64_t rhsZext = ((uint64_t(RHS.VAL)) << (64-_AP_W1)) >> (64-_AP_W1); + return lhsZext < rhsZext; + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// validity of the less-than relationship. + /// @returns true if *this < RHS when both are considered signed. + /// @brief Signed less than comparison + template INLINE bool slt(const ap_private<_AP_W1, _AP_S1, 1>& RHS) const { + int64_t lhsSext = ((int64_t(VAL)) << (64-_AP_W)) >> (64-_AP_W); + int64_t rhsSext = ((int64_t(RHS.VAL)) << (64-_AP_W1)) >> (64-_AP_W1); + return lhsSext < rhsSext; + } + + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// validity of the less-or-equal relationship. + /// @returns true if *this <= RHS when both are considered unsigned. + /// @brief Unsigned less or equal comparison + template INLINE bool ule(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return ult(RHS) || eq(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// validity of the less-or-equal relationship. + /// @returns true if *this <= RHS when both are considered signed. + /// @brief Signed less or equal comparison + template INLINE bool sle(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return slt(RHS) || eq(RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// the validity of the greater-than relationship. + /// @returns true if *this > RHS when both are considered unsigned. + /// @brief Unsigned greather than comparison + template INLINE bool ugt(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return !ult(RHS) && !eq(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// the validity of the greater-than relationship. + /// @returns true if *this > RHS when both are considered signed. + /// @brief Signed greather than comparison + template INLINE bool sgt(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return !slt(RHS) && !eq(RHS); + } + + /// Regards both *this and RHS as unsigned quantities and compares them for + /// validity of the greater-or-equal relationship. + /// @returns true if *this >= RHS when both are considered unsigned. + /// @brief Unsigned greater or equal comparison + template INLINE bool uge(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return !ult(RHS); + } + + /// Regards both *this and RHS as signed quantities and compares them for + /// validity of the greater-or-equal relationship. + /// @returns true if *this >= RHS when both are considered signed. + /// @brief Signed greather or equal comparison + template INLINE bool sge(const ap_private<_AP_W1, _AP_S1>& RHS) const { + return !slt(RHS); + } + + INLINE ap_private abs() const { + if (isNegative()) + return -(*this); + return *this; + } + + ap_private<_AP_W, false> get() const { + ap_private<_AP_W,false> ret(*this); + return ret; + } + + INLINE static uint32_t getBitsNeeded(const char* str, uint32_t slen, uint8_t radix) { + return _AP_W; + } + + INLINE uint32_t getActiveBits() const { + uint32_t bits=_AP_W - countLeadingZeros(); + return bits?bits:1; + } + + INLINE double roundToDouble(bool isSigned=false) const { + const static uint64_t mask = ~0ULL << (APINT_BITS_PER_WORD - _AP_W); + return double(VAL); + } + + INLINE unsigned length() const { return _AP_W; } + + /*Reverse the contents of ap_private instance. I.e. LSB becomes MSB and vise versa*/ + INLINE ap_private& reverse () { + for (int i = 0; i < _AP_W/2; ++i) { + bool tmp = operator[](i); + if (operator[](_AP_W - 1 - i)) + set(i); + else + clear(i); + if (tmp) + set(_AP_W - 1 - i); + else + clear(_AP_W - 1 - i); + } + clearUnusedBits(); + return *this; + } + + /*Return true if the value of ap_private instance is zero*/ + INLINE bool iszero () const { + return isMinValue(); + } + + /* x < 0 */ + INLINE bool sign () const { + if (isNegative()) + return true; + return false; + } + + /* x[i] = !x[i] */ + INLINE void invert (int i) { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + flip(i); + } + + /* x[i] */ + INLINE bool test (int i) const { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + return operator[](i); + } + + //This is used for sc_lv and sc_bv, which is implemented by sc_uint + //Rotate an ap_private object n places to the left + INLINE void lrotate(int n) { + assert( n >= 0 && "Attempting to shift negative index"); + assert( n < _AP_W && "Shift value larger than bit width"); + operator = (shl(n) | lshr(_AP_W - n)); + } + + //This is used for sc_lv and sc_bv, which is implemented by sc_uint + //Rotate an ap_private object n places to the right + INLINE void rrotate(int n) { + assert( n >= 0 && "Attempting to shift negative index"); + assert( n < _AP_W && "Shift value larger than bit width"); + operator = (lshr(n) | shl(_AP_W - n)); + } + + //Set the ith bit into v + INLINE void set (int i, bool v) { + assert( i >= 0 && "Attempting to write bit with negative index"); + assert( i < _AP_W && "Attempting to write bit beyond MSB"); + v ? set(i) : clear(i); + } + + //Set the ith bit into v + INLINE void set_bit (int i, bool v) { + assert( i >= 0 && "Attempting to write bit with negative index"); + assert( i < _AP_W && "Attempting to write bit beyond MSB"); + v ? set(i) : clear(i); + } + + //Get the value of ith bit + INLINE bool get_bit (int i) const { + assert( i >= 0 && "Attempting to read bit with negative index"); + assert( i < _AP_W && "Attempting to read bit beyond MSB"); + return operator [](i); + } + + //complements every bit + INLINE void b_not() { + flip(); + } + + //Binary Arithmetic + //----------------------------------------------------------- +#define OP_BIN_AP(Sym,Rty, Fun) \ + template \ + INLINE \ + typename RType<_AP_W2,_AP_S2>::Rty \ + operator Sym (const ap_private<_AP_W2,_AP_S2>& op) const { \ + typename RType<_AP_W2,_AP_S2>::Rty lhs(*this); \ + typename RType<_AP_W2,_AP_S2>::Rty rhs(op); \ + return lhs.Fun(rhs); \ + } \ + + ///Bitwise and, or, xor + //OP_BIN_AP(&,logic, And) + //OP_BIN_AP(|,logic, Or) + //OP_BIN_AP(^,logic, Xor) + +#undef OP_BIN_AP + template + INLINE typename RType<_AP_W2,_AP_S2>::div + operator / (const ap_private<_AP_W2,_AP_S2>&op) const { + ap_private lhs=ap_private(*this); + ap_private rhs=ap_private(op); + return typename RType<_AP_W2,_AP_S2>::div((_AP_S||_AP_S2)?lhs.sdiv(rhs):lhs.udiv(rhs)); + } + + + template + INLINE typename RType<_AP_W2,_AP_S2>::mod + operator % (const ap_private<_AP_W2,_AP_S2>&op) const { + ap_private lhs=*this; + ap_private rhs=op; + typename RType<_AP_W2,_AP_S2>::mod res = typename RType<_AP_W2,_AP_S2>::mod (_AP_S?lhs.srem(rhs):lhs.urem(rhs)); + return res; + } + + +#define OP_ASSIGN_AP_2(Sym) \ + template \ + INLINE ap_private<_AP_W, _AP_S>& operator Sym##=(const ap_private<_AP_W2,_AP_S2>& op) \ + { \ + *this=operator Sym (op); \ + return *this; \ + } \ + + OP_ASSIGN_AP_2(/) + OP_ASSIGN_AP_2(%) +#undef OP_ASSIGN_AP_2 + + ///Bitwise assign: and, or, xor + //------------------------------------------------------------- + // OP_ASSIGN_AP(&) + // OP_ASSIGN_AP(^) + // OP_ASSIGN_AP(|) +#undef OP_ASSIGN_AP +#if 1 + + template + INLINE ap_private<_AP_W, _AP_S> + operator << (const ap_private<_AP_W2, _AP_S2>& op2) const { + uint32_t sh=op2.to_uint(); + return *this << sh; + } + + INLINE ap_private<_AP_W, _AP_S> + operator << (uint32_t sh) const { + return shl(sh); + } + +#endif + + template + INLINE ap_private<_AP_W, _AP_S> + operator >> (const ap_private<_AP_W2, _AP_S2>& op2) const { + uint32_t sh = op2.to_uint(); + return *this >> sh; + } + + INLINE ap_private<_AP_W, _AP_S> + operator >>(uint32_t sh) const { + ap_private<_AP_W, _AP_S> r(*this); + bool overflow=(sh>=_AP_W); + bool neg_v=r.isNegative(); + if(_AP_S) { + if(overflow) + neg_v?r.set():r.clear(); + else + return r.ashr(sh); + } else { + if(overflow) + r.clear(); + else + return r.lshr(sh); + } + return r; + } + + ///Shift assign + //------------------------------------------------------------------ +#define OP_ASSIGN_AP_3_SINGLE(Sym) \ + template \ + INLINE ap_private<_AP_W, _AP_S>& operator Sym##=(const ap_private<_AP_W2,_AP_S2>& op) \ + { \ + *this=operator Sym (op.getVal()); \ + return *this; \ + } + OP_ASSIGN_AP_3_SINGLE(>>) +#undef OP_ASSIGN_AP_3_SINGLE + + ///Comparisons + //----------------------------------------------------------------- + template + INLINE bool operator != (const ap_private<_AP_W2, _AP_S2, 1>& op) const { + return !(*this==op); + } + + template + INLINE bool operator > (const ap_private<_AP_W2, _AP_S2, 1>& op) const { + return op < *this; + } + + template + INLINE bool operator <= (const ap_private<_AP_W2, _AP_S2, 1>& op) const { + return !(*this>op); + } + + template + INLINE bool operator < (const ap_private<_AP_W2, _AP_S2, 1>& op) const { + enum { _AP_MAX_W = AP_MAX(_AP_W+(_AP_S||_AP_S2),_AP_W2+(_AP_S||_AP_S2))}; + ap_private<_AP_MAX_W, _AP_S> lhs(*this); + ap_private<_AP_MAX_W, _AP_S2> rhs(op); + if (_AP_S == _AP_S2) + return _AP_S?lhs.slt(rhs):lhs.ult(rhs); + else if (_AP_W < 32 && _AP_W2 < 32) + return lhs.slt(rhs); + else + if (_AP_S) + if (_AP_W2 >= _AP_W) + return lhs.ult(rhs); + else + return lhs.slt(rhs); + else + if (_AP_W >= _AP_W2) + return lhs.ult(rhs); + else + return lhs.slt(rhs); + } + + template + INLINE bool operator >=(const ap_private<_AP_W2, _AP_S2, 1>& op) const { + return !(*this + INLINE bool operator == (const ap_private<_AP_W2, _AP_S2, _AP_N2>& op) const { + return op == *this; + } + + template + INLINE bool operator != (const ap_private<_AP_W2, _AP_S2, _AP_N2>& op) const { + return !(op==*this); + } + + template + INLINE bool operator > (const ap_private<_AP_W2, _AP_S2, _AP_N2>& op) const { + return op < (*this); + } + + template + INLINE bool operator <= (const ap_private<_AP_W2, _AP_S2, _AP_N2>& op) const { + return op >= *this; + } + + template + INLINE bool operator <(const ap_private<_AP_W2, _AP_S2, _AP_N2>& op) const { + return op > *this; + } + + template + INLINE bool operator >=(const ap_private<_AP_W2,_AP_S2,_AP_N2>& op) const { + return op <= *this; + } + ///Bit and Part Select + //-------------------------------------------------------------- + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (int Hi, int Lo) const { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(const_cast*>(this), Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + range (int Hi, int Lo) const { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>((const_cast*> (this)), Hi, Lo); + } + + INLINE ap_range_ref<_AP_W,_AP_S> + range (int Hi, int Lo) { + assert((Hi < _AP_W) && (Lo < _AP_W)&&"Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + range (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(this, Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + range (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + assert((Hi < _AP_W) && (Lo < _AP_W) && "Out of bounds in range()"); + return ap_range_ref<_AP_W,_AP_S>(const_cast(this), Hi, Lo); + } + + template + INLINE ap_range_ref<_AP_W,_AP_S> + operator () (const ap_private<_AP_W2, _AP_S2> &HiIdx, + const ap_private<_AP_W3, _AP_S3> &LoIdx) const { + int Hi = HiIdx.to_int(); + int Lo = LoIdx.to_int(); + return this->range(Hi, Lo); + } + + + INLINE ap_bit_ref<_AP_W,_AP_S> operator [] (uint32_t index) { + assert(index >= 0&&"Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S> (*this, (int)index); + } + + template + INLINE ap_bit_ref<_AP_W,_AP_S> operator [] (const ap_private<_AP_W2,_AP_S2> &index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index.to_int() ); + } + + template + INLINE bool operator [] (const ap_private<_AP_W2,_AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br =operator [] (index); + return br.to_bool(); + } + + INLINE ap_bit_ref<_AP_W,_AP_S> bit (int index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index ); + } + + template + INLINE ap_bit_ref<_AP_W,_AP_S> bit (const ap_private<_AP_W2,_AP_S2> &index) { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W &&"Attempting to read bit beyond MSB"); + return ap_bit_ref<_AP_W,_AP_S>( *this, index.to_int() ); + } + + INLINE bool bit (int index) const { + assert(index >= 0 && "Attempting to read bit with negative index"); + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br(const_cast*>(this), index); + return br.to_bool(); + } + + template + INLINE bool bit (const ap_private<_AP_W2,_AP_S2>& index) const { + assert(index < _AP_W && "Attempting to read bit beyond MSB"); + ap_bit_ref<_AP_W,_AP_S> br = bit(index); + return br.to_bool(); + } + + template + INLINE ap_concat_ref<_AP_W,ap_private<_AP_W, _AP_S>,_AP_W2,ap_private<_AP_W2,_AP_S2> > concat(const ap_private<_AP_W2,_AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_private<_AP_W2,_AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W,ap_private<_AP_W, _AP_S>,_AP_W2,ap_private<_AP_W2,_AP_S2> > concat(ap_private<_AP_W2,_AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_private<_AP_W2,_AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (const ap_private<_AP_W2, _AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(const_cast& >(*this), const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (const ap_private<_AP_W2, _AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(*this, const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(const_cast& >(*this), a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, _AP_S2> > + operator, (ap_private<_AP_W2, _AP_S2>& a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, ap_private<_AP_W2, + _AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (const ap_range_ref<_AP_W2, _AP_S2> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, ap_range_ref<_AP_W2, _AP_S2> > + operator, (ap_range_ref<_AP_W2, _AP_S2> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2, + ap_range_ref<_AP_W2, _AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (const ap_bit_ref<_AP_W2, _AP_S2> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, ap_bit_ref<_AP_W2, _AP_S2> > + operator, (ap_bit_ref<_AP_W2, _AP_S2> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, 1, + ap_bit_ref<_AP_W2, _AP_S2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &a2) const { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> > + operator, (ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> &a2) { + return ap_concat_ref<_AP_W, ap_private<_AP_W, _AP_S>, _AP_W2+_AP_W3, + ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) const { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (af_range_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_private, _AP_W2, af_range_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, a2); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (const af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) const { + return ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(const_cast& >(*this), + const_cast& >(a2)); + } + + template + INLINE ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> > + operator, (af_bit_ref<_AP_W2, _AP_I2, _AP_S2, _AP_Q2, + _AP_O2, _AP_N2> &a2) { + return ap_concat_ref<_AP_W, ap_private, 1, af_bit_ref<_AP_W2, + _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2> >(*this, a2); + } + + template + INLINE ap_private + operator & (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this & a2.get(); + } + + template + INLINE ap_private + operator | (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this | a2.get(); + } + + template + INLINE ap_private + operator ^ (const ap_concat_ref<_AP_W2, _AP_T2, _AP_W3, _AP_T3>& a2) { + return *this ^ a2.get(); + } + + + //Reduce operation + //----------------------------------------------------------- + INLINE bool and_reduce() const { + return (VAL & mask) == mask; + } + + INLINE bool nand_reduce() const { + return (VAL & mask) != mask; + } + + INLINE bool or_reduce() const { + return (bool)VAL; + } + + INLINE bool nor_reduce() const { + return VAL==0; + } + + INLINE bool xor_reduce() const { + unsigned int i=countPopulation(); + return (i%2)?true:false; + } + + INLINE bool xnor_reduce() const { + unsigned int i=countPopulation(); + return (i%2)?false:true; + } + + INLINE std::string to_string(uint8_t radix=2, bool sign=false) const { + return toString(radix, radix==10?_AP_S:sign); + } +}; +template +std::string ap_private<_AP_W, _AP_S, 1>::toString(uint8_t radix, bool wantSigned) const { + assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) && + "Radix should be 2, 8, 10, or 16!"); + static const char *digits[] = { + "0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f" + }; + std::string result; + if (radix != 10) { + // For the 2, 8 and 16 bit cases, we can just shift instead of divide + // because the number of bits per digit (1,3 and 4 respectively) divides + // equaly. We just shift until there value is zero. + + // First, check for a zero value and just short circuit the logic below. + if (*this == (uint64_t)(0)) + result = "0"; + else { + ap_private<_AP_W, false, 1> tmp(*this); + size_t insert_at = 0; + if (wantSigned && isNegative()) { + // They want to print the signed version and it is a negative value + // Flip the bits and add one to turn it into the equivalent positive + // value and put a '-' in the result. + tmp.flip(); + tmp++; + result = "-"; + insert_at = 1; + } + // Just shift tmp right for each digit width until it becomes zero + uint32_t shift = (radix == 16 ? 4 : (radix == 8 ? 3 : 1)); + uint64_t mask = radix - 1; + ap_private<_AP_W, false, 1> zero(0); + while (tmp.ne(zero)) { + unsigned digit = (unsigned)(tmp.VAL & mask); + result.insert(insert_at, digits[digit]); + tmp = tmp.lshr(shift); + } + } + return result; + } + + ap_private<_AP_W, false, 1> tmp(*this); + ap_private<6, false, 1> divisor(radix); + ap_private<_AP_W, _AP_S, 1> zero(0); + size_t insert_at = 0; + if (wantSigned && isNegative()) { + // They want to print the signed version and it is a negative value + // Flip the bits and add one to turn it into the equivalent positive + // value and put a '-' in the result. + tmp.flip(); + tmp++; + result = "-"; + insert_at = 1; + } + if (tmp == ap_private<_AP_W, false, 1>(0ULL)) + result = "0"; + else while (tmp.ne(zero)) { + ap_private<_AP_W, false, 1> APdigit = tmp%divisor; + ap_private<_AP_W, false, 1> tmp2 = tmp/divisor; + uint32_t digit = (uint32_t)(APdigit.getZExtValue()); + assert(digit < radix && "divide failed"); + result.insert(insert_at,digits[digit]); + tmp = tmp2; + } + return result; + +} + +#endif /* #ifndef LLVM_SUPPORT_MATHEXTRAS_H */ \ No newline at end of file diff --git a/hls_2018/router_05/main.cpp b/hls_2018/router_05/main.cpp new file mode 100755 index 0000000..60f08ea --- /dev/null +++ b/hls_2018/router_05/main.cpp @@ -0,0 +1,99 @@ +/** + * main.cpp + * + * for Vivado HLS + */ + +#ifdef SOFTWARE +#include "ap_int.h" +#else +#include +#endif + +#ifdef CALCTIME +#include +#include +#endif + +#include "router.hpp" + +#define PRINT_SOLUTION + + +int main(int argc, char *argv[]) { + using namespace std; + + // Test data // + // NL_Q00.txt + //char boardstr[BOARDSTR_SIZE] = "X10Y05Z3L0000107041L0004107002L0102102021L0900100003"; + // NL_Q06.txt + char boardstr[BOARDSTR_SIZE] = "X10Y18Z2L0900109002L0901105012L0902103052L0903103062L0904100102L0905106012L0906109022L0717109102L0808109112L0017209172L0401200072L0912208152L0009201092L0709209092L0901206052L0309204092L0701209072L0101201022L0011202152L0016202162"; + // NL_Q08.txt + //char boardstr[BOARDSTR_SIZE] = "X17Y20Z2L0000103022L1603115052L0916107032L0302108012L1104111042L1002100002L0919116162L1616113182L1001115012L0500201182L1603213152L0600210022"; + char boardstr_high[BOARDSTR_SIZE] = {}; + + // Read boardstr from command line + if (1 < argc) { + // From stdin + if(argv[1][0]!='X') + { + char* c_p=fgets(boardstr, BOARDSTR_SIZE, stdin); + int length=strlen(c_p); + boardstr[length-1]=0; + } + else + { + strcpy(boardstr, argv[1]); + } + } + + // Seed value + int seed = 12345; + if (2 < argc) { + seed = atoi(argv[2]); + } + +#ifdef PRINT_SOLUTION + int size_x = (boardstr[1] - '0') * 10 + (boardstr[2] - '0'); + int size_y = (boardstr[4] - '0') * 10 + (boardstr[5] - '0'); + int size_z = (boardstr[7] - '0'); +#endif + + // Solver + ap_int<32> status; + clock_t clock_start, clock_done; + clock_start = clock(); + bool result = pynqrouter(boardstr, boardstr_high, seed, &status); + clock_done = clock(); + if (result) { + cout << endl << "Test Passed!" << endl; + } else { + cout << endl << "Test Failed!" << endl; + } + cout << "status = " << (int)status << endl; + cout << "elapsed = " << ((double)(clock_done - clock_start) / CLOCKS_PER_SEC) << endl << endl; + +#ifdef PRINT_SOLUTION + cout << "SOLUTION" << endl; + cout << "========" << endl; + cout << "SIZE " << size_x << "X" << size_y << "X" << size_z << endl; + for (int z = 0; z < size_z; z++) { + cout << "LAYER " << (z + 1) << endl; + for (int y = 0; y < size_y; y++) { + for (int x = 0; x < size_x; x++) { + if (x != 0) { + cout << ","; + } + int i = ((x * MAX_WIDTH + y) << BITWIDTH_Z) | z; + unsigned int num = (unsigned char)(boardstr[i]) + ((unsigned char)(boardstr_high[i]) << 8); + cout << setfill('0') << setw(5) << right << num; + //cout << (unsigned int)(unsigned char)(boardstr[i]); + } + cout << endl; + } + } +#endif + + return 0; +} + diff --git a/hls_2018/router_05/router.cpp b/hls_2018/router_05/router.cpp new file mode 100755 index 0000000..d086860 --- /dev/null +++ b/hls_2018/router_05/router.cpp @@ -0,0 +1,457 @@ +/** + * router.cpp + * + * for Vivado HLS +*/ + +#ifdef SOFTWARE +#include "ap_int.h" +#else +#include +#endif + +#include "./router.hpp" + + + +static ap_uint<32> lfsr; + +void lfsr_random_init(ap_uint<32> seed) { + + lfsr = seed; +} + +ap_uint<32> lfsr_random() { + + bool b_32 = lfsr.get_bit(32-32); + bool b_22 = lfsr.get_bit(32-22); + bool b_2 = lfsr.get_bit(32-2); + bool b_1 = lfsr.get_bit(32-1); + bool new_bit = b_32 ^ b_22 ^ b_2 ^ b_1; + lfsr = lfsr >> 1; + lfsr.set_bit(31, new_bit); + + return lfsr.to_uint(); +} + + + +// Global values +static ap_uint<7> size_x; // X +static ap_uint<7> size_y; // Y +static ap_uint<4> size_z; // Z + +static ap_uint line_num = 0; // #Lines + +bool pynqrouter(char boardstr[BOARDSTR_SIZE], char boardstr_high[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *status) { +#pragma HLS INTERFACE s_axilite port=boardstr bundle=AXI4LS +#pragma HLS INTERFACE s_axilite port=boardstr_high bundle=AXI4LS +#pragma HLS INTERFACE s_axilite port=seed bundle=AXI4LS +#pragma HLS INTERFACE s_axilite port=status bundle=AXI4LS +#pragma HLS INTERFACE s_axilite port=return bundle=AXI4LS + + // status(0:Solved, 1:Not solved) + *status = -1; + + // board + ap_int board[MAX_CELLS]; // -1024 ~ 1023 (Negative values mean terminals) + INIT_BOARD_ARRAY: + for (ap_uint i = 0; i < (ap_uint)(BOARDSTR_SIZE); i++) { + board[i] = 0; + } + + + // ================================ + // (Step.0) Initialization (BEGIN) + // ================================ + + // Note: Loop counter -> need an extra bit (for condition determination) + + /// Parse /// + size_x = (boardstr[1] - '0') * 10 + (boardstr[2] - '0'); + size_y = (boardstr[4] - '0') * 10 + (boardstr[5] - '0'); + size_z = (boardstr[7] - '0'); + + INIT_BOARDS: + for (ap_uint idx = 8; idx < (ap_uint)(BOARDSTR_SIZE); idx+=11) { + + // NULL-terminated + if (boardstr[idx] == 0) break; + + line_num++; + + // Start & Goal of each line + ap_uint<7> s_x = (boardstr[idx+1] - '0') * 10 + (boardstr[idx+2] - '0'); + ap_uint<7> s_y = (boardstr[idx+3] - '0') * 10 + (boardstr[idx+4] - '0'); + ap_uint<3> s_z = (boardstr[idx+5] - '0') - 1; + ap_uint<7> g_x = (boardstr[idx+6] - '0') * 10 + (boardstr[idx+7] - '0'); + ap_uint<7> g_y = (boardstr[idx+8] - '0') * 10 + (boardstr[idx+9] - '0'); + ap_uint<3> g_z = (boardstr[idx+10] - '0') - 1; + + ap_uint start_id = (((ap_uint)s_x * MAX_WIDTH + (ap_uint)s_y) << BITWIDTH_Z) | (ap_uint)s_z; + ap_uint goal_id = (((ap_uint)g_x * MAX_WIDTH + (ap_uint)g_y) << BITWIDTH_Z) | (ap_uint)g_z; + board[start_id] = -line_num; + board[goal_id] = -line_num; + } + + // For each line + ap_uint connected_line_num = 0; + bool connected[MAX_LINES]; + INIT_CONNECTED: + for (ap_uint i = 1; i <= (ap_uint)(line_num); i++) { + connected[i] = false; + } + + lfsr_random_init(seed); + + // ================================ + // (Step.0) Initialization (END) + // ================================ + + + // ================================ + // (Step.2) Rip-up Routing (BEGIN) + // ================================ + +#ifdef DEBUG_PRINT + cout << "Routing ..." << endl; +#endif + + bool solved = false; + + ROUTING: + for (ap_uint<16> round = 0; round < 32768 ; round++) { +#pragma HLS LOOP_TRIPCOUNT min=1 max=32768 + + // Target line + ap_uint target = lfsr_random() % line_num + 1; + +#ifdef DEBUG_PRINT + cout << "(round " << round << ") LINE #" << (int)target << " " << lfsr_random() << endl; +#endif + + if (connected[target]) continue; + + if (connectable(board, target, 0)) { + connected[target] = true; connected_line_num++; + } + else { + ap_uint<16> j; + for (j = 0; j < 10000; j++) { + + // Ripped-up line + ap_uint rip_up = lfsr_random() % line_num + 1; + if (connectable(board, target, rip_up)) { + connected[target] = true; + connected[rip_up] = false; + break; + } + } + if (j == 10000) break; + } + if (connected_line_num == line_num) { + solved = true; + break; + } + } + + // Not solved + if (!solved) { + *status = 1; return false; + } + + // ================================ + // (Step.2) Rip-up Routing (END) + // ================================ + + + // ================================ + // (Step.3) Output (BEGIN) + // ================================ + +#ifdef DEBUG_PRINT + cout << "Output ..." << endl; +#endif + + // Init: Blank = 0 + OUTPUT_INIT: + for (ap_uint i = 0; i < (ap_uint)(MAX_CELLS); i++) { + + if (board[i] < 0) { + boardstr[i] = (unsigned char)(((-1) * board[i])); + boardstr_high[i] = (unsigned char)(((-1) * board[i]) >> 8); + } + else { + boardstr[i] = (unsigned char)((board[i])); + boardstr_high[i] = (unsigned char)((board[i]) >> 8); + } + } + + // ================================ + // (Step.3) Output (END) + // ================================ + + *status = 0; return true; +} + + +// ================================ // +// For Routing +// ================================ // + +bool inside_board(ap_uint cell_id) { + + ap_uint<13> cell_xy = (ap_uint<13>)(cell_id >> BITWIDTH_Z); + ap_uint<7> cell_x = (ap_uint<7>)(cell_xy / MAX_WIDTH); + ap_uint<7> cell_y = (ap_uint<7>)(cell_xy - cell_x * MAX_WIDTH); + ap_uint<3> cell_z = (ap_uint<3>)(cell_id & BITMASK_Z); + + bool ret = false; + if (cell_x < size_x && cell_y < size_y && cell_z < size_z) { + ret = true; + } + else { + ret = false; + } + + return ret; +} + +bool connectable(ap_int board[MAX_CELLS], ap_uint target, ap_uint rip_up) { + + ap_uint<2> avail[MAX_CELLS]; + ap_uint prev[MAX_CELLS]; + + ap_uint start_id = 65535, goal_id = 65535; + for (ap_uint i = 0; i < (ap_uint)(MAX_CELLS); i++) { + + if (!inside_board(i)) continue; + + prev[i] = 65535; // init. + + if (board[i] == target * (-1)) { + if (start_id == 65535) { + start_id = i; + avail[i] = 3; + } + else { + goal_id = i; + avail[i] = 0; + } + } + else if (board[i] == 0 || board[i] == rip_up || board[i] == target) { + avail[i] = 1; + } + else { + avail[i] = 0; + } + } + + bool try_connect = available(avail, prev, start_id, goal_id); + if (try_connect) { + if (rip_up > 0) { + remove_line(board, rip_up); + } + // Connect line for target + ap_uint id = prev[goal_id]; + BACKTRACK: + while (id != start_id) { + board[id] = target; id = prev[id]; + } + } + + return try_connect; +} + +void remove_line(ap_int board[MAX_CELLS], ap_uint rip_up) { + + for (ap_uint i = 0; i < (ap_uint)(MAX_CELLS); i++) { + + if (!inside_board(i)) continue; + if (board[i] == rip_up) board[i] = 0; + } +} + +bool available(ap_uint<2> avail[MAX_CELLS], ap_uint prev[MAX_CELLS], ap_uint start_id, ap_uint goal_id) { + + // Priority queue (Circular list) + ap_uint top = 1, bottom = 0; + bool is_empty = true; + ap_uint qu_nodes[MAX_PQ]; + + // Point of goal terminal + ap_uint<13> goal_xy = (ap_uint<13>)(goal_id >> BITWIDTH_Z); + ap_uint<7> goal_x = (ap_uint<7>)(goal_xy / MAX_WIDTH); + ap_uint<7> goal_y = (ap_uint<7>)(goal_xy - goal_x * MAX_WIDTH); + ap_uint<3> goal_z = (ap_uint<3>)(goal_id & BITMASK_Z); + + qu_push(qu_nodes, start_id, &top, &bottom, &is_empty); + + bool complete = false; + + SEARCH_QUEUE: + while (!is_empty) { +#pragma HLS LOOP_TRIPCOUNT min=1 max=1000 +#pragma HLS LOOP_FLATTEN off + + ap_uint src_id; // target cell + qu_pop(qu_nodes, &src_id, &top, &bottom, &is_empty); + + + // End routing + //if (avail[src_id] == -1) { complete = true; break; } // goal + + if (avail[src_id] != 1 && avail[src_id] != 3) continue; // Keep searching + + // Point of target cell + ap_uint<13> src_xy = (ap_uint<13>)(src_id >> BITWIDTH_Z); + ap_uint<7> src_x = (ap_uint<7>)(src_xy / MAX_WIDTH); + ap_uint<7> src_y = (ap_uint<7>)(src_xy - src_x * MAX_WIDTH); + ap_uint<3> src_z = (ap_uint<3>)(src_id & BITMASK_Z); + + ap_uint<3> isbranch = 0; + ap_uint tmp_dest_id = 65535; + // Search adjacent cells (1) + SEARCH_ADJACENTS_1: + for (ap_uint<3> a = 0; a < 6; a++) { + ap_int<8> dest_x = (ap_int<8>)src_x; // Min: -1, Max: 72 (Signed 8bit) + ap_int<8> dest_y = (ap_int<8>)src_y; // Min: -1, Max: 72 (Signed 8bit) + ap_int<5> dest_z = (ap_int<5>)src_z; // Min: -1, Max: 8 (Signed 5bit) + if (a == 0) { dest_x -= 1; } + if (a == 1) { dest_x += 1; } + if (a == 2) { dest_y -= 1; } + if (a == 3) { dest_y += 1; } + if (a == 4) { dest_z -= 1; } + if (a == 5) { dest_z += 1; } + + // Inside the board ? // + if (0 <= dest_x && dest_x < (ap_int<8>)size_x && 0 <= dest_y && dest_y < (ap_int<8>)size_y && 0 <= dest_z && dest_z < (ap_int<5>)size_z) { + + // Adjacent cell + ap_uint dest_id = (((ap_uint)dest_x * MAX_WIDTH + (ap_uint)dest_y) << BITWIDTH_Z) | (ap_uint)dest_z; + if (avail[dest_id] >= 2) { + isbranch++; + tmp_dest_id = dest_id; + } + } + } + if (isbranch > 1) { avail[src_id] = 0; continue; } + if (avail[src_id] == 1) { + avail[src_id] = 2; + prev[src_id] = tmp_dest_id; + } + + ap_uint<3> p = 0; + ap_uint<3> search_order[6]; + if (src_x > goal_x) { + search_order[p++] = 0; // To src_x-- + } + else { + search_order[5+p] = 0; + } + if (src_y > goal_y) { + search_order[p++] = 1; // To src_y-- + } + else { + search_order[4+p] = 1; + } + if (src_z > goal_z) { + search_order[p++] = 2; // To src_z-- + } + else { + search_order[3+p] = 2; + } + if (src_x < goal_x) { + search_order[p++] = 3; // To src_x++ + } + else { + search_order[2+p] = 3; + } + if (src_y < goal_y) { + search_order[p++] = 4; // To src_y++ + } + else { + search_order[1+p] = 4; + } + if (src_z < goal_z) { + search_order[p++] = 5; // To src_z++ + } + else { + search_order[0+p] = 5; + } + + ap_uint<3> j, t; + SHUFFLE_1: + for (ap_uint<3> a = 0; a < p; a++) { + j = lfsr_random() % p; + t = search_order[a]; + search_order[a] = search_order[j]; + search_order[j] = t; + } + SHUFFLE_2: + for (ap_uint<3> a = p; a < 6; a++) { + j = lfsr_random() % (6-p) + p; + t = search_order[a]; + search_order[a] = search_order[j]; + search_order[j] = t; + } + + //cout << "(" << src_x << ", " << src_y << ", " << src_z << ")->"; + //cout << "(" << goal_x << ", " << goal_y << ", " << goal_z << "): p = " << p << " ["; + //for (ap_uint<3> a = 0; a < 6; a++) { + // cout << search_order[a]; + // if (a != 5) cout << " "; + //} + //cout << "]" << endl; + + // Search adjacent cells (2) + SEARCH_ADJACENTS_2: + for (ap_uint<3> a = 0; a < 6; a++) { + ap_int<8> dest_x = (ap_int<8>)src_x; // Min: -1, Max: 72 (Signed 8bit) + ap_int<8> dest_y = (ap_int<8>)src_y; // Min: -1, Max: 72 (Signed 8bit) + ap_int<5> dest_z = (ap_int<5>)src_z; // Min: -1, Max: 8 (Signed 5bit) + if (search_order[5-a] == 0) { dest_x -= 1; } + if (search_order[5-a] == 1) { dest_y -= 1; } + if (search_order[5-a] == 2) { dest_z -= 1; } + if (search_order[5-a] == 3) { dest_x += 1; } + if (search_order[5-a] == 4) { dest_y += 1; } + if (search_order[5-a] == 5) { dest_z += 1; } + + // Inside the board ? // + if (0 <= dest_x && dest_x < (ap_int<8>)size_x && 0 <= dest_y && dest_y < (ap_int<8>)size_y && 0 <= dest_z && dest_z < (ap_int<5>)size_z) { + + // Adjacent cell + ap_uint dest_id = (((ap_uint)dest_x * MAX_WIDTH + (ap_uint)dest_y) << BITWIDTH_Z) | (ap_uint)dest_z; + if (dest_id == goal_id) { + prev[dest_id] = src_id; + complete = true; + } + qu_push(qu_nodes, dest_id, &top, &bottom, &is_empty); + } + } + if (complete) break; + } + + return complete; +} + +// Queue push (Enqueue) +// First In Last Out +void qu_push(ap_uint qu_nodes[MAX_PQ], ap_uint id, ap_uint *top, ap_uint *bottom, bool *is_empty) { +#pragma HLS INLINE + + (*bottom)++; + if ((*bottom) == (*top) && !(*is_empty)) { (*top)++; } // Queue is full -> First element is automatically removed + qu_nodes[(*bottom)] = id; + *is_empty = false; +} + +// Queue pop (Dequeue) +// First In Last Out +void qu_pop(ap_uint qu_nodes[MAX_PQ], ap_uint *id, ap_uint *top, ap_uint *bottom, bool *is_empty) { +#pragma HLS INLINE + + *id = qu_nodes[(*bottom)]; + (*bottom)--; + if (((*bottom)-(*top)+1) == 0) { *is_empty = true; } +} diff --git a/hls_2018/router_05/router.hpp b/hls_2018/router_05/router.hpp new file mode 100755 index 0000000..08d9363 --- /dev/null +++ b/hls_2018/router_05/router.hpp @@ -0,0 +1,53 @@ +/** + * router.hpp + * + * for Vivado HLS + */ + +#ifndef __ROUTER_HPP__ +#define __ROUTER_HPP__ + +#ifdef SOFTWARE +#include "ap_int.h" +#else +#include +#endif + +//#define DEBUG_PRINT // for debug + +#ifdef DEBUG_PRINT +using namespace std; +#endif + +// Parameters +#define MAX_WIDTH 72 // Max of X, Y +#define BITWIDTH_XY 13 +#define BITMASK_XY 65528 // 1111 1111 1111 1000 +#define MAX_LAYER 8 // Max of Z +#define BITWIDTH_Z 3 +#define BITMASK_Z 7 // 0000 0000 0000 0111 + +#define MAX_CELLS 41472 // Max #cells (16bit) +#define MAX_LINES 32768 // Max #lines (15bit) +#define MAX_PQ 16384 // Queue size (14bit) +#define MAX_BUFFER 16384 // Line buffer size (14bit) +#define CELL_BIT 16 +#define LINE_BIT 15 +#define PQ_BIT 14 +#define BUFF_BIT 14 + +#define BOARDSTR_SIZE 41472 // Size of I/O + +// For random num generation +void lfsr_random_init(ap_uint<32> seed); +ap_uint<32> lfsr_random(); + +bool pynqrouter(char boardstr[BOARDSTR_SIZE], char boardstr_high[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *status); +bool inside_board(ap_uint cell_id); +bool connectable(ap_int board[MAX_CELLS], ap_uint target, ap_uint rip_up); +void remove_line(ap_int board[MAX_CELLS], ap_uint rip_up); +bool available(ap_uint<2> avail[MAX_CELLS], ap_uint prev[MAX_CELLS], ap_uint start_id, ap_uint goal_id); +void qu_push(ap_uint qu_nodes[MAX_PQ], ap_uint id, ap_uint *top, ap_uint *bottom, bool *is_empty); +void qu_pop(ap_uint qu_nodes[MAX_PQ], ap_uint *id, ap_uint *top, ap_uint *bottom, bool *is_empty); + +#endif /* __ROUTER_HPP__ */ diff --git a/hls_2018/router_05/solver.c b/hls_2018/router_05/solver.c deleted file mode 100644 index ba77daa..0000000 --- a/hls_2018/router_05/solver.c +++ /dev/null @@ -1,317 +0,0 @@ -/* solver.c */ -/* Last Change: 2018/08/26 (Sun) 23:31:34. */ - -#define MAX_ATTEMPS 100000 - -#include -#include -#include -/* #include */ -/* #include */ -#include - -int board[8][72][72]={}; -int avail[8][72][72]={}; //start=3,path=2,avail=1,nonavail=0,goal=-1 -int connected[8*72*72/2+1]={}; //connected[0]=(number of connected lines) -int depth,height,width; -int goalx,goaly,goalz; -int lines; -//z,y,x - -void read(void){ //read problem - int x,y,z,i; - char c,str[8]; - scanf(" %s",str); //SIZE - scanf(" %d",&width); - if(width>72||width<=0) - printf("Error: width\n"); - scanf(" %c",&c); //X - scanf(" %d",&height); - if(height>72||height<=0) - printf("Error: height\n"); - scanf(" %c",&c); //X - scanf(" %d",&depth); - if(depth>8||depth<=0) - printf("Error: depth\n"); - scanf(" %s",str); //LINE_NUM - scanf(" %d",&lines); - if(lines<=0) - printf("Error: lines\n"); - for(i=1;i<=lines;i++){ - scanf(" %s",str); //LINE#X - scanf(" %c",&c); //( - scanf(" %d",&x); - if(x>=72||x<0) - printf("Error: x\n"); - scanf(" %c",&c); //, - scanf(" %d",&y); - if(y>=72||y<0) - printf("Error: y\n"); - scanf(" %c",&c); //, - scanf(" %d",&z); - if(z>=72||z<0) - printf("Error: z\n"); - scanf(" %c",&c); //) - board[z-1][y][x]=-i; - scanf("%c",&c); //) - /* scanf(" %[ -]",&c); //space or - */ - scanf(" %c",&c); //( - scanf(" %d",&x); - if(x>=72||x<0) - printf("Error: x\n"); - scanf(" %c",&c); //, - scanf(" %d",&y); - if(y>=72||y<0) - printf("Error: y\n"); - scanf(" %c",&c); //, - scanf(" %d",&z); - if(z>=72||z<0) - printf("Error: z\n"); - scanf(" %c",&c); //) - board[z-1][y][x]=-i; - } - return; -} - -int randline(void){ //return random line number - return rand()%lines+1; -} - -void shuffle(int array[],int start,int end){ - int i,j,t; - if(end==start) - return; - for(i=start;i0&&avail[nowz][nowy][nowx-1]>=2) - isbranch++; - if(nowy>0&&avail[nowz][nowy-1][nowx]>=2) - isbranch++; - if(nowz>0&&avail[nowz-1][nowy][nowx]>=2) - isbranch++; - if(nowx=2) - isbranch++; - if(nowy=2) - isbranch++; - if(nowz=2) - isbranch++; - if(isbranch>0){ - avail[nowz][nowy][nowx]=1; - return 0; - } - if(avail[nowz][nowy][nowx]==1) - avail[nowz][nowy][nowx]=2; - int i,src=0; - int searchorder[6]; //x+-,y+-,z+- - /* for(i=0;i<6;i++) */ - /* searchorder[i]=-1; */ - if(nowx>goalx){ - searchorder[src]=0; - src++; - }else - searchorder[5+src]=0; - if(nowy>goaly){ - searchorder[src]=1; - src++; - }else - searchorder[4+src]=1; - if(nowz>goalz){ - searchorder[src]=2; - src++; - }else - searchorder[3+src]=2; - if(nowx0&&available(nowx-1,nowy,nowz,0)) - return 1; - break; - case 1: - if(nowy>0&&available(nowx,nowy-1,nowz,0)) - return 1; - break; - case 2: - if(nowz>0&&available(nowx,nowy,nowz-1,0)) - return 1; - break; - case 3: - if(nowx